From: Stan Smith Date: Fri, 10 Sep 2010 20:46:58 +0000 (+0000) Subject: [BRANCHES] remove old version of opensm X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=722164a3ade32b5aa5be6bdd3e555a47119f0c9f;p=~shefty%2Frdma-win.git [BRANCHES] remove old version of opensm git-svn-id: svn://openib.tc.cornell.edu/gen1@2914 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/branches/opensm_3/dirs b/branches/opensm_3/dirs deleted file mode 100644 index db5a8974..00000000 --- a/branches/opensm_3/dirs +++ /dev/null @@ -1,2 +0,0 @@ -DIRS=\ - user diff --git a/branches/opensm_3/user/AUTHORS b/branches/opensm_3/user/AUTHORS deleted file mode 100644 index 7f5d6cb7..00000000 --- a/branches/opensm_3/user/AUTHORS +++ /dev/null @@ -1,9 +0,0 @@ - -By the chronological order of involvement: -Steve King, Intel -Anil Keshavamurthy, Intel -Eitan Zahavi, Mellanox Technologies, eitan@mellanox.co.il -Yael Kalka, Mellanox Technologies, yael@mellanox.co.il -Shahar Frank, Voltaire -Hal Rosenstock, Voltaire, halr@voltaire.com -Sasha Khapyorsky, Voltaire, sashak@voltaire.com diff --git a/branches/opensm_3/user/README b/branches/opensm_3/user/README deleted file mode 100644 index 55a837fe..00000000 --- a/branches/opensm_3/user/README +++ /dev/null @@ -1,25 +0,0 @@ -OpenSM README: --------------- - -OpenSM provides an implementation for an InfiniBand Subnet Manager and -Administrator. Such a software entity is required to run for in order -to initialize the InfiniBand hardware (at least one per each -InfiniBand subnet). - -The full list of OpenSM features is described in the user manual -provided in the doc sub directory. - -The installation of OpenSM includes: - -sbin/ - opensm - the SM/SA executable - osmtest - a test program for the SM/SA -lib/ - libosmcomp.{a,so} - component library with generic services and containers - libopensm.{a,so} - opensm services for logs and mad buffer pool - libosmvendor.{a,so} - interface to the user mad service of the driver -include/ - iba/ib_types.h - IBA types header file - complib/ - component library includes - vendor/ - vendor library includes - opensm/ - public opensm library includes diff --git a/branches/opensm_3/user/README.windows b/branches/opensm_3/user/README.windows deleted file mode 100644 index 99c8fc3e..00000000 --- a/branches/opensm_3/user/README.windows +++ /dev/null @@ -1,103 +0,0 @@ -OpenSM for Windows: last updated [5-27-10] --------------------------------------------------- - -OpenSM provides a user-mode implementation for an InfiniBand Subnet Manager and -Administrator. Such a software entity is required to run in order to -initialize the InfiniBand hardware (at least one per each InfiniBand subnet). - -The full list of OpenSM features is described in the user manual -provided in the doc sub directory. - -The installation of OpenSM includes: - -%ProgramFiles%\OFED\ - opensm.exe - the SM/SA executable - osmtest.exe - a test program for the SM/SA - -The standard OFED installation creates an OpenSM Windows Service which is -inactive by default. If one chooses the install feature 'Startup OpenSM' then -the OpenSM Windows Service is reset to start automatically at System boot. -Multiple OpenSM instances within a fabric are supported; the 1st OpenSM instance -will be the MASTER opensm, while others will be in STANDBY mode awaiting -the demise of the MASTER opensm instance. - - -Building opensm.exe, osmtest.exe from the SVN tree with MSFT WDK 7600+ ----------------------------------------------------------------------- - cd trunk\ulp\opensm - build /wg - - -OpenSM 3.3.6 status -------------- - -openSM 3.3.6 [vendor-IBAL] configured a 53 node HPC fabric runing Intel MPI regression tests. -All osmtests pass successfully; see 'opensm\user\scripts\osm-regress.bat'. - -The openSM as a service is functioning correctly; the OpenSM log file resides in -%TEMP\osm.log which translates to %windir%\temp\osm.log when run as a service. -Additionally %TEMP\osm.syslog or '%windir%\temp\osm.syslog', when run as a service, exists -as a high level record of OpenSM events; where osm.log contains more detailed information -which controlled by opensm.exe -V and/or -D command line switches. - -The log path is now static in definition as the usage output changed which no -longer allowed calls to GetTempPath(). In order to work around this fopen() -is actually a macro which redirects to Fopen(). The difference being Fopen() -will strdup_expand() the filename argument and then call the Windows version -of fopen(). This approach allows filenames like '%TEMP%\osm.log' to be properly -expanded and opened without excessive code changes to filenames. - -The osm vendor is 'IBAL' until UMAD QP1/SA interfaces are debugged. -The include file user\mad-vendor.inc define which osm vendor is being built/used. -Make sure all SOURCES files are using the same vendor! - - - -OpenSM Code Base ----------------- - -OpenSM src is based on the OFED management\opensm sources for the 3.3.6 release. - -Based-on implies the following build processes: - - If you use the [ANNOUNCE]'d management (OpenSM and infiniband diagnostics) - tarballs, the lex/yacc and config files are already constructed: - see http://www.openfabrics.org/downloads/management/ - (listed in http://www.openfabrics.org/downloads/management/latest.txt) - - otherwise - - From the OFED management maintainers git repository on a Linux system - 1) git clone git://git.openfabrics.org/~sashak/management - 2) cd management/libibumad; ./autogen.sh && ./configure && make - 3) cd management/libibmad; ./autogen.sh && ./configure && make - 4) cd management/opensm; ./autogen.sh && ./configure && make - 5) remove *.o *.po *.lo .deps/ .libs/ - 6) tar zcf ofed-mgmt.tgz management - 7) Move the ofed-mgmt.tgz tarball to a Windows system where current - Windows opensm src resides. - 8) unzip tar ball - 9) diff trunk\ulp\opensm management\opensm - - 10) Carefully apply/reject changes. - There are a few (<30) differing files which the OFED community - declined to accept due to Windows orientation; an ongoing story...sigh. - The bigger change blocks are found in the following files: - opensm\main.c OpenSM as a Windows service support. - opensm\console.c Windows console support without poll(). - libvendor\osm_vendor_al.c - Makefile(s) are Windows specific; leave'em be. - - 10) Due to the usage of Linux only tools AutoTools, lex & yacc, the - following files are static in the windows src. Static in the sense the - files are configured in the Linux environment with the resultant .c .h - files moved into the Windows opensm src tree. - Watch out for differing versions of yacc/bison/lex. The .y & .l files - are modified in the Windows src to emphasize changes required in the - .c & .h files; basically minor changes. - - a) management/opensm/opensm/osm_qow_parser_y.y - b) management/opensm/opensm/osm_qos_parser_l.l - c) management/opensm/opensm/configure.h - d) management/opensm/include/opensm/osm_version.h - diff --git a/branches/opensm_3/user/complib/README.txt b/branches/opensm_3/user/complib/README.txt deleted file mode 100644 index abc98b42..00000000 --- a/branches/opensm_3/user/complib/README.txt +++ /dev/null @@ -1,6 +0,0 @@ - - -******* DO NOT Confuse this complib\ with trunk\core\complib; trunk\core\complib\ and - trunk\inc\complib are the prefered versions and searched 1st. - -This complib\ exists only for OFED openSM code compatibility. \ No newline at end of file diff --git a/branches/opensm_3/user/complib/cl_dispatcher.c b/branches/opensm_3/user/complib/cl_dispatcher.c deleted file mode 100644 index d09c9b3c..00000000 --- a/branches/opensm_3/user/complib/cl_dispatcher.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of Dispatcher abstraction. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include - -/* give some guidance when we build our cl_pool of messages */ -#define CL_DISP_INITIAL_MSG_COUNT 256 -#define CL_DISP_MSG_GROW_SIZE 64 - -/* give some guidance when we build our cl_pool of registration elements */ -#define CL_DISP_INITIAL_REG_COUNT 16 -#define CL_DISP_REG_GROW_SIZE 16 - -/******************************************************************** - __cl_disp_worker - - Description: - This function takes messages off the FIFO and calls Processmsg() - This function executes as passive level. - - Inputs: - p_disp - Pointer to Dispatcher object - - Outputs: - None - - Returns: - None -********************************************************************/ -void __cl_disp_worker(IN void *context) -{ - cl_disp_msg_t *p_msg; - cl_dispatcher_t *p_disp = (cl_dispatcher_t *) context; - - cl_spinlock_acquire(&p_disp->lock); - - /* Process the FIFO until we drain it dry. */ - while (cl_qlist_count(&p_disp->msg_fifo)) { - /* Pop the message at the head from the FIFO. */ - p_msg = - (cl_disp_msg_t *) cl_qlist_remove_head(&p_disp->msg_fifo); - - /* we track the tim ethe last message spent in the queue */ - p_disp->last_msg_queue_time_us = - cl_get_time_stamp() - p_msg->in_time; - - /* - * Release the spinlock while the message is processed. - * The user's callback may reenter the dispatcher - * and cause the lock to be reaquired. - */ - cl_spinlock_release(&p_disp->lock); - p_msg->p_dest_reg->pfn_rcv_callback((void *)p_msg->p_dest_reg-> - context, - (void *)p_msg->p_data); - - cl_atomic_dec(&p_msg->p_dest_reg->ref_cnt); - - /* The client has seen the data. Notify the sender as appropriate. */ - if (p_msg->pfn_xmt_callback) { - p_msg->pfn_xmt_callback((void *)p_msg->context, - (void *)p_msg->p_data); - cl_atomic_dec(&p_msg->p_src_reg->ref_cnt); - } - - /* Grab the lock for the next iteration through the list. */ - cl_spinlock_acquire(&p_disp->lock); - - /* Return this message to the pool. */ - cl_qpool_put(&p_disp->msg_pool, (cl_pool_item_t *) p_msg); - } - - cl_spinlock_release(&p_disp->lock); -} - -void cl_disp_construct(IN cl_dispatcher_t * const p_disp) -{ - CL_ASSERT(p_disp); - - cl_qlist_init(&p_disp->reg_list); - cl_ptr_vector_construct(&p_disp->reg_vec); - cl_qlist_init(&p_disp->msg_fifo); - cl_spinlock_construct(&p_disp->lock); - cl_qpool_construct(&p_disp->msg_pool); -} - -void cl_disp_shutdown(IN cl_dispatcher_t * const p_disp) -{ - CL_ASSERT(p_disp); - - /* Stop the thread pool. */ - cl_thread_pool_destroy(&p_disp->worker_threads); - - /* Process all outstanding callbacks. */ - __cl_disp_worker(p_disp); - - /* Free all registration info. */ - while (!cl_is_qlist_empty(&p_disp->reg_list)) - free(cl_qlist_remove_head(&p_disp->reg_list)); -} - -void cl_disp_destroy(IN cl_dispatcher_t * const p_disp) -{ - CL_ASSERT(p_disp); - - cl_spinlock_destroy(&p_disp->lock); - /* Destroy the message pool */ - cl_qpool_destroy(&p_disp->msg_pool); - /* Destroy the pointer vector of registrants. */ - cl_ptr_vector_destroy(&p_disp->reg_vec); -} - -cl_status_t cl_disp_init(IN cl_dispatcher_t * const p_disp, - IN const uint32_t thread_count, - IN const char *const name) -{ - cl_status_t status; - - CL_ASSERT(p_disp); - - cl_disp_construct(p_disp); - - status = cl_spinlock_init(&p_disp->lock); - if (status != CL_SUCCESS) { - cl_disp_destroy(p_disp); - return (status); - } - - /* Specify no upper limit to the number of messages in the pool */ - status = cl_qpool_init(&p_disp->msg_pool, CL_DISP_INITIAL_MSG_COUNT, - 0, CL_DISP_MSG_GROW_SIZE, sizeof(cl_disp_msg_t), - NULL, NULL, NULL); - if (status != CL_SUCCESS) { - cl_disp_destroy(p_disp); - return (status); - } - - status = cl_ptr_vector_init(&p_disp->reg_vec, CL_DISP_INITIAL_REG_COUNT, - CL_DISP_REG_GROW_SIZE); - if (status != CL_SUCCESS) { - cl_disp_destroy(p_disp); - return (status); - } - - status = cl_thread_pool_init(&p_disp->worker_threads, thread_count, - __cl_disp_worker, p_disp, name); - if (status != CL_SUCCESS) - cl_disp_destroy(p_disp); - - return (status); -} - -cl_disp_reg_handle_t cl_disp_register(IN cl_dispatcher_t * const p_disp, - IN const cl_disp_msgid_t msg_id, - IN cl_pfn_msgrcv_cb_t pfn_callback - OPTIONAL, - IN const void *const context OPTIONAL) -{ - cl_disp_reg_info_t *p_reg; - cl_status_t status; - - CL_ASSERT(p_disp); - - /* Check that the requested registrant ID is available. */ - cl_spinlock_acquire(&p_disp->lock); - if ((msg_id != CL_DISP_MSGID_NONE) && - (msg_id < cl_ptr_vector_get_size(&p_disp->reg_vec)) && - (cl_ptr_vector_get(&p_disp->reg_vec, msg_id))) { - cl_spinlock_release(&p_disp->lock); - return (NULL); - } - - /* Get a registration info from the pool. */ - p_reg = (cl_disp_reg_info_t *) malloc(sizeof(cl_disp_reg_info_t)); - if (!p_reg) { - cl_spinlock_release(&p_disp->lock); - return (NULL); - } else { - memset(p_reg, 0, sizeof(cl_disp_reg_info_t)); - } - - p_reg->p_disp = p_disp; - p_reg->ref_cnt = 0; - p_reg->pfn_rcv_callback = pfn_callback; - p_reg->context = context; - p_reg->msg_id = msg_id; - - /* Insert the registration in the list. */ - cl_qlist_insert_tail(&p_disp->reg_list, (cl_list_item_t *) p_reg); - - /* Set the array entry to the registrant. */ - /* The ptr_vector grow automatically as necessary. */ - if (msg_id != CL_DISP_MSGID_NONE) { - status = cl_ptr_vector_set(&p_disp->reg_vec, msg_id, p_reg); - if (status != CL_SUCCESS) { - free(p_reg); - cl_spinlock_release(&p_disp->lock); - return (NULL); - } - } - - cl_spinlock_release(&p_disp->lock); - - return (p_reg); -} - -void cl_disp_unregister(IN const cl_disp_reg_handle_t handle) -{ - cl_disp_reg_info_t *p_reg; - cl_dispatcher_t *p_disp; - - if (handle == CL_DISP_INVALID_HANDLE) - return; - - p_reg = (cl_disp_reg_info_t *) handle; - p_disp = p_reg->p_disp; - CL_ASSERT(p_disp); - - cl_spinlock_acquire(&p_disp->lock); - /* - * Clear the registrant vector entry. This will cause any further - * post calls to fail. - */ - if (p_reg->msg_id != CL_DISP_MSGID_NONE) { - CL_ASSERT(p_reg->msg_id < - cl_ptr_vector_get_size(&p_disp->reg_vec)); - cl_ptr_vector_set(&p_disp->reg_vec, p_reg->msg_id, NULL); - } - cl_spinlock_release(&p_disp->lock); - - while (p_reg->ref_cnt > 0) - cl_thread_suspend(1); - - cl_spinlock_acquire(&p_disp->lock); - /* Remove the registrant from the list. */ - cl_qlist_remove_item(&p_disp->reg_list, (cl_list_item_t *) p_reg); - /* Return the registration info to the pool */ - free(p_reg); - - cl_spinlock_release(&p_disp->lock); -} - -cl_status_t cl_disp_post(IN const cl_disp_reg_handle_t handle, - IN const cl_disp_msgid_t msg_id, - IN const void *const p_data, - IN cl_pfn_msgdone_cb_t pfn_callback OPTIONAL, - IN const void *const context OPTIONAL) -{ - cl_disp_reg_info_t *p_src_reg = (cl_disp_reg_info_t *) handle; - cl_disp_reg_info_t *p_dest_reg; - cl_dispatcher_t *p_disp; - cl_disp_msg_t *p_msg; - - p_disp = handle->p_disp; - CL_ASSERT(p_disp); - CL_ASSERT(msg_id != CL_DISP_MSGID_NONE); - - cl_spinlock_acquire(&p_disp->lock); - /* Check that the recipient exists. */ - p_dest_reg = cl_ptr_vector_get(&p_disp->reg_vec, msg_id); - if (!p_dest_reg) { - cl_spinlock_release(&p_disp->lock); - return (CL_NOT_FOUND); - } - - /* Get a free message from the pool. */ - p_msg = (cl_disp_msg_t *) cl_qpool_get(&p_disp->msg_pool); - if (!p_msg) { - cl_spinlock_release(&p_disp->lock); - return (CL_INSUFFICIENT_MEMORY); - } - - /* Initialize the message */ - p_msg->p_src_reg = p_src_reg; - p_msg->p_dest_reg = p_dest_reg; - p_msg->p_data = p_data; - p_msg->pfn_xmt_callback = pfn_callback; - p_msg->context = context; - p_msg->in_time = cl_get_time_stamp(); - - /* - * Increment the sender's reference count if they request a completion - * notification. - */ - if (pfn_callback) - cl_atomic_inc(&p_src_reg->ref_cnt); - - /* Increment the recipient's reference count. */ - cl_atomic_inc(&p_dest_reg->ref_cnt); - - /* Queue the message in the FIFO. */ - cl_qlist_insert_tail(&p_disp->msg_fifo, (cl_list_item_t *) p_msg); - cl_spinlock_release(&p_disp->lock); - - /* Signal the thread pool that there is work to be done. */ - cl_thread_pool_signal(&p_disp->worker_threads); - return (CL_SUCCESS); -} - -void cl_disp_get_queue_status(IN const cl_disp_reg_handle_t handle, - OUT uint32_t * p_num_queued_msgs, - OUT uint64_t * p_last_msg_queue_time_ms) -{ - cl_dispatcher_t *p_disp = ((cl_disp_reg_info_t *) handle)->p_disp; - - cl_spinlock_acquire(&p_disp->lock); - - if (p_last_msg_queue_time_ms) - *p_last_msg_queue_time_ms = - p_disp->last_msg_queue_time_us / 1000; - - if (p_num_queued_msgs) - *p_num_queued_msgs = cl_qlist_count(&p_disp->msg_fifo); - - cl_spinlock_release(&p_disp->lock); -} diff --git a/branches/opensm_3/user/complib/cl_event_wheel.c b/branches/opensm_3/user/complib/cl_event_wheel.c deleted file mode 100644 index 03e27b36..00000000 --- a/branches/opensm_3/user/complib/cl_event_wheel.c +++ /dev/null @@ -1,566 +0,0 @@ -/* - * Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include - -#define CL_DBG(fmt, ...) - -static cl_status_t __event_will_age_before(IN const cl_list_item_t * - const p_list_item, IN void *context) -{ - uint64_t aging_time = *((uint64_t *) context); - cl_event_wheel_reg_info_t *p_event; - - p_event = - PARENT_STRUCT(p_list_item, cl_event_wheel_reg_info_t, list_item); - - if (p_event->aging_time < aging_time) - return CL_SUCCESS; - else - return CL_NOT_FOUND; -} - -static void __cl_event_wheel_callback(IN void *context) -{ - cl_event_wheel_t *p_event_wheel = (cl_event_wheel_t *) context; - cl_list_item_t *p_list_item, *p_prev_event_list_item; - cl_list_item_t *p_list_next_item; - cl_event_wheel_reg_info_t *p_event; - uint64_t current_time; - uint64_t next_aging_time; - uint32_t new_timeout; - cl_status_t cl_status; - - /* might be during closing ... */ - if (p_event_wheel->closing) - return; - - current_time = cl_get_time_stamp(); - - if (NULL != p_event_wheel->p_external_lock) - - /* Take care of the order of acquiring locks to avoid the deadlock! - * The external lock goes first. - */ - cl_spinlock_acquire(p_event_wheel->p_external_lock); - - cl_spinlock_acquire(&p_event_wheel->lock); - - p_list_item = cl_qlist_head(&p_event_wheel->events_wheel); - if (p_list_item == cl_qlist_end(&p_event_wheel->events_wheel)) - /* the list is empty - nothing to do */ - goto Exit; - - /* we found such an item. get the p_event */ - p_event = - PARENT_STRUCT(p_list_item, cl_event_wheel_reg_info_t, list_item); - - while (p_event->aging_time <= current_time) { - /* this object has aged - invoke it's callback */ - if (p_event->pfn_aged_callback) - next_aging_time = - p_event->pfn_aged_callback(p_event->key, - p_event->num_regs, - p_event->context); - else - next_aging_time = 0; - - /* point to the next object in the wheel */ - p_list_next_item = cl_qlist_next(p_list_item); - - /* We need to retire the event if the next aging time passed */ - if (next_aging_time < current_time) { - /* remove it from the map */ - cl_qmap_remove_item(&p_event_wheel->events_map, - &(p_event->map_item)); - - /* pop p_event from the wheel */ - cl_qlist_remove_head(&p_event_wheel->events_wheel); - - /* delete the event info object - allocated by cl_event_wheel_reg */ - free(p_event); - } else { - /* update the required aging time */ - p_event->aging_time = next_aging_time; - p_event->num_regs++; - - /* do not remove from the map - but remove from the list head and - place in the correct position */ - - /* pop p_event from the wheel */ - cl_qlist_remove_head(&p_event_wheel->events_wheel); - - /* find the event that ages just before */ - p_prev_event_list_item = - cl_qlist_find_from_tail(&p_event_wheel-> - events_wheel, - __event_will_age_before, - &p_event->aging_time); - - /* insert just after */ - cl_qlist_insert_next(&p_event_wheel->events_wheel, - p_prev_event_list_item, - &p_event->list_item); - - /* as we have modified the list - restart from first item: */ - p_list_next_item = - cl_qlist_head(&p_event_wheel->events_wheel); - } - - /* advance to next event */ - p_list_item = p_list_next_item; - if (p_list_item == cl_qlist_end(&p_event_wheel->events_wheel)) - /* the list is empty - nothing to do */ - break; - - /* get the p_event */ - p_event = - PARENT_STRUCT(p_list_item, cl_event_wheel_reg_info_t, - list_item); - } - - /* We need to restart the timer only if the list is not empty now */ - if (p_list_item != cl_qlist_end(&p_event_wheel->events_wheel)) { - /* get the p_event */ - p_event = - PARENT_STRUCT(p_list_item, cl_event_wheel_reg_info_t, - list_item); - - /* start the timer to the timeout [msec] */ - new_timeout = - (uint32_t) (((p_event->aging_time - current_time) / 1000) + - 0.5); - CL_DBG("__cl_event_wheel_callback: Restart timer in: " - "%u [msec]\n", new_timeout); - cl_status = cl_timer_start(&p_event_wheel->timer, new_timeout); - if (cl_status != CL_SUCCESS) { - CL_DBG("__cl_event_wheel_callback : ERR 6100: " - "Failed to start timer\n"); - } - } - - /* release the lock */ -Exit: - cl_spinlock_release(&p_event_wheel->lock); - if (NULL != p_event_wheel->p_external_lock) - cl_spinlock_release(p_event_wheel->p_external_lock); -} - -/* - * Construct and Initialize - */ -void cl_event_wheel_construct(IN cl_event_wheel_t * const p_event_wheel) -{ - cl_spinlock_construct(&(p_event_wheel->lock)); - cl_timer_construct(&(p_event_wheel->timer)); -} - -cl_status_t cl_event_wheel_init(IN cl_event_wheel_t * const p_event_wheel) -{ - cl_status_t cl_status = CL_SUCCESS; - - /* initialize */ - p_event_wheel->p_external_lock = NULL; - p_event_wheel->closing = FALSE; - cl_status = cl_spinlock_init(&(p_event_wheel->lock)); - if (cl_status != CL_SUCCESS) - return cl_status; - cl_qlist_init(&p_event_wheel->events_wheel); - cl_qmap_init(&p_event_wheel->events_map); - - /* init the timer with timeout */ - cl_status = cl_timer_init(&p_event_wheel->timer, __cl_event_wheel_callback, p_event_wheel); /* cb context */ - - return cl_status; -} - -cl_status_t cl_event_wheel_init_ex(IN cl_event_wheel_t * const p_event_wheel, - IN cl_spinlock_t * p_external_lock) -{ - cl_status_t cl_status; - - cl_status = cl_event_wheel_init(p_event_wheel); - if (CL_SUCCESS != cl_status) - return cl_status; - - p_event_wheel->p_external_lock = p_external_lock; - return cl_status; -} - -void cl_event_wheel_dump(IN cl_event_wheel_t * const p_event_wheel) -{ - cl_list_item_t *p_list_item; - cl_event_wheel_reg_info_t *p_event; - - p_list_item = cl_qlist_head(&p_event_wheel->events_wheel); - - while (p_list_item != cl_qlist_end(&p_event_wheel->events_wheel)) { - p_event = - PARENT_STRUCT(p_list_item, cl_event_wheel_reg_info_t, - list_item); - CL_DBG("cl_event_wheel_dump: Found event key:<0x%" - PRIx64 ">, aging time:%" PRIu64 "\n", - p_event->key, p_event->aging_time); - p_list_item = cl_qlist_next(p_list_item); - } -} - -void cl_event_wheel_destroy(IN cl_event_wheel_t * const p_event_wheel) -{ - cl_list_item_t *p_list_item; - cl_map_item_t *p_map_item; - cl_event_wheel_reg_info_t *p_event; - - /* we need to get a lock */ - cl_spinlock_acquire(&p_event_wheel->lock); - - cl_event_wheel_dump(p_event_wheel); - - /* go over all the items in the list and remove them */ - p_list_item = cl_qlist_remove_head(&p_event_wheel->events_wheel); - while (p_list_item != cl_qlist_end(&p_event_wheel->events_wheel)) { - p_event = - PARENT_STRUCT(p_list_item, cl_event_wheel_reg_info_t, - list_item); - - CL_DBG("cl_event_wheel_destroy: Found outstanding event" - " key:<0x%" PRIx64 ">\n", p_event->key); - - /* remove it from the map */ - p_map_item = &(p_event->map_item); - cl_qmap_remove_item(&p_event_wheel->events_map, p_map_item); - free(p_event); /* allocated by cl_event_wheel_reg */ - p_list_item = - cl_qlist_remove_head(&p_event_wheel->events_wheel); - } - - /* destroy the timer */ - cl_timer_destroy(&p_event_wheel->timer); - - /* destroy the lock (this should be done without releasing - we don't want - any other run to grab the lock at this point. */ - cl_spinlock_release(&p_event_wheel->lock); - cl_spinlock_destroy(&(p_event_wheel->lock)); -} - -cl_status_t cl_event_wheel_reg(IN cl_event_wheel_t * const p_event_wheel, - IN const uint64_t key, - IN const uint64_t aging_time_usec, - IN cl_pfn_event_aged_cb_t pfn_callback, - IN void *const context) -{ - cl_event_wheel_reg_info_t *p_event; - uint64_t timeout; - uint32_t to; - cl_status_t cl_status = CL_SUCCESS; - cl_list_item_t *prev_event_list_item; - cl_map_item_t *p_map_item; - - /* Get the lock on the manager */ - cl_spinlock_acquire(&(p_event_wheel->lock)); - - cl_event_wheel_dump(p_event_wheel); - - /* Make sure such a key does not exists */ - p_map_item = cl_qmap_get(&p_event_wheel->events_map, key); - if (p_map_item != cl_qmap_end(&p_event_wheel->events_map)) { - CL_DBG("cl_event_wheel_reg: Already exists key:0x%" - PRIx64 "\n", key); - - /* already there - remove it from the list as it is getting a new time */ - p_event = - PARENT_STRUCT(p_map_item, cl_event_wheel_reg_info_t, - map_item); - - /* remove the item from the qlist */ - cl_qlist_remove_item(&p_event_wheel->events_wheel, - &p_event->list_item); - /* and the qmap */ - cl_qmap_remove_item(&p_event_wheel->events_map, - &p_event->map_item); - } else { - /* make a new one */ - p_event = (cl_event_wheel_reg_info_t *) - malloc(sizeof(cl_event_wheel_reg_info_t)); - p_event->num_regs = 0; - } - - p_event->key = key; - p_event->aging_time = aging_time_usec; - p_event->pfn_aged_callback = pfn_callback; - p_event->context = context; - p_event->num_regs++; - - CL_DBG("cl_event_wheel_reg: Registering event key:0x%" PRIx64 - " aging in %u [msec]\n", p_event->key, - (uint32_t) ((p_event->aging_time - cl_get_time_stamp()) / 1000)); - - /* If the list is empty - need to start the timer */ - if (cl_is_qlist_empty(&p_event_wheel->events_wheel)) { - /* Edward Bortnikov 03/29/2003 - * ++TBD Consider moving the timer manipulation behind the list manipulation. - */ - - /* calculate the new timeout */ - timeout = - (p_event->aging_time - cl_get_time_stamp() + 500) / 1000; - - /* stop the timer if it is running */ - - /* Edward Bortnikov 03/29/2003 - * Don't call cl_timer_stop() because it spins forever. - * cl_timer_start() will invoke cl_timer_stop() by itself. - * - * The problematic scenario is when __cl_event_wheel_callback() - * is in race condition with this code. It sets timer.in_timer_cb - * to TRUE and then blocks on p_event_wheel->lock. Following this, - * the call to cl_timer_stop() hangs. Following this, the whole system - * enters into a deadlock. - * - * cl_timer_stop(&p_event_wheel->timer); - */ - - /* The timeout for the cl_timer_start should be given as uint32_t. - if there is an overflow - warn about it. */ - to = (uint32_t) timeout; - if (timeout > (uint32_t) timeout) { - to = 0xffffffff; /* max 32 bit timer */ - CL_DBG("cl_event_wheel_reg: timeout requested is " - "too large. Using timeout: %u\n", to); - } - - /* start the timer to the timeout [msec] */ - cl_status = cl_timer_start(&p_event_wheel->timer, to); - if (cl_status != CL_SUCCESS) { - CL_DBG("cl_event_wheel_reg : ERR 6103: " - "Failed to start timer\n"); - goto Exit; - } - } - - /* insert the object to the qlist and the qmap */ - - /* BUT WE MUST INSERT IT IN A SORTED MANNER */ - prev_event_list_item = - cl_qlist_find_from_tail(&p_event_wheel->events_wheel, - __event_will_age_before, - &p_event->aging_time); - - cl_qlist_insert_next(&p_event_wheel->events_wheel, - prev_event_list_item, &p_event->list_item); - - cl_qmap_insert(&p_event_wheel->events_map, key, &(p_event->map_item)); - -Exit: - cl_spinlock_release(&p_event_wheel->lock); - - return cl_status; -} - -void cl_event_wheel_unreg(IN cl_event_wheel_t * const p_event_wheel, - IN uint64_t key) -{ - cl_event_wheel_reg_info_t *p_event; - cl_map_item_t *p_map_item; - - CL_DBG("cl_event_wheel_unreg: " "Removing key:0x%" PRIx64 "\n", key); - - cl_spinlock_acquire(&p_event_wheel->lock); - p_map_item = cl_qmap_get(&p_event_wheel->events_map, key); - if (p_map_item != cl_qmap_end(&p_event_wheel->events_map)) { - /* we found such an item. */ - p_event = - PARENT_STRUCT(p_map_item, cl_event_wheel_reg_info_t, - map_item); - - /* remove the item from the qlist */ - cl_qlist_remove_item(&p_event_wheel->events_wheel, - &(p_event->list_item)); - /* remove the item from the qmap */ - cl_qmap_remove_item(&p_event_wheel->events_map, - &(p_event->map_item)); - - CL_DBG("cl_event_wheel_unreg: Removed key:0x%" PRIx64 "\n", - key); - - /* free the item */ - free(p_event); - } else { - CL_DBG("cl_event_wheel_unreg: did not find key:0x%" PRIx64 - "\n", key); - } - - cl_spinlock_release(&p_event_wheel->lock); -} - -uint32_t cl_event_wheel_num_regs(IN cl_event_wheel_t * const p_event_wheel, - IN uint64_t key) -{ - - cl_event_wheel_reg_info_t *p_event; - cl_map_item_t *p_map_item; - uint32_t num_regs = 0; - - /* try to find the key in the map */ - CL_DBG("cl_event_wheel_num_regs: Looking for key:0x%" PRIx64 "\n", key); - - cl_spinlock_acquire(&p_event_wheel->lock); - p_map_item = cl_qmap_get(&p_event_wheel->events_map, key); - if (p_map_item != cl_qmap_end(&p_event_wheel->events_map)) { - /* ok so we can simply return it's num_regs */ - p_event = - PARENT_STRUCT(p_map_item, cl_event_wheel_reg_info_t, - map_item); - num_regs = p_event->num_regs; - } - - cl_spinlock_release(&p_event_wheel->lock); - return (num_regs); -} - -#ifdef __CL_EVENT_WHEEL_TEST__ - -/* Dump out the complete state of the event wheel */ -void __cl_event_wheel_dump(IN cl_event_wheel_t * const p_event_wheel) -{ - cl_list_item_t *p_list_item; - cl_map_item_t *p_map_item; - cl_event_wheel_reg_info_t *p_event; - - printf("************** Event Wheel Dump ***********************\n"); - printf("Event Wheel List has %u items:\n", - cl_qlist_count(&p_event_wheel->events_wheel)); - - p_list_item = cl_qlist_head(&p_event_wheel->events_wheel); - while (p_list_item != cl_qlist_end(&p_event_wheel->events_wheel)) { - p_event = - PARENT_STRUCT(p_list_item, cl_event_wheel_reg_info_t, - list_item); - printf("Event key:0x%" PRIx64 " Context:%s NumRegs:%u\n", - p_event->key, (char *)p_event->context, - p_event->num_regs); - - /* next */ - p_list_item = cl_qlist_next(p_list_item); - } - - printf("Event Map has %u items:\n", - cl_qmap_count(&p_event_wheel->events_map)); - - p_map_item = cl_qmap_head(&p_event_wheel->events_map); - while (p_map_item != cl_qmap_end(&p_event_wheel->events_map)) { - p_event = - PARENT_STRUCT(p_map_item, cl_event_wheel_reg_info_t, - map_item); - printf("Event key:0x%" PRIx64 " Context:%s NumRegs:%u\n", - p_event->key, (char *)p_event->context, - p_event->num_regs); - - /* next */ - p_map_item = cl_qmap_next(p_map_item); - } - -} - -/* The callback for aging event */ -/* We assume we pass a text context */ -void __test_event_aging(uint64_t key, void *context) -{ - printf("*****************************************************\n"); - printf("Aged key: 0x%" PRIx64 " Context:%s\n", key, (char *)context); -} - -int main() -{ - cl_event_wheel_t event_wheel; - /* uint64_t key; */ - - /* construct */ - cl_event_wheel_construct(&event_wheel); - - /* init */ - cl_event_wheel_init(&event_wheel); - - /* Start Playing */ - cl_event_wheel_reg(&event_wheel, 1, /* key */ - cl_get_time_stamp() + 3000000, /* 3 sec lifetime */ - __test_event_aging, /* cb */ - "The first Aging Event"); - - cl_event_wheel_reg(&event_wheel, 2, /* key */ - cl_get_time_stamp() + 3000000, /* 3 sec lifetime */ - __test_event_aging, /* cb */ - "The Second Aging Event"); - - cl_event_wheel_reg(&event_wheel, 3, /* key */ - cl_get_time_stamp() + 3500000, /* 3 sec lifetime */ - __test_event_aging, /* cb */ - "The Third Aging Event"); - - __cl_event_wheel_dump(&event_wheel); - - sleep(2); - cl_event_wheel_reg(&event_wheel, 2, /* key */ - cl_get_time_stamp() + 8000000, /* 3 sec lifetime */ - __test_event_aging, /* cb */ - "The Second Aging Event Moved"); - - __cl_event_wheel_dump(&event_wheel); - - sleep(1); - /* remove the third event */ - cl_event_wheel_unreg(&event_wheel, 3); /* key */ - - /* get the number of registrations for the keys */ - printf("Event 1 Registered: %u\n", - cl_event_wheel_num_regs(&event_wheel, 1)); - printf("Event 2 Registered: %u\n", - cl_event_wheel_num_regs(&event_wheel, 2)); - - sleep(5); - /* destroy */ - cl_event_wheel_destroy(&event_wheel); - - return (0); -} - -#endif /* __CL_EVENT_WHEEL_TEST__ */ diff --git a/branches/opensm_3/user/config.h b/branches/opensm_3/user/config.h deleted file mode 100644 index 6798bf79..00000000 --- a/branches/opensm_3/user/config.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under the OpenIB.org BSD license - * below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * $Id$ - */ - -/* - * Abstract: - * Windows-specific definitions - * - * Environment: - * Windows - * - * $Revision: $ - */ - -#ifndef _CONFIG_h_ -#define _CONFIG_h_ - -#include -#include - -#endif /*_CONFIG_h_ */ - diff --git a/branches/opensm_3/user/dirs b/branches/opensm_3/user/dirs deleted file mode 100644 index e08ed5ed..00000000 --- a/branches/opensm_3/user/dirs +++ /dev/null @@ -1,6 +0,0 @@ -DIRS=\ - libvendor \ - opensm \ - osmtest \ - ibtrapgen - diff --git a/branches/opensm_3/user/doc/OpenSM_PKey_Mgr.txt b/branches/opensm_3/user/doc/OpenSM_PKey_Mgr.txt deleted file mode 100644 index e0706e06..00000000 --- a/branches/opensm_3/user/doc/OpenSM_PKey_Mgr.txt +++ /dev/null @@ -1,78 +0,0 @@ -OpenSM Partition Management ---------------------------- - -Roadmap: -Phase 1 - provide partition management at the EndPort (HCA, Router and Switch - Port 0) level with no routing affects. -Phase 2 - routing engine should take partitions into account. - -Phase 1 functionality: - -Supported Policy: - -1. EndPort partition groups are to be defined by listing the - PortGUIDs as full and limited members. - -2. Each partition group might be assigned an explicit P_Key (only the 15 - LSB bits are valid) or the SM should assign it randomly. - -3. A flag should control the generation of IPoIB broadcast group for - that partition. Extra optional MGIDs can be provided to be setup (on - top of the IPoIB broadcast group). - -4. A global flag "Disconnect Unconfigured EndPorts": If TRUE prevents - EndPorts that are not explicitly defined as part of any partition - (thus "unconfigured") to communicate with any other EndPort. Otherwise, it - will let these EndPorts send packets to all other EndPorts. - -Functionality: - -1. The policy should be updated: - - during SM bringup - - after kill -HUP - - through SNMP (once it is supported) - -2. Partition tables will be updated on full sweep (new port/trap etc). - As a first step, the policy feasibility should be - verified. Feasibility could be limited by the EndPorts supports for - number of partitions, etc. Unrealizable policy should be reported - and extra rules ignored after providing error messages. - -3. Each EndPort will be assigned P_Keys as follows: - - a. Default partition group limited membership as defined by rule #4 below. - (only the SM port will get 0xffff). - - b. P_Keys for all partition groups it is part of as defined in - the policy. - - c. P_Key update will preserve index for the existing P_Keys on the - port. If port has limited resources that will require reuse of, - on index a message will be provided and some of the settings will be - ommitted. P_Key indexes will not change under any circumstances. - -4. Each Switch Leaf Port (a switch port that is connected to an - EndPort) should be configured according to the same rules that - apply to the EndPort connected to that switch port. - This actually enables unauthorized port isolation (with future - usage of M_Key and ProtectBits). - -5. Policy entries matching a non EndPort will be flagged as - erroneous in the log file and ignored. - -6. At the end of the P_Key setting phase, a check for successful - setting should be made. - Errors should be clearly logged and cause a new sweep. - -7. Each partition that is marked to support IPoIB should define a - broadcast MGRP. If the partition does not support IPoIB, it should - define a dummy MGRP with parameters blocking IPoIB drivers from - registering to it. - -Phase 2 functionality: - -The partition policy should be considered during the routing such that -links are associated with particular partition or a set of -partitions. Policy should be enhanced to provide hints for how to do -that (correlating to QoS too). The exact algorithm is TBD. - diff --git a/branches/opensm_3/user/doc/OpenSM_RN.pdf b/branches/opensm_3/user/doc/OpenSM_RN.pdf deleted file mode 100644 index 700924f2..00000000 Binary files a/branches/opensm_3/user/doc/OpenSM_RN.pdf and /dev/null differ diff --git a/branches/opensm_3/user/doc/OpenSM_UM.pdf b/branches/opensm_3/user/doc/OpenSM_UM.pdf deleted file mode 100644 index ae32826b..00000000 Binary files a/branches/opensm_3/user/doc/OpenSM_UM.pdf and /dev/null differ diff --git a/branches/opensm_3/user/doc/QoS_management_in_OpenSM.txt b/branches/opensm_3/user/doc/QoS_management_in_OpenSM.txt deleted file mode 100644 index fef8a622..00000000 --- a/branches/opensm_3/user/doc/QoS_management_in_OpenSM.txt +++ /dev/null @@ -1,492 +0,0 @@ - - QoS Management in OpenSM - -============================================================================== - Table of contents -============================================================================== - -1. Overview -2. Full QoS Policy File -3. Simplified QoS Policy Definition -4. Policy File Syntax Guidelines -5. Examples of Full Policy File -6. Simplified QoS Policy - Details and Examples -7. SL2VL Mapping and VL Arbitration - - -============================================================================== - 1. Overview -============================================================================== - -When QoS in OpenSM is enabled (-Q or --qos), OpenSM looks for QoS Policy file. -The default name of OpenSM QoS policy file is -/usr/local/etc/opensm/qos-policy.conf. The default may be changed by using -Y -or --qos_policy_file option with OpenSM. - -During fabric initialization and at every heavy sweep OpenSM parses the QoS -policy file, applies its settings to the discovered fabric elements, and -enforces the provided policy on client requests. The overall flow for such -requests is: - - The request is matched against the defined matching rules such that the - QoS Level definition is found. - - Given the QoS Level, path(s) search is performed with the given - restrictions imposed by that level. - -There are two ways to define QoS policy: - - Full policy, where the policy file syntax provides an administrator - various ways to match PathRecord/MultiPathRecord (PR/MPR) request and - enforce various QoS constraints on the requested PR/MPR - - Simplified QoS policy definition, where an administrator would be able to - match PR/MPR requests by various ULPs and applications running on top of - these ULPs. - -While the full policy syntax is very flexible, in many cases the simplified -policy definition would be sufficient. - - -============================================================================== - 2. Full QoS Policy File -============================================================================== - -QoS policy file has the following sections: - -I) Port Groups (denoted by port-groups). -This section defines zero or more port groups that can be referred later by -matching rules (see below). Port group lists ports by: - - Port GUID - - Port name, which is a combination of NodeDescription and IB port number - - PKey, which means that all the ports in the subnet that belong to - partition with a given PKey belong to this port group - - Partition name, which means that all the ports in the subnet that belong - to partition with a given name belong to this port group - - Node type, where possible node types are: CA, SWITCH, ROUTER, ALL, and - SELF (SM's port). - -II) QoS Setup (denoted by qos-setup). -This section describes how to set up SL2VL and VL Arbitration tables on -various nodes in the fabric. -However, this is not supported in OpenSM currently. -SL2VL and VLArb tables should be configured in the OpenSM options file -(default location - /usr/local/etc/opensm/opensm.conf). - -III) QoS Levels (denoted by qos-levels). -Each QoS Level defines Service Level (SL) and a few optional fields: - - MTU limit - - Rate limit - - PKey - - Packet lifetime -When path(s) search is performed, it is done with regards to restriction that -these QoS Level parameters impose. -One QoS level that is mandatory to define is a DEFAULT QoS level. It is -applied to a PR/MPR query that does not match any existing match rule. -Similar to any other QoS Level, it can also be explicitly referred by any -match rule. - -IV) QoS Matching Rules (denoted by qos-match-rules). -Each PathRecord/MultiPathRecord query that OpenSM receives is matched against -the set of matching rules. Rules are scanned in order of appearance in the QoS -policy file such as the first match takes precedence. -Each rule has a name of QoS level that will be applied to the matching query. -A default QoS level is applied to a query that did not match any rule. -Queries can be matched by: - - Source port group (whether a source port is a member of a specified group) - - Destination port group (same as above, only for destination port) - - PKey - - QoS class - - Service ID -To match a certain matching rule, PR/MPR query has to match ALL the rule's -criteria. However, not all the fields of the PR/MPR query have to appear in -the matching rule. -For instance, if the rule has a single criterion - Service ID, it will match -any query that has this Service ID, disregarding rest of the query fields. -However, if a certain query has only Service ID (which means that this is the -only bit in the PR/MPR component mask that is on), it will not match any rule -that has other matching criteria besides Service ID. - - -============================================================================== - 3. Simplified QoS Policy Definition -============================================================================== - -Simplified QoS policy definition comprises of a single section denoted by -qos-ulps. Similar to the full QoS policy, it has a list of match rules and -their QoS Level, but in this case a match rule has only one criterion - its -goal is to match a certain ULP (or a certain application on top of this ULP) -PR/MPR request, and QoS Level has only one constraint - Service Level (SL). -The simplified policy section may appear in the policy file in combine with -the full policy, or as a stand-alone policy definition. -See more details and list of match rule criteria below. - - -============================================================================== - 4. Policy File Syntax Guidelines -============================================================================== - -- Empty lines are ignored. -- Leading and trailing blanks, as well as empty lines, are ignored, so - the indentation in the example is just for better readability. -- Comments are started with the pound sign (#) and terminated by EOL. -- Any keyword should be the first non-blank in the line, unless it's a - comment. -- Keywords that denote section/subsection start have matching closing - keywords. -- Having a QoS Level named "DEFAULT" is a must - it is applied to PR/MPR - requests that didn't match any of the matching rules. -- Any section/subsection of the policy file is optional. - - -============================================================================== - 5. Examples of Full Policy File -============================================================================== - -As mentioned earlier, any section of the policy file is optional, and -the only mandatory part of the policy file is a default QoS Level. -Here's an example of the shortest policy file: - - qos-levels - qos-level - name: DEFAULT - sl: 0 - end-qos-level - end-qos-levels - -Port groups section is missing because there are no match rules, which means -that port groups are not referred anywhere, and there is no need defining -them. And since this policy file doesn't have any matching rules, PR/MPR query -won't match any rule, and OpenSM will enforce default QoS level. -Essentially, the above example is equivalent to not having QoS policy file -at all. - -The following example shows all the possible options and keywords in the -policy file and their syntax: - - # - # See the comments in the following example. - # They explain different keywords and their meaning. - # - port-groups - - port-group # using port GUIDs - name: Storage - # "use" is just a description that is used for logging - # Other than that, it is just a comment - use: SRP Targets - port-guid: 0x10000000000001, 0x10000000000005-0x1000000000FFFA - port-guid: 0x1000000000FFFF - end-port-group - - port-group - name: Virtual Servers - # The syntax of the port name is as follows: - # "node_description/Pnum". - # node_description is compared to the NodeDescription of the node, - # and "Pnum" is a port number on that node. - port-name: vs1 HCA-1/P1, vs2 HCA-1/P1 - end-port-group - - # using partitions defined in the partition policy - port-group - name: Partitions - partition: Part1 - pkey: 0x1234 - end-port-group - - # using node types: CA, ROUTER, SWITCH, SELF (for node that runs SM) - # or ALL (for all the nodes in the subnet) - port-group - name: CAs and SM - node-type: CA, SELF - end-port-group - - end-port-groups - - qos-setup - # This section of the policy file describes how to set up SL2VL and VL - # Arbitration tables on various nodes in the fabric. - # However, this is not supported in OpenSM currently - the section is - # parsed and ignored. SL2VL and VLArb tables should be configured in the - # OpenSM options file (by default - /usr/local/etc/opensm/opensm.conf). - end-qos-setup - - qos-levels - - # Having a QoS Level named "DEFAULT" is a must - it is applied to - # PR/MPR requests that didn't match any of the matching rules. - qos-level - name: DEFAULT - use: default QoS Level - sl: 0 - end-qos-level - - # the whole set: SL, MTU-Limit, Rate-Limit, PKey, Packet Lifetime - qos-level - name: WholeSet - sl: 1 - mtu-limit: 4 - rate-limit: 5 - pkey: 0x1234 - packet-life: 8 - end-qos-level - - end-qos-levels - - # Match rules are scanned in order of their apperance in the policy file. - # First matched rule takes precedence. - qos-match-rules - - # matching by single criteria: QoS class - qos-match-rule - use: by QoS class - qos-class: 7-9,11 - # Name of qos-level to apply to the matching PR/MPR - qos-level-name: WholeSet - end-qos-match-rule - - # show matching by destination group and service id - qos-match-rule - use: Storage targets - destination: Storage - service-id: 0x10000000000001, 0x10000000000008-0x10000000000FFF - qos-level-name: WholeSet - end-qos-match-rule - - qos-match-rule - source: Storage - use: match by source group only - qos-level-name: DEFAULT - end-qos-match-rule - - qos-match-rule - use: match by all parameters - qos-class: 7-9,11 - source: Virtual Servers - destination: Storage - service-id: 0x0000000000010000-0x000000000001FFFF - pkey: 0x0F00-0x0FFF - qos-level-name: WholeSet - end-qos-match-rule - - end-qos-match-rules - - -============================================================================== - 6. Simplified QoS Policy - Details and Examples -============================================================================== - -Simplified QoS policy match rules are tailored for matching ULPs (or some -application on top of a ULP) PR/MPR requests. This section has a list of -per-ULP (or per-application) match rules and the SL that should be enforced -on the matched PR/MPR query. - -Match rules include: - - Default match rule that is applied to PR/MPR query that didn't match any - of the other match rules - - SDP - - SDP application with a specific target TCP/IP port range - - SRP with a specific target IB port GUID - - RDS - - iSER - - iSER application with a specific target TCP/IP port range - - IPoIB with a default PKey - - IPoIB with a specific PKey - - any ULP/application with a specific Service ID in the PR/MPR query - - any ULP/application with a specific PKey in the PR/MPR query - - any ULP/application with a specific target IB port GUID in the PR/MPR query - -Since any section of the policy file is optional, as long as basic rules of -the file are kept (such as no referring to nonexisting port group, having -default QoS Level, etc), the simplified policy section (qos-ulps) can serve -as a complete QoS policy file. -The shortest policy file in this case would be as follows: - - qos-ulps - default : 0 #default SL - end-qos-ulps - -It is equivalent to the previous example of the shortest policy file, and it -is also equivalent to not having policy file at all. - -Below is an example of simplified QoS policy with all the possible keywords: - - qos-ulps - default : 0 # default SL - sdp, port-num 30000 : 0 # SL for application running on top - # of SDP when a destination - # TCP/IPport is 30000 - sdp, port-num 10000-20000 : 0 - sdp : 1 # default SL for any other - # application running on top of SDP - rds : 2 # SL for RDS traffic - iser, port-num 900 : 0 # SL for iSER with a specific target - # port - iser : 3 # default SL for iSER - ipoib, pkey 0x0001 : 0 # SL for IPoIB on partition with - # pkey 0x0001 - ipoib : 4 # default IPoIB partition, - # pkey=0x7FFF - any, service-id 0x6234 : 6 # match any PR/MPR query with a - # specific Service ID - any, pkey 0x0ABC : 6 # match any PR/MPR query with a - # specific PKey - srp, target-port-guid 0x1234 : 5 # SRP when SRP Target is located on - # a specified IB port GUID - any, target-port-guid 0x0ABC-0xFFFFF : 6 # match any PR/MPR query with - # a specific target port GUID - end-qos-ulps - - -Similar to the full policy definition, matching of PR/MPR queries is done in -order of appearance in the QoS policy file such as the first match takes -precedence, except for the "default" rule, which is applied only if the query -didn't match any other rule. - -All other sections of the QoS policy file take precedence over the qos-ulps -section. That is, if a policy file has both qos-match-rules and qos-ulps -sections, then any query is matched first against the rules in the -qos-match-rules section, and only if there was no match, the query is matched -against the rules in qos-ulps section. - -Note that some of these match rules may overlap, so in order to use the -simplified QoS definition effectively, it is important to understand how each -of the ULPs is matched: - -6.1 IPoIB -IPoIB query is matched by PKey. Default PKey for IPoIB partition is 0x7fff, so -the following three match rules are equivalent: - - ipoib : - ipoib, pkey 0x7fff : - any, pkey 0x7fff : - -6.2 SDP -SDP PR query is matched by Service ID. The Service-ID for SDP is -0x000000000001PPPP, where PPPP are 4 hex digits holding the remote TCP/IP Port -Number to connect to. The following two match rules are equivalent: - - sdp : - any, service-id 0x0000000000010000-0x000000000001ffff : - -6.3 RDS -Similar to SDP, RDS PR query is matched by Service ID. The Service ID for RDS -is 0x000000000106PPPP, where PPPP are 4 hex digits holding the remote TCP/IP -Port Number to connect to. Default port number for RDS is 0x48CA, which makes -a default Service-ID 0x00000000010648CA. The following two match rules are -equivalent: - - rds : - any, service-id 0x00000000010648CA : - -6.4 iSER -Similar to RDS, iSER query is matched by Service ID, where the the Service ID -is also 0x000000000106PPPP. Default port number for iSER is 0x0CBC, which makes -a default Service-ID 0x0000000001060CBC. The following two match rules are -equivalent: - - iser : - any, service-id 0x0000000001060CBC : - -6.5 SRP -Service ID for SRP varies from storage vendor to vendor, thus SRP query is -matched by the target IB port GUID. The following two match rules are -equivalent: - - srp, target-port-guid 0x1234 : - any, target-port-guid 0x1234 : - -Note that any of the above ULPs might contain target port GUID in the PR -query, so in order for these queries not to be recognized by the QoS manager -as SRP, the SRP match rule (or any match rule that refers to the target port -guid only) should be placed at the end of the qos-ulps match rules. - -6.6 MPI -SL for MPI is manually configured by MPI admin. OpenSM is not forcing any SL -on the MPI traffic, and that's why it is the only ULP that did not appear in -the qos-ulps section. - - -============================================================================== - 7. SL2VL Mapping and VL Arbitration -============================================================================== - -OpenSM cached options file has a set of QoS related configuration parameters, -that are used to configure SL2VL mapping and VL arbitration on IB ports. -These parameters are: - - Max VLs: the maximum number of VLs that will be on the subnet. - - High limit: the limit of High Priority component of VL Arbitration - table (IBA 7.6.9). - - VLArb low table: Low priority VL Arbitration table (IBA 7.6.9) template. - - VLArb high table: High priority VL Arbitration table (IBA 7.6.9) template. - - SL2VL: SL2VL Mapping table (IBA 7.6.6) template. It is a list of VLs - corresponding to SLs 0-15 (Note that VL15 used here means drop this SL). - -There are separate QoS configuration parameters sets for various target types: -CAs, routers, switch external ports, and switch's enhanced port 0. The names -of such parameters are prefixed by "qos__" string. Here is a full list -of the currently supported sets: - - qos_ca_ - QoS configuration parameters set for CAs. - qos_rtr_ - parameters set for routers. - qos_sw0_ - parameters set for switches' port 0. - qos_swe_ - parameters set for switches' external ports. - -Here's the example of typical default values for CAs and switches' external -ports (hard-coded in OpenSM initialization): - - qos_ca_max_vls 15 - qos_ca_high_limit 0 - qos_ca_vlarb_high 0:4,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0 - qos_ca_vlarb_low 0:0,1:4,2:4,3:4,4:4,5:4,6:4,7:4,8:4,9:4,10:4,11:4,12:4,13:4,14:4 - qos_ca_sl2vl 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7 - - qos_swe_max_vls 15 - qos_swe_high_limit 0 - qos_swe_vlarb_high 0:4,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0 - qos_swe_vlarb_low 0:0,1:4,2:4,3:4,4:4,5:4,6:4,7:4,8:4,9:4,10:4,11:4,12:4,13:4,14:4 - qos_swe_sl2vl 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7 - -VL arbitration tables (both high and low) are lists of VL/Weight pairs. -Each list entry contains a VL number (values from 0-14), and a weighting value -(values 0-255), indicating the number of 64 byte units (credits) which may be -transmitted from that VL when its turn in the arbitration occurs. A weight -of 0 indicates that this entry should be skipped. If a list entry is -programmed for VL15 or for a VL that is not supported or is not currently -configured by the port, the port may either skip that entry or send from any -supported VL for that entry. - -Note, that the same VLs may be listed multiple times in the High or Low -priority arbitration tables, and, further, it can be listed in both tables. - -The limit of high-priority VLArb table (qos__high_limit) indicates the -number of high-priority packets that can be transmitted without an opportunity -to send a low-priority packet. Specifically, the number of bytes that can be -sent is high_limit times 4K bytes. - -A high_limit value of 255 indicates that the byte limit is unbounded. -Note: if the 255 value is used, the low priority VLs may be starved. -A value of 0 indicates that only a single packet from the high-priority table -may be sent before an opportunity is given to the low-priority table. - -Keep in mind that ports usually transmit packets of size equal to MTU. -For instance, for 4KB MTU a single packet will require 64 credits, so in order -to achieve effective VL arbitration for packets of 4KB MTU, the weighting -values for each VL should be multiples of 64. - -Below is an example of SL2VL and VL Arbitration configuration on subnet: - - qos_ca_max_vls 15 - qos_ca_high_limit 6 - qos_ca_vlarb_high 0:4 - qos_ca_vlarb_low 0:0,1:64,2:128,3:192,4:0,5:64,6:64,7:64 - qos_ca_sl2vl 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7 - - qos_swe_max_vls 15 - qos_swe_high_limit 6 - qos_swe_vlarb_high 0:4 - qos_swe_vlarb_low 0:0,1:64,2:128,3:192,4:0,5:64,6:64,7:64 - qos_swe_sl2vl 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7 - -In this example, there are 8 VLs configured on subnet: VL0 to VL7. VL0 is -defined as a high priority VL, and it is limited to 6 x 4KB = 24KB in a single -transmission burst. Such configuration would suilt VL that needs low latency -and uses small MTU when transmitting packets. Rest of VLs are defined as low -priority VLs with different weights, while VL4 is effectively turned off. diff --git a/branches/opensm_3/user/doc/current-routing.txt b/branches/opensm_3/user/doc/current-routing.txt deleted file mode 100644 index b7675188..00000000 --- a/branches/opensm_3/user/doc/current-routing.txt +++ /dev/null @@ -1,390 +0,0 @@ -Current OpenSM Routing -7/9/07 - -OpenSM offers five routing engines: - -1. Min Hop Algorithm - based on the minimum hops to each node where the -path length is optimized. - -2. UPDN Unicast routing algorithm - also based on the minimum hops to each -node, but it is constrained to ranking rules. This algorithm should be chosen -if the subnet is not a pure Fat Tree, and deadlock may occur due to a -loop in the subnet. - -3. Fat-tree Unicast routing algorithm - this algorithm optimizes routing -of fat-trees for congestion-free "shift" communication pattern. -It should be chosen if a subnet is a symmetrical fat-tree. -Similar to UPDN routing, Fat-tree routing is credit-loop-free. - -4. LASH unicast routing algorithm - uses Infiniband virtual layers -(SL) to provide deadlock-free shortest-path routing while also -distributing the paths between layers. LASH is an alternative -deadlock-free topology-agnostic routing algorithm to the non-minimal -UPDN algorithm avoiding the use of a potentially congested root node. - -5. DOR Unicast routing algorithm - based on the Min Hop algorithm, but -avoids port equalization except for redundant links between the same -two switches. This provides deadlock free routes for hypercubes when -the fabric is cabled as a hypercube and for meshes when cabled as a -mesh (see details below). - -OpenSM provides an optional unicast routing cache (enabled by -A or ---ucast_cache options). When enabled, unicast routing cache prevents -routing recalculation (which is a heavy task in a large cluster) when -there was no topology change detected during the heavy sweep, or when -the topology change does not require new routing calculation, e.g. when -one or more CAs/RTRs/leaf switches going down, or one or more of these -nodes coming back after being down. -A very common case that is handled by the unicast routing cache is host -reboot, which otherwise would cause two full routing recalculations: one -when the host goes down, and the other when the host comes back online. - -OpenSM also supports a file method which can load routes from a table. See -modular-routing.txt for more information on this. - -The basic routing algorithm is comprised of two stages: -1. MinHop matrix calculation - How many hops are required to get from each port to each LID ? - The algorithm to fill these tables is different if you run standard -(min hop) or Up/Down. - For standard routing, a "relaxation" algorithm is used to propagate -min hop from every destination LID through neighbor switches - For Up/Down routing, a BFS from every target is used. The BFS tracks link -direction (up or down) and avoid steps that will perform up after a down -step was used. - -2. Once MinHop matrices exist, each switch is visited and for each target LID, -a decision is made as to what port should be used to get to that LID. - This step is common to standard and Up/Down routing. Each port has a -counter counting the number of target LIDs going through it. - When there are multiple alternative ports with same MinHop to a LID, -the one with less previously assigned ports is selected. - If LMC > 0, more checks are added: Within each group of LIDs assigned to -same target port, - a. use only ports which have same MinHop - b. first prefer the ones that go to different systemImageGuid (then -the previous LID of the same LMC group) - c. if none - prefer those which go through another NodeGuid - d. fall back to the number of paths method (if all go to same node). - - -Effect of Topology Changes - -OpenSM will preserve existing routing in any case where there is no change in -the fabric switches unless the -r (--reassign_lids) option is specified. - --r ---reassign_lids - This option causes OpenSM to reassign LIDs to all - end nodes. Specifying -r on a running subnet - may disrupt subnet traffic. - Without -r, OpenSM attempts to preserve existing - LID assignments resolving multiple use of same LID. - -If a link is added or removed, OpenSM does not recalculate -the routes that do not have to change. A route has to change -if the port is no longer UP or no longer the MinHop. When routing changes -are performed, the same algorithm for balancing the routes is invoked. - -In the case of using the file based routing, any topology changes are -currently ignored The 'file' routing engine just loads the LFTs from the file -specified, with no reaction to real topology. Obviously, this will not be able -to recheck LIDs (by GUID) for disconnected nodes, and LFTs for non-existent -switches will be skipped. Multicast is not affected by 'file' routing engine -(this uses min hop tables). - - -Min Hop Algorithm ------------------ - -The Min Hop algorithm is invoked by default if no routing algorithm is -specified. It can also be invoked by specifying '-R minhop'. - -The Min Hop algorithm is divided into two stages: computation of -min-hop tables on every switch and LFT output port assignment. Link -subscription is also equalized with the ability to override based on -port GUID. The latter is supplied by: - --i --ignore-guids - This option provides the means to define a set of ports - (by guids) that will be ignored by the link load - equalization algorithm. - -LMC awareness routes based on (remote) system or switch basis. - - -UPDN Routing Algorithm ----------------------- - -Purpose of UPDN Algorithm - -The UPDN algorithm is designed to prevent deadlocks from occurring in loops -of the subnet. A loop-deadlock is a situation in which it is no longer -possible to send data between any two hosts connected through the loop. As -such, the UPDN routing algorithm should be used if the subnet is not a pure -Fat Tree, and one of its loops may experience a deadlock (due, for example, -to high pressure). - -The UPDN algorithm is based on the following main stages: - -1. Auto-detect root nodes - based on the CA hop length from any switch in -the subnet, a statistical histogram is built for each switch (hop num vs -number of occurrences). If the histogram reflects a specific column (higher -than others) for a certain node, then it is marked as a root node. Since -the algorithm is statistical, it may not find any root nodes. The list of -the root nodes found by this auto-detect stage is used by the ranking -process stage. - - Note 1: The user can override the node list manually. - Note 2: If this stage cannot find any root nodes, and the user did not - specify a guid list file, OpenSM defaults back to the Min Hop - routing algorithm. - -2. Ranking process - All root switch nodes (found in stage 1) are assigned -a rank of 0. Using the BFS algorithm, the rest of the switch nodes in the -subnet are ranked incrementally. This ranking aids in the process of enforcing -rules that ensure loop-free paths. - -3. Min Hop Table setting - after ranking is done, a BFS algorithm is run from -each (CA or switch) node in the subnet. During the BFS process, the FDB table -of each switch node traversed by BFS is updated, in reference to the starting -node, based on the ranking rules and guid values. - -At the end of the process, the updated FDB tables ensure loop-free paths -through the subnet. - -Note: Up/Down routing does not allow LID routing communication between -switches that are located inside spine "switch systems". -The reason is that there is no way to allow a LID route between them -that does not break the Up/Down rule. -One ramification of this is that you cannot run SM on switches other -than the leaf switches of the fabric. - - -UPDN Algorithm Usage - -Activation through OpenSM - -Use '-R updn' option (instead of old '-u') to activate the UPDN algorithm. -Use `-a ' for adding an UPDN guid file that contains the -root nodes for ranking. -If the `-a' option is not used, OpenSM uses its auto-detect root nodes -algorithm. - -Notes on the guid list file: -1. A valid guid file specifies one guid in each line. Lines with an invalid -format will be discarded. -2. The user should specify the root switch guids. However, it is also -possible to specify CA guids; OpenSM will use the guid of the switch (if -it exists) that connects the CA to the subnet as a root node. - - -To learn more about deadlock-free routing, see the article -"Deadlock Free Message Routing in Multiprocessor Interconnection Networks" -by William J Dally and Charles L Seitz (1985). - - -Fat-tree Routing Algorithm --------------------------- - -Purpose: - -The fat-tree algorithm optimizes routing for "shift" communication pattern. -It should be chosen if a subnet is a symmetrical or almost symmetrical -fat-tree of various types. -It supports not just K-ary-N-Trees, by handling for non-constant K, -cases where not all leafs (CAs) are present, any Constant -Bisectional Ratio (CBB) ratio. As in UPDN, fat-tree also prevents -credit-loop-deadlocks. - -If the root guid file is not provided ('-a' or '--root_guid_file' options), -the topology has to be pure fat-tree that complies with the following rules: - - Tree rank should be between two and eight (inclusively) - - Switches of the same rank should have the same number - of UP-going port groups*, unless they are root switches, - in which case the shouldn't have UP-going ports at all. - - Switches of the same rank should have the same number - of DOWN-going port groups, unless they are leaf switches. - - Switches of the same rank should have the same number - of ports in each UP-going port group. - - Switches of the same rank should have the same number - of ports in each DOWN-going port group. - - All the CAs have to be at the same tree level (rank). - -If the root guid file is provided, the topology doesn't have to be pure -fat-tree, and it should only comply with the following rules: - - Tree rank should be between two and eight (inclusively) - - All the Compute Nodes** have to be at the same tree level (rank). - Note that non-compute node CAs are allowed here to be at different - tree ranks. - -* ports that are connected to the same remote switch are referenced as -'port group'. -** list of compute nodes (CNs) can be specified by '-u' or '--cn_guid_file' -OpenSM options. - -Note that although fat-tree algorithm supports trees with non-integer CBB -ratio, the routing will not be as balanced as in case of integer CBB ratio. -In addition to this, although the algorithm allows leaf switches to have any -number of CAs, the closer the tree is to be fully populated, the more effective -the "shift" communication pattern will be. -In general, even if the root list is provided, the closer the topology to a -pure and symmetrical fat-tree, the more optimal the routing will be. - -The algorithm also dumps compute node ordering file (opensm-ftree-ca-order.dump) -in the same directory where the OpenSM log resides. This ordering file provides -the CN order that may be used to create efficient communication pattern, that -will match the routing tables. - -Routing between non-CN nodes - - -The use of the cn_guid_file option allows non-CN nodes to be located on different levels in the fat tree. -In such case, it is not guaranteed that the Fat Tree algorithm will route between two non-CN nodes. -In the scheme below, N1, N2 and N3 are non-CN nodes. Although all the CN have routes to and from them, -there will not necessarily be a route between N1,N2 and N3. -Such routes would require to use at least one of the Switch the wrong way around -(In fact, go out of one of the top Switch through a downgoing port while we are supposed to go up). - - Spine1 Spine2 Spine 3 - / \ / | \ / \ - / \ / | \ / \ - N1 Switch N2 Switch N3 - /|\ /|\ - / | \ / | \ - Going down to compute nodes - -To solve this problem, a list of non-CN nodes can be specified by \'-G\' or \'--io_guid_file\' option. -Theses nodes will be allowed to use switches the wrong way around a specific number of times (specified by \'-H\' or \'--max_reverse_hops\'. -With the proper max_reverse_hops and io_guid_file values, you can ensure full connectivity in the Fat Tree. - -In the scheme above, with a max_reverse_hop of 1, routes will be instanciated between N1<->N2 and N2<->N3. -With a max_reverse_hops value of 2, N1,N2 and N3 will all have routes between them. - -Please note that using max_reverse_hops creates routes that use the switch in a counter-stream way. -This option should never be used to connect nodes with high bandwidth traffic between them ! It should only be used -to allow connectivity for HA purposes or similar. -Also having routes the other way around can in theory cause credit loops. - -Use these options with extreme care ! - - -Usage: - -Activation through OpenSM - -Use '-R ftree' option to activate the fat-tree algorithm. - -Note: LMC > 0 is not supported by fat-tree routing. If this is -specified, the default routing algorithm is invoked instead. - - -LASH Routing Algorithm ----------------------- - -LASH is an acronym for LAyered SHortest Path Routing. It is a -deterministic shortest path routing algorithm that enables topology -agnostic deadlock-free routing within communication networks. - -When computing the routing function, LASH analyzes the network -topology for the shortest-path routes between all pairs of sources / -destinations and groups these paths into virtual layers in such a way -as to avoid deadlock. - -Note LASH analyzes routes and ensures deadlock freedom between switch -pairs. The link from HCA between and switch does not need virtual -layers as deadlock will not arise between switch and HCA. - -In more detail, the algorithm works as follows: - -1) LASH determines the shortest-path between all pairs of source / -destination switches. Note, LASH ensures the same SL is used for all -SRC/DST - DST/SRC pairs and there is no guarantee that the return -path for a given DST/SRC will be the reverse of the route SRC/DST. - -2) LASH then begins an SL assignment process where a route is assigned -to a layer (SL) if the addition of that route does not cause deadlock -within that layer. This is achieved by maintaining and analysing a -channel dependency graph for each layer. Once the potential addition -of a path could lead to deadlock, LASH opens a new layer and continues -the process. - -3) Once this stage has been completed, it is highly likely that the -first layers processed will contain more paths than the latter ones. -To better balance the use of layers, LASH moves paths from one layer -to another so that the number of paths in each layer averages out. - -Note, the implementation of LASH in opensm attempts to use as few layers -as possible. This number can be less than the number of actual layers -available. - -In general LASH is a very flexible algorithm. It can, for example, -reduce to Dimension Order Routing in certain topologies, it is topology -agnostic and fares well in the face of faults. - -It has been shown that for both regular and irregular topologies, LASH -outperforms Up/Down. The reason for this is that LASH distributes the -traffic more evenly through a network, avoiding the bottleneck issues -related to a root node and always routes shortest-path. - -The algorithm was developed by Simula Research Laboratory. - -To learn more about LASH and the flexibility behind it, the requirement -for layers, performance comparisons to other algorithms, see the -following articles: - -"Layered Routing in Irregular Networks", Lysne et al, IEEE -Transactions on Parallel and Distributed Systems, VOL.16, No12, -December 2005. - -"Routing for the ASI Fabric Manager", Solheim et al. IEEE -Communications Magazine, Vol.44, No.7, July 2006. - -"Layered Shortest Path (LASH) Routing in Irregular System Area -Networks", Skeie et al. IEEE Computer Society Communication -Architecture for Clusters 2002. - - -Use '-R lash -Q ' option to activate the LASH algorithm. - -Note: QoS support has to be turned on in order that SL/VL mappings are -used. - -Note: LMC > 0 is not supported by the LASH routing. If this is -specified, the default routing algorithm is invoked instead. - -For open regular cartesian meshes the DOR algorithm is the ideal -routing algorithm. For toroidal meshes on the other hand there -are routing loops that can cause deadlocks. LASH can be used to -route these cases. The performance of LASH can be improved by -preconditioning the mesh in cases where there are multiple links -connecting switches and also in cases where the switches are not -cabled consistently. An option exists for LASH to do this. To -invoke this use '-R lash -Q --do_mesh_analysis'. This will -add an additional phase that analyses the mesh to try to determine -the dimension and size of a mesh. If it determines that the mesh -looks like an open or closed cartesian mesh it reorders the ports -in dimension order before the rest of the LASH algorithm runs. - -DOR Routing Algorithm ---------------------- - -The Dimension Order Routing algorithm is based on the Min Hop -algorithm and so uses shortest paths. Instead of spreading traffic -out across different paths with the same shortest distance, it chooses -among the available shortest paths based on an ordering of dimensions. -Each port must be consistently cabled to represent a hypercube -dimension or a mesh dimension. Paths are grown from a destination -back to a source using the lowest dimension (port) of available paths -at each step. This provides the ordering necessary to avoid deadlock. -When there are multiple links between any two switches, they still -represent only one dimension and traffic is balanced across them -unless port equalization is turned off. In the case of hypercubes, -the same port must be used throughout the fabric to represent the -hypercube dimension and match on both ends of the cable. In the case -of meshes, the dimension should consistently use the same pair of -ports, one port on one end of the cable, and the other port on the -other end, continuing along the mesh dimension. - -Use '-R dor' option to activate the DOR algorithm. diff --git a/branches/opensm_3/user/doc/opensm_release_notes-3.3.txt b/branches/opensm_3/user/doc/opensm_release_notes-3.3.txt deleted file mode 100644 index fb27b274..00000000 --- a/branches/opensm_3/user/doc/opensm_release_notes-3.3.txt +++ /dev/null @@ -1,735 +0,0 @@ - OpenSM Release Notes 3.3 - ============================= - -Version: OpenSM 3.3.x -Repo: git://git.openfabrics.org/~sashak/management.git -Date: Dec 2009 - -1 Overview ----------- -This document describes the contents of the OpenSM 3.3 release. -OpenSM is an InfiniBand compliant Subnet Manager and Administration, -and runs on top of OpenIB. The OpenSM version for this release -is opensm-3.3.6. - -This document includes the following sections: -1 This Overview section (describing new features and software - dependencies) -2 Known Issues And Limitations -3 Unsupported IB compliance statements -4 Bug Fixes -5 Main Verification Flows -6 Qualified Software Stacks and Devices - -1.1 Major New Features - -* Mesh Analysis for LASH routing algorithm. - The performance of LASH can be improved by preconditioning the mesh in - cases where there are multiple links connecting switches and also in - cases where the switches are not cabled consistently. - Activated with --do_mesh_analysis command line and config file option. - -* Reloadable OpenSM configuration (preliminary implemented) - This is possible now to reload OpenSM configuration parameters on the - fly without restarting. - -* Routing paths sorted balancing (for UpDown and MinHops) - This sorts the port order in which routing paths balancing is performed - by OpenSM. Helps to improve performance dramatically (40-50%) for most - popular application communication patterns. - To overwrite this behavior use --guid_routing_order_file command line - option. - -* Weighted Lid Matrices calculation (for UpDown, MinHop and DOR). - This low level routing fine-tuning feature provides the means to - define a weighting factor per port for customizing the least weight - hops for the routing. Custom weights are provided using file specified - with '--hop_weights_file' command line option. - -* I/O nodes connectivity (for FatTree). - This provides possibility to define the set of I/O nodes for the - Fat-Tree routing algorithm. I/O nodes are non-CN nodes allowed to use - up to N (specified using --max_reverse_hops) switches the wrong way - around to improve connectivity. I/O nodes list is provided using file - and --io_guid_file command line option. - -* MGID to MLID compression - infrastructure for many MGIDs to single MLID - compression. This becomes helpful when number of multicast groups - exceeds subnet's MLID routing capability (normally 1024 groups). In such - cases many multicast groups (MGID) can be routed using same MLID value. - -* Many code improvements, optimizations and cleanups. - -* Windows support (early stage). - -1.2 Minor New Features: - -cde0c0d opensm: Convert remaining helper routines for GID printing format -bc5743c opensm: Add support for MaxCreditHint and LinkRoundTripLatency to - osm_dump_port_info -6cd34ab opensm: Add Dell to known vendor list -003d6bd opensm: Add more info for traps 144 and 256-259 in osm_dump_notice -5b0c5de opensm/osm_ucat_ftree.c Enhance min hops counters usage -0715b92 ib_types.h: Add ib_switch_info_get_state_opt_sl2vlmapping routine -2ddba79 opensm: Remove some __ and __osm_ prefixes -ea0691f opensm/iba/ib_types.h: Add PortXmit/RcvDataSL PerfMgt attributes -9c79be5 ib_types.h: Adding BKEY violation trap (259) -c608ea6 opensm: Add and utilize ib_gid_is_notzero routine -b639e64 opensm: Handle trap repress on trap 144 generation -b034205 Add pkey table support to osm_get_all_port_attr -876605b opensm/ib_types.h: Add attribute ID for PortCountersExtended -aae3bbc opensm: PortInfo requests for discovered switches -0147b09 opensm/osm_lid_mgr: use single array for used_lids -a9225b0 opensm/Makefile.am: remove osm_build_id.h junk file generation -8e3a57d opensm/osm_console.c: Add list of SMs to status command -3d664b9 opensm/osm_console.c : Added dump_portguid function to console to - generate a list of port guids matching one or more regexps -85b35bc opensm/osm_helper.c: print port number as decimal -8674cb7 opensm: sort port order for routing by switch loads -80c0d48 opensm: rescan config file even in standby -8b7aa5e opensm/osm_subnet.c enable log_max_size opt update -8558ee5 opensm/include/iba/ib_types.h: Add xmit_wait for PortCounters -ecde2f7 opensm/osm_subnet.c support subnet configuration rescan and update -58c45e4 opensm/osm_log.c save log_max_size in subnet opt in MB -cf88e93 opensm: Add new partition keyword for all hca, switches and routers -4bfd4e0 opensm: remove libibcommon build dependencies -3718fc4 opensm/event_plugin: link opensm with -rdynamic flag -587ce14 opensm/osm_inform.c report IB traps to plugin -ced5a6e opensm/opensm/osm_console.c: move reporting of plugins to "status" - command. -696aca2 opensm: Add configurable retries for transactions -0d932ff opensm/osm_sa_mcmember_record.c: optimization in zero mgid comparison -254c2ef opensm/osm_sm_mad_ctrl.c: In sm_mad_ctrl_send_err_cb, set init - failure on PKeyTable and QoS initialization failure -83bd10a opensm: Reduce heap consumption by multicast routing tables (MFTs) -cd33bc5 opensm: Add some additional HP vendor IDs/OUIs -f78ec3a opensm/osm_mcast_tbl.(h c): Make max_mlid_ho be maximum MLID configured -2d13530 opensm: Add infrastructure support for PortInfo - IsMulticastPkeyTrapSuppressionSupported -3ace760 opensm: Reduce heap consumption by unicast routing tables (LFTs) -eec568e osmtest: Add SA get PathRecord stress test -aabc476 opensm: Add infrastructure support for more newly allocated PortInfo - CapabilityMask bits -c83c331 opensm: improve multicast re-routing requests processing -46db92f opensm: Parallelize (Stripe) MFT sets across switches -00c6a6e opensm: Parallelize (Stripe) LFT sets across switches -e21c651 opensm/osm_base.h: Add new SA ClassPortInfo:CapabilityMask2 bit - allocations -09056b1 opensm/ib_types.h: Add CounterSelect2 field to PortCounters attribute -6a63003 opensm: Add ability to configure SMSL -25f071f opensm/lash: Set minimum VL for LASH to use -622d853 opensm/osm_ucast_ftree.cd: Added support for same level links -8146ba7 opensm: Add new Sun vendor ID -1d7dd18 opensm/osm_ucast_ftree.c: Enhanced Fat-Tree algorithm -e07a2f1 Add LMC support to DOR routing -1acfe8a opensm: Add SuperMicro to list of recognized vendors -f02f40e opensm: implement 'connect_roots' option in fat-tree routing -748d41e opensm SA DB dump/restore: added option to dump SA DB on every sweep -b03a95e complib/cl_fleximap: add cl_fmap_match() function -b7a8a87 opensm/include/iba/ib_types.h: adding Congestion Control definitions -fa356f8 opensm: Add support for optimized SLtoVLMappingTable programming -8aaae91 Dimension port order file support -7662eec opensm: Add option to specify prefix to syslog messages -2382cf3 opensm: Add update_desc command to opensm console - -1.3 Library API Changes - - None - -1.4 Software Dependencies - -OpenSM depends on the installation of libibumad package (distributed as -part of OFA IB management together with OpenSM) and IB stack presence, -in particular libibumad uses user_mad kernel interface ('ib_umad' kernel -module). The qualified driver versions are provided in Table 2, -"Qualified IB Stacks". - -Also, building of QoS manager policy file parser requires flex, and either -bison or byacc installed. - -1.5 Supported Devices Firmware - -The main task of OpenSM is to initialize InfiniBand devices. The -qualified devices and their corresponding firmware versions -are listed in Table 3. - -2 Known Issues And Limitations ------------------------------- - -* No Service / Key associations: - There is no way to manage Service access by Keys. - -* No SM to SM SMDB synchronization: - Puts the burden of re-registering services, multicast groups, and - inform-info on the client application (or IB access layer core). - -3 Unsupported IB Compliance Statements --------------------------------------- -The following section lists all the IB compliance statements which -OpenSM does not support. Please refer to the IB specification for detailed -information regarding each compliance statement. - -* C14-22 (Authentication): - M_Key M_KeyProtectBits and M_KeyLeasePeriod shall be set in one - SubnSet method. As a work-around, an OpenSM option is provided for - defining the protect bits. - -* C14-67 (Authentication): - On SubnGet(SMInfo) and SubnSet(SMInfo) - if M_Key is not zero then - the SM shall generate a SubnGetResp if the M_Key matches, or - silently drop the packet if M_Key does not match. - -* C15-0.1.23.4 (Authentication): - InformInfoRecords shall always be provided with the QPN set to 0, - except for the case of a trusted request, in which case the actual - subscriber QPN shall be returned. - -* o13-17.1.2 (Event-FWD): - If no permission to forward, the subscription should be removed and - no further forwarding should occur. - -* C14-24.1.1.5 and C14-62.1.1.22 (Initialization): - GUIDInfo - SM should enable assigning Port GUIDInfo. - -* C14-44 (Initialization): - If the SM discovers that it is missing an M_Key to update CA/RT/SW, - it should notify the higher level. - -* C14-62.1.1.12 (Initialization): - PortInfo:M_Key - Set the M_Key to a node based random value. - -* C14-62.1.1.13 (Initialization): - PortInfo:M_KeyProtectBits - set according to an optional policy. - -* C14-62.1.1.24 (Initialization): - SwitchInfo:DefaultPort - should be configured for random FDB. - -* C14-62.1.1.32 (Initialization): - RandomForwardingTable should be configured. - -* o15-0.1.12 (Multicast): - If the JoinState is SendOnlyNonMember = 1 (only), then the endport - should join as sender only. - -* o15-0.1.8 (Multicast): - If a request for creating an MCG with fields that cannot be met, - return ERR_REQ_INVALID (currently ignores SL and FlowLabelTClass). - -* C15-0.1.8.6 (SA-Query): - Respond to SubnAdmGetTraceTable - this is an optional attribute. - -* C15-0.1.13 Services: - Reject ServiceRecord create, modify or delete if the given - ServiceP_Key does not match the one included in the ServiceGID port - and the port that sent the request. - -* C15-0.1.14 (Services): - Provide means to associate service name and ServiceKeys. - -4 Bug Fixes ------------ - -4.1 Major Bug Fixes - -18990fa opensm: set IS_SM bit during opensm init -3551389 fix local port smlid in osm_send_trap144() -a6de48d opensm/osm_link_mgr.c initialize SMSL -82df467 opensm/osm_req.c: Shouldn't reveal port's MKey on Trap method -45ebff9 opensm/osm_console_io.h: Modify osm_console_exit so only the - connection is killed, not the socket -d10660a opensm/osm_req.c: In osm_send_trap144, set producer type according - to node type -8a2d2dd opensm/osm_node_info_rcv.c: create physp for the newly discovered - port of the known node -39b241f opensm/lid_mgr: fix duplicated lid assignment -b44c398 opensm: invalidate routing cache when entering master state -595f2e3 opensm: update LFTs when entering master -8406c65 opensm: fix port chooser -fa90512 opensm/osm_vendor_*_sa: fix incompatibility with QLogic SM -7ec9f7c opensm: discard multicast SA PR with wildcard DGID -5cdb53f opensm/osm_sa_node_record.c use comp mask to match by LID or GUID -55f9772 opensm: Return single PathRecord for SubnAdmGet with DGID/SGID wild - carded -5ec0b5f opensm: compress IPV6 SNM groups to use a single MLID -26e7e83 opensm/osm_lid_mgr: fix couple of duplicate LIDs bugs -fedc419 opensm: Multicast root switch calculation - -4.2 Other Bug Fixes - -4911e0b performance-manager-HOWTO.txt: Indicate master state -86ccaa4 opensm/osm_pkey_mgr.c: Fix pkey endian in log message -b79b079 opensm.8.in: Add mention of backing documentation for QoS policy - file and performance manager -b4d92af opensm/osm_perfmgr.c: Eliminate duplicated error number -a10b57a opensm/osm_ucast_ftree.c: lids are always handled in host order -44273a2 opensm/osm_ucast_ftree.c: fixing bug in indexing -5cd98f7 Fix further bugs around console closure and clean up code. -6b34339 opensm/osm_opensm.c: add newline to log message -68c241c send trap144 when local priority is higher than master priority -6462999 opensm/osm_inform.c: In __osm_send_report, make sure p_report_madw - valid before using -9b8561a opensm/console: Fixed osm_console poll to handle POLLHUP -91d0700 osm_vendor_ibumad.c: In clear_madw, fix tid endian in message -5a5136b osm_switch.h : Fixed wrong comment about return value of - osm_switch_set_hops -c1ec8c0 osm_ucast_ftree.c: Removed useless initialization on switch indexes -418d01f opensm/osm_helper.c: use single buffer in osm_dump_dr_smp() -2c9153c opensm/osm_helper.c: consolidate dr path printing code -048c447 opensm/osm_helper.c: return then log is inactive -dd3ef0c opensm: Return error status when cl_disp_register fails -0143bf7 opensm/osm_perfmgr.c: Improve assert in osm_pc_rcv_process -6622504 osm_perfmgr.c: In osm_perfmgr_shutdown, add missing cl_disp_unregister -7b66dee opensm: remove unneeded anymore physp initializations -f11274a opensm/partition-config.txt: Update for defmember feature -d240e7d opensm/osm_sm_state_mgr.c: Remove unneeded return statement -898fb8c opensm: Improve some snprintf uses -6820e63 opensm/osm_sa_link_record.c: improve get_base_lid() -64c8d31 opensm: initialize all switch ports -555fae8 opensm/sweep: add log message before lid assignment -8e22307 opensm/console: Enhance perfmgr print_counters for better nodenames -b9721a1 opensm/osm_console.c: Improve perfmgr print_counters error message -4d8dc72 opensm/osm_inform.c: Fix sense of zero GID compare in __match_inf_rec -a98dd82 opensm/main.c: remove enable_stack_dump() call -db6d51e opensm/osm_subnet: fix crash in qos string config parameters reloading -e5111c8 opensm: proper config file rescan -e5295b2 opensm: pre-scan command line for config file option -e2f549e opensm/osm_console.c: Eliminate some extraneous parentheses -0a265dc opensm/console: dump_portguid - don't duplicate matched guids -540fefb opensm/console: dump_portguid command fixes -d96202c opensm/osm_console.c: Add missing command in help_perfmgr -ae1bd3c opensm/osm_helper.c: Add port counters to __osm_disp_msg_str -1d38b31 opensm/osm_ucast_mgr.c: Add error numbers for some OSM_LOG prin -156c749 opensm: fix structure definition for trap 257-258 -5c09f4a opensm/osm_state_mgr.c: small bug in scanning lid table -72a2fa2 opensm/osm_sa.c: fixing SA MAD dump -539a4d3 opensm/osm_ucast_ftree.c Fixed bad init value for down port index -6690833 opensm/ftree: simplify root guids setup. -90e3291 opensm/ftree: cleanup ftree_sw_tbl_element_t use -c07d245 opensm/qos_config: no invalid option message on default values -b382ad8 opensm: avoid memory leaks on config parameters reloading -45f57ce opensm/osm_ucast_ftree.c: Fixed bug on index port incrementation -3d618aa opensm/osm_subnet.c: break matching when config parameter already found -44d98e3 opensm/osm_subnet.c: clean_val() remove trailing quotation -173010a opensm/doc/perf-manager-arch.txt: Fix some commentary typos -83bf6c5 opensm/osm_subnet.c fix parse functions for big endian machines -6b9a1e9 opensm/PerfMgr: Primarily fix enhanced switch port 0 perf manager - operation -4f79a17 opensm/osm_perfmgr.c: In osm_perfmgr_init, eliminate memory leak - on error -22da81f opensm/osm_ucast_ftree.c: fix full topology dump -aa25fcb opensm/osm_port_info_rcv.c: don't clear sw->need_update if port 0 - is active -003bd4b opensm/osm_subnet.c Fix memory leak for QOS string parameters. -9cbbab2 opensm/opensm.spec: fix event plugin config options -996e8f6 OpenSM: update osmeventplugin example for the new TRAP event. -67f4c07 opensm/lash: simplify some memory allocations -3e6bcdb opensm/lash: fix memory leaks -3ff97b9 opensm/vendor: save some stack memory -ccc7621 opensm/osm_ucast_ftree.c: fixing errors in comments -1a802b3 Corrected incoherency in __osm_ftree_fabric_route_to_non_cns comments -85a7e54 opensm/osm_sm.c: fix MC group creation in race condition -aad1af2 opensm/osm_trap_rcv.c: Improvements in log_trap_info() -f619d67 opensm/osm_trap_rcv.c: Minor reorganization of trap_rcv_process_request -084335b opensm/link_mgr: verify port's lid -d525931 opensm/osm_vendor_ibumad: Use OSM_UMAD_MAX_AGENTS rather than - UMAD_CA_MAX_AGENTS -f342c62 opensm/osm_sa.c: don't ignore failure in osm_mgrp_add_port() -587fda4 osmtest/osmt_multicast.c: fix strict aliasing breakage warning -6931f3e opensm: make subnet's max mlid update implementation independent -30f1acd osm_ucast_ftree.c missing reset of ca_ports -ac04779 opensm: fix LFT allocation size -a7838d0 opensm/osm_ucast_cache: reduce OSM_LOG_INFO debug printouts -c027335 opensm/osm_ucast_updn.c: Further reduction in cas_per_sw allocation -e8ee292 opensm/opensm/osm_subnet.c: adjust buffer to ensure a '\n' is printed -84d9830 opensm/osm_ucast_updn.c: Reduce temporary allocation of cas_per_sw -347ad64 opensm/ib_types.h: Mask off client rereg bit in set_client_rereg -c2ab189 opensm/osm_state_mgr.c: in cleanup_switch() check only relevant - LFT part -40c93d3 use transportable constant attributes -c8fa71a osmtest -code cleanup - use strncasecmp() -770704a opensm/osm_mcast_mgr.c: In mcast_mgr_set_mft_block, fix node GUID - in log message -3d20f82 opensm/osm_sa_path_record.c: separate router guid resolution code -27ea3c8 opensm: fix gcc-4.4.1 warnings -c88bfd3 opensm/osm_lid_mgr.c: Fix typo in OSM_LOG message -a9ea08c opensm/osm_mesh.c: Add dump_mesh routine at OSM_LOG_DEBUG level -bc2a61e C++ style coding does not compile -6647600 opensm: remove meanless 'const' keywords in APIs -323a74f opensm/osm_qos_parser_y.y: fix endless loop -0121a81 opensm: fix endless looping in mcast_mgr -696c022 opensm: fix some obvious -Wsign-compare warnings -b91e3c3 opensm/osm_get_port_by_lid(): don't bother with lmc -ca582df opensm/osm_get_port_by_lid(): speedup a port lookup -fd846ee opensm/osm_mesh.c: simplify compare_switches() function -fe20080 osm_sa.c - void * arithmetic causes problems -220130f osm_helper.c use explicit value for struct init -0168ece use standard varargs syntax in macro OSM_LOG() -180b335 update functions to match .h prototypes -9240ef4 opensm/osm_ucast_lash: fix use after free bug -6f1a21a opensm: osm_get_port_by_lid() helper -c9e2818 opensm/osm_sa_path_record.c: validate multicast membership -225dcf5 opensm/osm_mesh.c: Remove edges in lash matrix -4dd928b opensm/osm_sa_mcmember_record.c: clean uninitialized variable use -c48f0bc opensm/osm_perfmgr_db.c: Fix memory leak of db nodes -82d3585 opensm/osm_notice.c: move logging code to separate function -9557f60 opensm/osm_inform.c: For traps 64-67, use GID from DataDetails in - log message -e2e78d9 opensm/opensm.8.in: Indicate default rule for Default partition -08c5beb opensm/osm_sa_node_record.c: dump NodeInfo with debug verbosity -1fe88f0 opensm/multicast: merge mcm_port and mcm_info -ba75747 opensm/multicast: consolidate port addition/removing code -5e61ab8 opensm: port object reference in mcm ports list -5c5dacf opensm: fix uninitialized return value in osm_sm_mcgrp_leave() -7cfe18d osm_ucast_ftree.c: Removed reverse_hop parameters from - fabric_route_upgoing_by_going_down -aa7fb47 opensm/multicast: kill mc group to_be_deleted flag -a4910fe opensm/osm_mcast_mgr.c: multicast routing by mlid - renaming -1d14060 opensm/multicast: remove change id tracking -5a84951 opensm: use mgrp pointer as osm_sm_mcgrp_join/leave() parameter -d8e3ff5 opensm: use mgrp pointer in port mcm_info -0631cd3 opensm doc: Indicated limited (rather than partial) partition - membership -1010535 opensm/osm_ucast_lash.c: In lash_core, return status -1 for all errors -942e20f opensm/osm_helper.c: Add SM priority changed into trap 144 description -2372999 opensm/osm_ucast_mgr: better lft setup -e268b32 opensm/osm_helper.c: Only change method when > rather than >= -9309e8c complib/cl_event.c: change nanosec var type long -d93b126 opensm/complib: account for nsec overflow in timeout values -ef4c8ac opensm/osm_qos_policy.c: matching PR query to QoS level with pkey -c93b58b opensm: fixing some data types in osm_req_get/set -2b89177 opensm/libvendor/osm_vendor_ibumad.c: Handle umad_alloc failure in - osm_vendor_get -2cba163 opensm/osm_helper.c: In osm_dump_dr_smp, fix endian of status -47397e3 opensm/osm_sm_mad_ctrl.c: Fix endian of status in error message -e83b7ca opensm/osm_mesh.c: Reorder switches for lash -9256239 opensm/osm_trap_rcv.c: Validate trap is 144 before checking for - NodeDescription changed -011d9ca opensm/osm_ucast_lash.c: Handle calloc failure in generate_cdg_for_sp -59964d7 opensm: fixing handling of opt.max_wire_smps -f4e3cd0 opensm/osm_ucast_lash.c: Directly call calloc/free rather than - create/delete_cdg -5a208bd opensm/osm_ucast_lash.c: Added error numbers to some error log messages -3b80d10 opensm/osm_helper.c: fix printing trap 258 details -f682fe0 opensm: do not configure MFTs when mcast support is disabled -cc42095 opensm/osm_sm_mad_ctrl.c: In sm_mad_ctrl_send_err_cb, indicate - failed attribute -aebf215 opensm/osm_ucast_lash.c: Remove osm_mesh_node_delete call from - switch_delete -1ef4694 opensm/osm_path.h: In osm_dr_path_init, only copy needed part of path -c594a2d opensm: osm_dr_path_extend can fail due to invalid hop count -46e5668 opensm/osm_lash: Fix use after free problem in osm_mesh_node_delete -81841dc opensm/osm_ucast_lash.c: Handle malloc failures better -2801203 opensm: remove extra "0x" from debug message. -88821d2 opensm/main.c: Display SMSL when specified -f814dcd opensm/osm_subnet.c: Format lash_start_vl consistent with other - uint8 items -66669c9 opensm/main.c: Display LASH start VL when specified -31bb0a7 opensm/osm_mcst_mgr.c: check number of switches only once -75e672c opensm: find MC group by MGID using fleximap -2b7260d Clarify the syntax of the hop_weights_file -e6f0070 opensm/osm_mesh.c: Improve VL utilization -27497a0 opensm/osm_ucast_ftree.c Fix assert comparing number of CAs to CN ports -3b98131 opensm/osm_qos_policy.c: Use proper size in malloc in - osm_qos_policy_vlarb_scope_create -e6f367d opensm/osm_ucast_ftree.c: Made error numbers unique in some log - messages -83261a8 osm_ucast_ftree.c Count number of hops instead of calculating it -7bdf4ff opensm/osm_sa_(path multipath)_record.c: Fix typo in a couple of - log messages -0f8ed87 opensm/osm_ucast_mgr.c: Add error numbers to some error log messages -0b5ccb4 complib/Makefile.am: prevent file duplications -e0b8ec9 opensm/osm_sminfo_rcv.c: clean type of smi_rcv_process_get_sm() -4d01005 opensm: sweep component processors return status value -6ad8d78 opensm/libvendor/osm_vendor_(ibumad mlx)_sa.c: Handle malloc - failure in __osmv_send_sa_req -cf97ebf opensm/osm_ucast_lash.(h c): Replace memory allocation by array -957461c opensm/osm_sa.c add attribute and component mask to error message -5d339a1 osm_dump.c dump port if lft is set up -518083d osm_port.c: check if op_vls = 0 before max_op_vls comparison -b6964cb opensm/osm_port.c: Change log level of Invalid OP_VLS 0 message - to VERBOSE -b27568c opensm/PerfMgr: Reduce host name length -bc495c0 opensm/osm_lid_mgr.c bug in opensm LID assignment -5a466fd opensm/osm_perfmgr_db.c: Remove unneeded initialization in - perfmgr_db_print_by_name -57cf328 opensm/osm_ucast_ftree.c Increase the size of the hop table -8323cf1 opensm/PerfMgr: Remove some underbars from internal names -65b1c15 opensm: Changes to spec and make files for updated release notes -cd226c7 OpenSM: include/vendor/osm_vendor.h - Replaced #elif with no - condition by #else -9f8bd4a management: Fixed custom_release in SPEC files -c0b8207 opensm/PerfMgr: Change redir_tbl_size to num_ports for better clarity -596bb08 opensm/osm_sa.c: check for SA DB file only if requested -2f2bd4e opensm SA DB dump/restore: load SA DB only once -4abcbf2 opensm: Added print_desc to various log messages -5e3d235 opensm/osm_vendor_ibumad.c: Move error info into single message -8e5ca10 opensm/libvendor//osm_vendor_ibumad_sa.c: uninitialized fields -d13c2b6 opensm/osm_sm_mad_ctrl.c Changes to some error messages -f79d315 opensm/osm_sm_mad_ctrl.c: Add missing call to return mad to mad pool -150a9b1 opensm/osm_sa_mcmember_record.c: print mcast join/create failures in - VERBOSE instead of DEBUG level -9b7882a opensm/osm_vendor_ibumad.c: Change LID format to decimal in log message -5256c43 opensm/osm_vendor_mlx: fix compilation error -93db10d opensm/osm_vendor_mlx_txn.c: eliminate bunch of compilation warnings -156fdc1 opensm/osm_helper.c Log format changes -7a55434 opensm/osm_ucast_ftree.c Changed log level -a1694de opensm/osm_state_mgr.c Added more info to some error messages -fdec20a opensm/osm_trap_rcv.c: Eliminate heavy sweep on receipt of trap 145 -13a32a7 opensm - standardize on a single Windows #define - take #2 -b236a10 opensm/osm_db_files.c: kill useless malloc() castings -4ba0c26 opensm/osm_db_files.c: add '/' path delimited -e3b98a5 opensm/osm_sm_mad_ctrl.c: Fix qp0_mads_accounting -dbbe5b3 opensm/osm_subnet.c: fixing bug in dumping options file -f22856a opensm/osm_ucast_mgr.c: fix memory leak -0d5f0b6 opensm: osm_get_mgrp_by_mgid() helper -e3c044a osm_sa_mcmember_record.c: pass MCM Record data to mlid allocator -3dda2dc opensm/osm_sa_member_record.c: mlid independent MGID generator -1f95a3c opensm/osm_sa_mcmember_record.c: move mgid allocation code -b78add1 complib: replace intn_t types by C99 intptr_t -a864fd3 osmtest/osmt_mtl_regular_qp.c: cleaning uintn_t use -9e01318 opensm/osm_console.c: make const functions -f8c4c3e opensm/osm_mgrp_new(): add subnet db insertion -80da047 complib/fleximap: make compar callback to return int -bf7fe2d opensm: cleanup intn_t uses -0862bba opensm/main.c: opensm cannot be killed while asking for port guid -2b70193 opensm/complib: bug in cl_list_insert_array_head/tail functions -4764199 opensm - use C99 transportable data type for pointer storage -a9c326c opensm/osm_state_mgr.c: do not probe remote side of port 0 -4945706 opensm/osm_mcast_mgr.c: fix return value on alloc_mfts() failures -8312a24 OpenSM: Fix unused variable compiler warning. -ab8f0a3 opensm/partition: keep multicast group pointer -a817430 opensm: Only clear SMP beyond end of PortInfo attribute -52fb6f2 opensm/osm_switch.h: Remove dead osm_switch_get_physp_ptr routine -aa6d932 opensm/osm_mcast_tbl.c: In osm_mcast_tbl_clear_mlid, use memset to - clear port mask entry -2ad846b opensm/osm_trap_rcv.c: use source_lid and port_num for logging -b9d7756 opensm/osm_mcast_tbl: Fix size of port mask table array -11c0a9b opensm/main.c: Use strtoul rather than strtol for parsing transaction - timeout -0608af9 opensm/osm_sm_mad_ctrl.c: In sm_mad_ctrl_send_err_cb, revert setting - of init failure on QoS initialization failures -c6b4d4a opensm/osm_vendor_ibumad.c: Add transaction ID to osm_vendor_send - log message -520af84 opensm/osm_sa_path_record.c: don't set dgid pointer for local subnet -4a878fb opensm/osm_mcast_mgr.c: fix osm_mcast_mgr_compute_max_hops for - managed switch - -* Other less critical or visible bugs were also fixed. - -5 Main Verification Flows -------------------------- - -OpenSM verification is run using the following activities: -* osmtest - a stand-alone program -* ibmgtsim (IB management simulator) based - a set of flows that - simulate clusters, inject errors and verify OpenSM capability to - respond and bring up the network correctly. -* small cluster regression testing - where the SM is used on back to - back or single switch configurations. The regression includes - multiple OpenSM dedicated tests. -* cluster testing - when we run OpenSM to setup a large cluster, perform - hand-off, reboots and reconnects, verify routing correctness and SA - responsiveness at the ULP level (IPoIB and SDP). - -5.1 osmtest - -osmtest is an automated verification tool used for OpenSM -testing. Its verification flows are described by list below. - -* Inventory File: Obtain and verify all port info, node info, link and path - records parameters. - -* Service Record: - - Register new service - - Register another service (with a lease period) - - Register another service (with service p_key set to zero) - - Get all services by name - - Delete the first service - - Delete the third service - - Added bad flows of get/delete non valid service - - Add / Get same service with different data - - Add / Get / Delete by different component mask values (services - by Name & Key / Name & Data / Name & Id / Id only ) - -* Multicast Member Record: - - Query of existing Groups (IPoIB) - - BAD Join with insufficient comp mask (o15.0.1.3) - - Create given MGID=0 (o15.0.1.4) - - Create given MGID=0xFF12A01C,FE800000,00000000,12345678 (o15.0.1.4) - - Create BAD MGID=0xFA. (o15.0.1.6) - - Create BAD MGID=0xFF12A01B w/ link-local not set (o15.0.1.6) - - New MGID with invalid join state (o15.0.1.9) - - Retry of existing MGID - See JoinState update (o15.0.1.11) - - BAD RATE when connecting to existing MGID (o15.0.1.13) - - Partial JoinState delete request - removing FullMember (o15.0.1.14) - - Full Delete of a group (o15.0.1.14) - - Verify Delete by trying to Join deleted group (o15.0.1.14) - - BAD Delete of IPoIB membership (no prev join) (o15.0.1.15) - -* GUIDInfo Record: - - All GUIDInfoRecords in subnet are obtained - -* MultiPathRecord: - - Perform some compliant and noncompliant MultiPathRecord requests - - Validation is via status in responses and IB analyzer - -* PKeyTableRecord: - - Perform some compliant and noncompliant PKeyTableRecord queries - - Validation is via status in responses and IB analyzer - -* LinearForwardingTableRecord: - - Perform some compliant and noncompliant LinearForwardingTableRecord queries - - Validation is via status in responses and IB analyzer - -* Event Forwarding: Register for trap forwarding using reports - - Send a trap and wait for report - - Unregister non-existing - -* Trap 64/65 Flow: Register to Trap 64-65, create traps (by - disconnecting/connecting ports) and wait for report, then unregister. - -* Stress Test: send PortInfoRecord queries, both single and RMPP and - check for the rate of responses as well as their validity. - - -5.2 IB Management Simulator OpenSM Test Flows: - -The simulator provides ability to simulate the SM handling of virtual -topologies that are not limited to actual lab equipment availability. -OpenSM was simulated to bring up clusters of up to 10,000 nodes. Daily -regressions use smaller (16 and 128 nodes clusters). - -The following test flows are run on the IB management simulator: - -* Stability: - Up to 12 links from the fabric are randomly selected to drop packets - at drop rates up to 90%. The SM is required to succeed in bringing the - fabric up. The resulting routing is verified to be correct as well. - -* LID Manager: - Using LMC = 2 the fabric is initialized with LIDs. Faults such as - zero LID, Duplicated LID, non-aligned (to LMC) LIDs are - randomly assigned to various nodes and other errors are randomly - output to the guid2lid cache file. The SM sweep is run 5 times and - after each iteration a complete verification is made to ensure that all - LIDs that could possibly be maintained are kept, as well as that all nodes - were assigned a legal LID range. - -* Multicast Routing: - Nodes randomly join the 0xc000 group and eventually the - resulting routing is verified for completeness and adherence to - Up/Down routing rules. - -* osmtest: - The complete osmtest flow as described in the previous table is run on - the simulated fabrics. - -* Stress Test: - This flow merges fabric, LID and stability issues with continuous - PathRecord, ServiceRecord and Multicast Join/Leave activity to - stress the SM/SA during continuous sweeps. InformInfo Set/Delete/Get - were added to the test such both existing and non existing nodes - perform them in random order. - -5.3 OpenSM Regression - -Using a back-to-back or single switch connection, the following set of -tests is run nightly on the stacks described in table 2. The included -tests are: - -* Stress Testing: Flood the SA with queries from multiple channel - adapters to check the robustness of the entire stack up to the SA. - -* Dynamic Changes: Dynamic Topology changes, through randomly - dropping SMP packets, used to test OpenSM adaptation to an unstable - network & verify DB correctness. - -* Trap Injection: This flow injects traps to the SM and verifies that it - handles them gracefully. - -* SA Query Test: This test exhaustively checks the SA responses to all - possible single component mask. To do that the test examines the - entire set of records the SA can provide, classifies them by their - field values and then selects every field (using component mask and a - value) and verifies that the response matches the expected set of records. - A random selection using multiple component mask bits is also performed. - -5.4 Cluster testing: - -Cluster testing is usually run before a distribution release. It -involves real hardware setups of 16 to 32 nodes (or more if a beta site -is available). Each test is validated by running all-to-all ping through the IB -interface. The test procedure includes: - -* Cluster bringup - -* Hand-off between 2 or 3 SM's while performing: - - Node reboots - - Switch power cycles (disconnecting the SM's) - -* Unresponsive port detection and recovery - -* osmtest from multiple nodes - -* Trap injection and recovery - - -6 Qualified Software Stacks and Devices ---------------------------------------- - -OpenSM Compatibility --------------------- -Note that OpenSM version 3.2.1 and earlier used a value of 1 in host -byte order for the default SM_Key, so there is a compatibility issue -with these earlier versions of OpenSM when the 3.2.2 or later version -is running on a little endian machine. This affects SM handover as well -as SA queries (saquery tool in infiniband-diags). - - -Table 2 - Qualified IB Stacks -============================= - -Stack | Version ------------------------------------------|-------------------------- -The main stream Linux kernel | 2.6.x -OFED | 1.5,1.5.x -OFED | 1.4 -OFED | 1.3 -OFED | 1.2 -OFED | 1.1 -OFED | 1.0 - -Table 3 - Qualified Devices and Corresponding Firmware -====================================================== - -Mellanox -Device | FW versions -------------------------------------|------------------------------- -InfiniScale | fw-43132 5.2.000 (and later) -InfiniScale III | fw-47396 0.5.000 (and later) -InfiniScale IV | fw-48436 7.1.000 (and later) -InfiniHost | fw-23108 3.5.000 (and later) -InfiniHost III Lx | fw-25204 1.2.000 (and later) -InfiniHost III Ex (InfiniHost Mode) | fw-25208 4.8.200 (and later) -InfiniHost III Ex (MemFree Mode) | fw-25218 5.3.000 (and later) -ConnectX IB | fw-25408 2.3.000 (and later) - -QLogic/PathScale -Device | Note ---------|----------------------------------------------------------- -iPath | QHT6040 (PathScale InfiniPath HT-460) -iPath | QHT6140 (PathScale InfiniPath HT-465) -iPath | QLE6140 (PathScale InfiniPath PE-880) -iPath | QLE7240 -iPath | QLE7280 - -Note 1: OpenSM does not run on an IBM Galaxy (eHCA) as it does not expose -QP0 and QP1. However, it does support it as a device on the subnet. - -Note 2: QoS firmware and Mellanox devices - -HCAs: QoS supported by ConnectX. QoS-enabled FW release is 2_5_000 and -later. - -Switches: QoS supported by InfiniScale III -Any InfiniScale III FW that is supported by OpenSM supports QoS. diff --git a/branches/opensm_3/user/doc/partition-config.txt b/branches/opensm_3/user/doc/partition-config.txt deleted file mode 100644 index 50e40def..00000000 --- a/branches/opensm_3/user/doc/partition-config.txt +++ /dev/null @@ -1,131 +0,0 @@ -OpenSM Partition configuration -=============================== - -The default name of OpenSM partitions configuration file is -'/etc/opensm/partitions.conf'. The default may be changed by -using the --Pconfig (-P) option with OpenSM. - -The default partition will be created by OpenSM unconditionally even -when partition configuration file does not exist or cannot be accessed. - -The default partition has P_Key value 0x7fff. OpenSM's port will always -have full membership in default partition. All other end ports will have -full membership if the partition configuration file is not found or cannot -be accessed, or limited membership if the file exists and can be accessed -but there is no rule for the Default partition. - -Effectively, this amounts to the same as if one of the following rules -below appear in the partition configuration file: -In the case of no rule for the Default partition: -Default=0x7fff : ALL=limited, SELF=full ; -In the case of no partition configuration file or file cannot be accessed: -Default=0x7fff : ALL=full ; - - -File Format -=========== - -Comments: --------- - -Line content followed after '#' character is comment and ignored by -parser. - - -General file format: -------------------- - -: ; - - -Partition Definition: --------------------- - -[PartitionName][=PKey][,flag[=value]][,defmember=full|limited] - -PartitionName - string, to be used with logging. When omitted - empty string will be used. -PKey - P_Key value for this partition. Only low 15 bits will - be used. When omitted will be autogenerated. -flag - used to indicate IPoIB capability of this partition. -defmember=full|limited - specifies default membership for port guid - list. Default is limited. - -Currently recognized flags are: - -ipoib - indicates that this partition may be used for IPoIB, as - result IPoIB capable MC group will be created. -rate= - specifies rate for this IPoIB MC group (default is 3 (10GBps)) -mtu= - specifies MTU for this IPoIB MC group (default is 4 (2048)) -sl= - specifies SL for this IPoIB MC group (default is 0) -scope= - specifies scope for this IPoIB MC group (default is 2 (link -local)) - -Note that values for 'rate', 'mtu'. and 'scope' should be specified as defined -in the IBTA specification (for example mtu=4 for 2048). - - -PortGUIDs list: --------------- - -[PortGUID[=full|=limited]] [,PortGUID[=full|=limited]] [,PortGUID] ... - -PortGUID - GUID of partition member EndPort. Hexadecimal numbers - should start from 0x, decimal numbers are accepted too. -full or - indicates full or limited membership for this port. When - limited omitted (or unrecognized) limited membership is assumed. - -There are two useful keywords for PortGUID definition: - -- 'ALL' means all end ports in this subnet. -- 'ALL_CAS' means all Channel Adapter end ports in this subnet. -- 'ALL_SWITCHES' means all Switch end ports in this subnet. -- 'ALL_ROUTERS' means all Router end ports in this subnet. -- 'SELF' means subnet manager's port. - -Empty list means no ports in this partition. - - -Notes: ------ - -White spaces are permitted between delimiters ('=', ',',':',';'). - -The Line can be wrapped after ':' followed after Partition Definition and -between. - -PartitionName does not need to be unique, PKey does need to be unique. -If PKey is repeated then those partition configurations will be merged -and first PartitionName will be used (see also next note). - -It is possible to split partition configuration in more than one -definition, but then PKey should be explicitly specified (otherwise -different PKey values will be generated for those definitions). - - -Examples: --------- - -Default=0x7fff : ALL, SELF=full ; -Default=0x7fff : ALL, ALL_SWITCHES=full, SELF=full ; - -NewPartition , ipoib : 0x123456=full, 0x3456789034=limi, 0x2134af2306 ; - -YetAnotherOne = 0x300 : SELF=full ; -YetAnotherOne = 0x300 : ALL=limited ; - -ShareIO = 0x80 , defmember=full : 0x123451, 0x123452; # 0x123453, 0x123454 will be limited -ShareIO = 0x80 : 0x123453, 0x123454, 0x123455=full; # 0x123456, 0x123457 will be limited -ShareIO = 0x80 : defmember=limited : 0x123456, 0x123457, 0x123458=full; -ShareIO = 0x80 , defmember=full : 0x123459, 0x12345a; -ShareIO = 0x80 , defmember=full : 0x12345b, 0x12345c=limited, 0x12345d; - - -Note: ----- - -The following rule is equivalent to how OpenSM used to run prior to the -partition manager: - -Default=0x7fff,ipoib:ALL=full; - diff --git a/branches/opensm_3/user/doc/perf-manager-arch.txt b/branches/opensm_3/user/doc/perf-manager-arch.txt deleted file mode 100644 index 2fc1fd25..00000000 --- a/branches/opensm_3/user/doc/perf-manager-arch.txt +++ /dev/null @@ -1,181 +0,0 @@ -Performance Manager -2/12/07 - -This document will describe an architecture and a phased plan -for an OpenFabrics OpenIB performance manager. - -Currently, there is no open source performance manager, only -a perfquery diagnostic tool which some have scripted into a -"poor man's" performance manager. - -The primary responsibilities of the performance manager are to: -1. Monitor subnet topology -2. Based on subnet topology, monitor performance and error counters. - Also, possibly monitor counters related to congestion. -3. Perform data reduction (various calculations (rates, histograms, etc.)) - on counters obtained -4. Log performance data and indicate "interesting" related events - - -Performance Manager Components -1. Determine subnet topology - Performance manager can determine the subnet topology by subscribing - for GID in and out of service events. Upon receipt of a GID in service - event, use GID to query SA for corresponding LID by using SubnAdmGet - NodeRecord with PortGUID specified. It would utilize the LID and NumPorts - returned and add this to the monitoring list. Note that the monitoring - list can be extended to be distributed with the manager "balancing" the - assignments of new GIDs to the set of known monitors. For GID out of - service events, the GID is removed from the monitoring list. - -2. Monitoring - Counters to be monitored include performance counters (data octets and - packets both receive and transmit) and error counters. These are all in - the mandatory PortCounters attribute. Future support will include the - optional 64 bit counters, PortExtendedCounters (as this is only known - to be supported on one IB device currently). Also, one congestion - counter (PortXmitWait) will also be monitored (on switch ports) initially. - - Polling rather than sampling will be used as the monitoring technique. The - polling rate configurable from 1-65535 seconds (default TBD) - Note that with 32 bit counters, on 4x SDR links, byte counts can max out in - 16 seconds and on 4x DDR links in 8 seconds. The polling rate needs to - deal with this as accurate byte and packet rates are desired. Since IB - counters are sticky, the counters need to be reset when they get "close" - to max'ing out. This will result in some inaccuracy. When counters are - reset, the time of the reset will be tracked in the monitor and will be - queryable. Note that when the 64 bit counters are supported more generally, - the polling rate can be reduced. - - The performance manager will support parallel queries. The level of - parallelism is configurable with a default of 64 queries outstanding - at one time. - - Configuration and dynamic adjustment of any performance manager "knobs" - will be supported. - - Also, there will be a console interface to obtain performance data. - It will be able to reset counters, report on specific nodes or - node types of interest (CAs only, switches only, all, ...). The - specifics are TBD. - -3. Data Reduction - For errors, rate rather than raw value will be calculated. Error - event is only indicated when rate exceeds a threshold. - For packet and byte counters, small changes will be aggregated - and only significant changes are updated. - Aggregated histograms (per node, all nodes (this is TBD))) for each - counter will be provided. Actual counters will also be written to files. - NodeGUID will be used to identify node. File formats are TBD. One - format to be supported might be CSV. - -4. Logging - "Interesting" events determined by the performance manager will be - logged as well as the performance data itself. Significant events - will be logged to syslog. There are some interesting scalability - issues relative to logging especially for the distributed model. - - Events will be based on rates which are configured as thresholds. - There will be configurable thresholds for the error counters with - reasonable defaults. Correlation of PerfManager and SM events is - interesting but not a mandatory requirement. - - -Performance Manager Scalability -Clearly as the polling rate goes up, the number of nodes which can be -monitored from a single performance management node decreases. There is -some evidence that a single dedicated management node may not be able to -monitor the largest clusters at a rapid rate. - -There are numerous PerfManager models which can be supported: -1. Integrated as thread(s) with OpenSM (run only when SM is master) -2. Standby SM -3. Standalone PerfManager (not running with master or standby SM) -4. Distributed PerfManager (most scalable approach) - -Note that these models are in order of implementation complexity and -hence "schedule". - -The simplest model is to run the PerfManager with the master SM. This has -the least scalability but is the simplest model. Note that in this model -the topology can be obtained without the GID in and out of service events -but this is needed for any of the other models to be supported. - -The next model is to run the PerfManager with a standby SM. Standbys are not -doing much currently (polling the master) so there is much idle CPU. -The downside of this approach is that if the standby takes over as master, -the PerfManager would need to be moved (or is becomes model 1). - -A totally separate standlone PerfManager would allow for a deployment -model which eliminates the downside of model 2 (standby SM). It could -still be built in a similar manner with model 2 with unneeded functions -(SM and SA) not included. The advantage of this model is that it could -be more readily usable with a vendor specific SM (switch based or otherwise). -Vendor specific SMs usually come with a built-in performance manager and -this assumes that there would be a way to disable that performance manager. -Model 2 can act like model 3 if a disable SM feature is supported in OpenSM -(command line/console). This will take the SM to not active. - -The most scalable model is a distributed PerfManager. One approach to -distribution is a hierarchial model where there is a PerfManager at the -top level with a number of PerfMonitors which are responsible for some -portion of the subnet. - -The separation of PerfManager from OpenSM brings up the following additional -issues: -1. What communication is needed between OpenSM and the PerfManager ? -2. Integration of interesting events with OpenSM log -(Does performance manager assume OpenSM ? Does it need to work with vendor -SMs ?) - -Hierarchial distribution brings up some additional issues: -1. How is the hierarchy determined ? -2. How do the PerfManager and PerfMonitors find each other ? -3. How is the subnet divided amongst the PerfMonitors -4. Communication amongst the PerfManager and the PerfMonitors -(including communication failures) - -In terms of inter manager communication, there seem to be several -choices: -1. Use vendor specific MADs (which can be RMPP'd) and build on top of -this -2. Use RC QP communication and build on top of this -3. Use IPoIB which is much more powerful as sockets can then be utilized - -RC QP communication improves on the lower performance of the vendor -specific MAD approach but is not as powerful as the socket based approach. - -The only downside of IPoIB is that it requires multicast to be functioning. -It seems reasonable to require IPoIB across the management nodes. This -can either be a separate IPoIB subnet or a shared one with other endnodes -on the subnet. (If this communication is built on top of sockets, it -can be any IP subnet amongst the manager nodes). - -The first implementation phase will address models 1-3. Model 3 is optional -as it is similar to models 1 and 2 and may be not be needed. - -Model 4 will be addressed in a subsequent implementation phase (and a future -version of this document). Model 4 can be built on the basis of models 1 and -2 where some SM, not necessarily master, is the PerfManager and the rest are -PerfMonitors. - - -Performance Manager Partition Membership -Note that as the performance manager needs to talk via GSI to the PMAs -in all the end nodes and GSI utilizes PKey sharing, partition membership -if invoked must account for this. - -The most straightforward deployment of the performance manager is -to have it be a member of the full default partition (P_Key 0xFFFF). - - -Performance Manager Redundancy -TBD (future version of this document) - - -Congestion Management -TBD (future version of this document) - - -QoS Management -TBD (future version of this document) diff --git a/branches/opensm_3/user/doc/performance-manager-HOWTO.txt b/branches/opensm_3/user/doc/performance-manager-HOWTO.txt deleted file mode 100644 index 078e8b48..00000000 --- a/branches/opensm_3/user/doc/performance-manager-HOWTO.txt +++ /dev/null @@ -1,154 +0,0 @@ -OpenSM Performance manager HOWTO -================================ - -Introduction -============ - -OpenSM now includes a performance manager which collects Port counters from -the subnet and stores them internally in OpenSM. - -Some of the features of the performance manager are: - - 1) Collect port data and error counters per v1.2 spec and store in - 64 bit internal counts. - 2) Automatic reset of counters when they reach approximatly 3/4 full. - (While not guarenteeing that counts will not be missed this does - keep counts incrementing as best as possible given the current - hardware limitations.) - 3) Basic warnings in the OpenSM log on "critical" errors like symbol - errors. - 4) Automatically detects "outside" resets of counters and adjusts to - continue collecting data. - 5) Can be run when OpenSM is in standby or inactive states in - addition to master state. - -Known issues are: - - 1) Data counters will be lost on high data rate links. Sweeping the - fabric fast enough for even a DDR link is not practical. - 2) Default partition support only. - - -Setup and Usage -=============== - -Using the Performance Manager consists of 3 steps: - - 1) compiling in support for the perfmgr (Optionally: the console - socket as well) - 2) enabling the perfmgr and console in opensm.conf - 3) retrieving data which has been collected. - 3a) using console to "dump data" - 3b) using a plugin module to store the data to your own - "database" - -Step 1: Compile in support for the Performance Manager ------------------------------------------------------- - -Because of the performance manager's experimental status, it is not enabled at -compile time by default. (This will hopefully soon change as more people use -it and confirm that it does not break things... ;-) The configure option is -"--enable-perf-mgr". - -At this time it is really best to enable the console socket option as well. -OpenSM can be run in an "interactive" mode. But with the console socket option -turned on one can also make a connection to a running OpenSM. The console -option is "--enable-console-socket". This option requires the use of -tcp_wrappers to ensure security. Please be aware of your configuration for -tcp_wrappers as the commands presented in the console can affect the operation -of your subnet. - -The following configure line includes turning on the performance manager as -well as the console: - - ./configure --enable-perf-mgr --enable-console-socket - - -Step 2: Enable the perfmgr and console in opensm.conf ------------------------------------------------------ - -Turning the Perfmorance Manager on is pretty easy, set the following options in -the opensm.conf config file. (Default location is -/usr/local/etc/opensm/opensm.conf) - - # Turn it all on. - perfmgr TRUE - - # sweep time in seconds - perfmgr_sweep_time_s 180 - - # Dump file to dump the events to - event_db_dump_file /var/log/opensm_port_counters.log - -Also enable the console socket and configure the port for it to listen to if -desired. - - # console [off|local|socket] - console socket - - # Telnet port for console (default 10000) - console_port 10000 - -As noted above you also need to set up tcp_wrappers to prevent unauthorized -users from connecting to the console.[*] - - [*] As an alternate you can use the loopback mode but I noticed when - writing this (OpenSM v3.1.10; OFED 1.3) that there are some bugs in - specifying the loopback mode in the opensm.conf file. Look for this to - be fixed in newer versions. - - [**] Also you could use "local" but this is only useful if you run - OpenSM in the foreground of a terminal. As OpenSM is usually started - as a daemon I left this out as an option. - -Step 3: retrieve data which has been collected ----------------------------------------------- - -Step 3a: Using console dump function ------------------------------------- - -The console command "perfmgr dump_counters" will dump counters to the file -specified in the opensm.conf file. In the example above -"/var/log/opensm_port_counters.log" - -Example output is below: - - -"SW1 wopr ISR9024D (MLX4 FW)" 0x8f10400411f56 port 1 (Since Mon May 12 13:27:14 2008) - symbol_err_cnt : 0 - link_err_recover : 0 - link_downed : 0 - rcv_err : 0 - rcv_rem_phys_err : 0 - rcv_switch_relay_err : 2 - xmit_discards : 0 - xmit_constraint_err : 0 - rcv_constraint_err : 0 - link_integrity_err : 0 - buf_overrun_err : 0 - vl15_dropped : 0 - xmit_data : 470435 - rcv_data : 405956 - xmit_pkts : 8954 - rcv_pkts : 6900 - unicast_xmit_pkts : 0 - unicast_rcv_pkts : 0 - multicast_xmit_pkts : 0 - multicast_rcv_pkts : 0 - - - -Step 3b: Using a plugin module ------------------------------- - -If you want a more automated method of retrieving the data OpenSM provides a -plugin interface to extend OpenSM. The header file is osm_event_plugin.h. -The functions you register with this interface will be called when data is -collected. You can then use that data as appropriate. - -An example plugin can be configured at compile time using the -"--enable-default-event-plugin" option on the configure line. This plugin is -very simple. It logs "events" received from the performance manager to a log -file. I don't recommend using this directly but rather use it as a template to -create your own plugin. - diff --git a/branches/opensm_3/user/doc/qos-config.txt b/branches/opensm_3/user/doc/qos-config.txt deleted file mode 100644 index b71bf1d8..00000000 --- a/branches/opensm_3/user/doc/qos-config.txt +++ /dev/null @@ -1,44 +0,0 @@ -Trivial low level QoS configuration proposition -=============================================== - -Basically there is a set of QoS related low-level configuration parameters. -All these parameter names are prefixed by "qos_" string. Here is a full -list of these parameters: - - qos_max_vls - The maximum number of VLs that will be on the subnet - qos_high_limit - The limit of High Priority component of VL Arbitration - table (IBA 7.6.9) - qos_vlarb_low - Low priority VL Arbitration table (IBA 7.6.9) template - qos_vlarb_high - High priority VL Arbitration table (IBA 7.6.9) template - Both VL arbitration templates are pairs of VL and weight - qos_sl2vl - SL2VL Mapping table (IBA 7.6.6) template. It is a list - of VLs corresponding to SLs 0-15 (Note the VL15 used - here means drop this SL) - -Typical default values (hard-coded in OpenSM initialization) are: - - qos_max_vls 15 - qos_high_limit 0 - qos_vlarb_low 0:0,1:4,2:4,3:4,4:4,5:4,6:4,7:4,8:4,9:4,10:4,11:4,12:4,13:4,14:4 - qos_vlarb_high 0:4,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0 - qos_sl2vl 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7 - -The syntax is compatible with rest of OpenSM configuration options and -values may be stored in OpenSM config file (cached options file). - -In addition to the above, we may define separate QoS configuration -parameters sets for various target types. As targets, we currently support -CAs, routers, switch external ports, and switch's enhanced port 0. The -names of such specialized parameters are prefixed by "qos__" -string. Here is a full list of the currently supported sets: - - qos_ca_ - QoS configuration parameters set for CAs. - qos_rtr_ - parameters set for routers. - qos_sw0_ - parameters set for switches' port 0. - qos_swe_ - parameters set for switches' external ports. - -Examples: - - qos_sw0_max_vls 2 - qos_ca_sl2vl 0,1,2,3,5,5,5,12,12,0, - qos_swe_high_limit 0 diff --git a/branches/opensm_3/user/ibtrapgen/Makefile b/branches/opensm_3/user/ibtrapgen/Makefile deleted file mode 100644 index a0c06273..00000000 --- a/branches/opensm_3/user/ibtrapgen/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source -# file to this component. This file merely indirects to the real make file -# that is shared by all the driver components of the OpenIB Windows project. -# - -!INCLUDE ..\..\..\..\inc\openib.def diff --git a/branches/opensm_3/user/ibtrapgen/SOURCES b/branches/opensm_3/user/ibtrapgen/SOURCES deleted file mode 100644 index b479a708..00000000 --- a/branches/opensm_3/user/ibtrapgen/SOURCES +++ /dev/null @@ -1,70 +0,0 @@ -!if $(FREEBUILD) -TARGETNAME=ibtrapgen -!else -TARGETNAME=ibtrapgend -!endif - -!if !defined(WINIBHOME) -WINIBHOME=..\..\..\.. -!endif - -LIBPATH=$(WINIBHOME)\bin\user\obj$(BUILD_ALT_DIR) - -!if defined(OSM_TARGET) -TARGETPATH=$(OSM_TARGET)\bin\user\obj$(BUILD_ALT_DIR) -!else -TARGETPATH=$(WINIBHOME)\bin\user\obj$(BUILD_ALT_DIR) -!endif - -!INCLUDE ..\mad-vendor.inc - -TARGETTYPE=PROGRAM -UMTYPE=console -USE_MSVCRT=1 -OVR_DIR=..\addon - - -SOURCES=\ - main.c \ - ibtrapgen.c \ - osm_files.c - - -OSM_HOME=.. - -TARGETLIBS=\ - $(SDK_LIB_PATH)\kernel32.lib \ - $(SDK_LIB_PATH)\ws2_32.lib \ -!if $(FREEBUILD) - $(VENDOR_LIBS) \ - $(LIBPATH)\*\ibal.lib \ - $(LIBPATH)\*\complib.lib -!else - $(VENDOR_LIBSD) \ - $(LIBPATH)\*\ibald.lib \ - $(LIBPATH)\*\complibd.lib -!endif - -INCLUDES= \ - $(WINIBHOME)\inc; \ - $(WINIBHOME)\inc\user; \ - $(WINIBHOME)\inc\user\linux; \ - $(VENDOR_INC); \ - $(OSM_HOME); \ - $(OSM_HOME)\include; - -# Could be any special flag needed for this project -USER_C_FLAGS=$(USER_C_FLAGS) /MD - -#Add preproccessor definitions -C_DEFINES=$(C_DEFINES) -D__WIN__ -D$(VENDOR_IF) -DHAVE_CONFIG_H - -!if !$(FREEBUILD) -#C_DEFINES=$(C_DEFINES) -D_DEBUG -DDEBUG -DDBG -C_DEFINES=$(C_DEFINES) -!endif - -LINKER_FLAGS= $(LINKER_FLAGS) - -MSC_WARNING_LEVEL= /W3 /wd4090 - diff --git a/branches/opensm_3/user/ibtrapgen/ibtrapgen.c b/branches/opensm_3/user/ibtrapgen/ibtrapgen.c deleted file mode 100644 index e1244741..00000000 --- a/branches/opensm_3/user/ibtrapgen/ibtrapgen.c +++ /dev/null @@ -1,441 +0,0 @@ -/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - This software program is available to you under a choice of one of two - licenses. You may choose to be licensed under either the GNU General Public - License (GPL) Version 2, June 1991, available at - http://www.fsf.org/copyleft/gpl.html, or the Intel BSD + Patent License, - the text of which follows: - - "Recipient" has requested a license and Intel Corporation ("Intel") - is willing to grant a license for the software entitled - InfiniBand(tm) System Software (the "Software") being provided by - Intel Corporation. - - The following definitions apply to this License: - - "Licensed Patents" means patent claims licensable by Intel Corporation which - are necessarily infringed by the use or sale of the Software alone or when - combined with the operating system referred to below. - - "Recipient" means the party to whom Intel delivers this Software. - "Licensee" means Recipient and those third parties that receive a license to - any operating system available under the GNU Public License version 2.0 or - later. - - Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - - The license is provided to Recipient and Recipient's Licensees under the - following terms. - - Redistribution and use in source and binary forms of the Software, with or - without modification, are permitted provided that the following - conditions are met: - Redistributions of source code of the Software may retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form of the Software may reproduce the above - copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of Intel Corporation nor the names of its contributors shall - be used to endorse or promote products derived from this Software without - specific prior written permission. - - Intel hereby grants Recipient and Licensees a non-exclusive, worldwide, - royalty-free patent license under Licensed Patents to make, use, sell, offer - to sell, import and otherwise transfer the Software, if any, in source code - and object code form. This license shall include changes to the Software that - are error corrections or other minor changes to the Software that do not add - functionality or features when the Software is incorporated in any version of - a operating system that has been distributed under the GNU General Public - License 2.0 or later. This patent license shall apply to the combination of - the Software and any operating system licensed under the GNU Public License - version 2.0 or later if, at the time Intel provides the Software to - Recipient, such addition of the Software to the then publicly - available versions of such operating system available under the GNU - Public License version 2.0 or later (whether in gold, beta or alpha - form) causes such combination to be covered by the Licensed - Patents. The patent license shall not apply to any other - combinations which include the Software. No hardware per se is - licensed hereunder. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------*/ - -/* - * Abstract: - * Implementation of ibtrapgen_t. - * - * Environment: - * Linux User Mode - * - * $Revision: 1.2 $ - */ - -#include -#include -#include -#include -#include -#include -#include -#include "ibtrapgen.h" - -#define GUID_ARRAY_SIZE 64 - -/********************************************************************** - **********************************************************************/ -/* - This function initializes the main object, the log and the Osm Vendor -*/ -ib_api_status_t -ibtrapgen_init( IN ibtrapgen_t * const p_ibtrapgen, - IN ibtrapgen_opt_t * const p_opt, - IN const osm_log_level_t log_flags - ) -{ - ib_api_status_t status; - - /* just making sure - cleanup the static global obj */ - cl_memclr( p_ibtrapgen, sizeof( *p_ibtrapgen ) ); - - /* construct and init the log */ - p_ibtrapgen->p_log = (osm_log_t *)cl_malloc(sizeof(osm_log_t)); - osm_log_construct( p_ibtrapgen->p_log ); - status = osm_log_init( p_ibtrapgen->p_log, p_opt->force_log_flush, - 0x0001, p_opt->log_file,FALSE ); - if( status != IB_SUCCESS ) - return ( status ); - - osm_log_set_level( p_ibtrapgen->p_log, log_flags ); - - /* finaly can declare we are here ... */ - osm_log( p_ibtrapgen->p_log, OSM_LOG_FUNCS, - "ibtrapgen_init: [\n" ); - - /* assign all the opts */ - p_ibtrapgen->p_opt = p_opt; - - /* initialize the osm vendor service object */ - p_ibtrapgen->p_vendor = osm_vendor_new( p_ibtrapgen->p_log, - p_opt->transaction_timeout ); - - if( p_ibtrapgen->p_vendor == NULL ) - { - status = IB_INSUFFICIENT_RESOURCES; - osm_log( p_ibtrapgen->p_log, OSM_LOG_ERROR, - "ibtrapgen_init: ERR 0001: " - "Unable to allocate vendor object" ); - goto Exit; - } - - /* all mads (actually wrappers) are taken and returned to a pool */ - osm_mad_pool_construct( &p_ibtrapgen->mad_pool ); - status = osm_mad_pool_init( &p_ibtrapgen->mad_pool ); - if( status != IB_SUCCESS ) - goto Exit; - - Exit: - osm_log( p_ibtrapgen->p_log, OSM_LOG_FUNCS, - "ibtrapgen_init: ]\n" ); - return ( status ); -} - -/****f* opensm: SM/__ibtrapgen_rcv_callback - * NAME - * __osm_sm_mad_ctrl_rcv_callback - * - * DESCRIPTION - * This is the callback from the transport layer for received MADs. - * - * SYNOPSIS - */ -void -__ibtrapgen_rcv_callback( - IN osm_madw_t *p_madw, - IN void *bind_context, - IN osm_madw_t *p_req_madw ) -{ - ibtrapgen_t* p_ibtrapgen = (ibtrapgen_t*)bind_context; - - OSM_LOG_ENTER( p_ibtrapgen->p_log ); - - CL_ASSERT( p_madw ); - - OSM_LOG( p_ibtrapgen->p_log, OSM_LOG_VERBOSE, - "Got callback trans_id %64I\n", - cl_ntoh64(p_madw->p_mad->trans_id) ); - - OSM_LOG_EXIT( p_ibtrapgen->p_log ); -} - -/****f* opensm: SM/__ibtrapgen_send_err_cb - * NAME - * __ibtrapgen_send_err_cb - * - * DESCRIPTION - * This is the callback from the transport layer for received MADs. - * - * SYNOPSIS - */ -void -__ibtrapgen_send_err_cb( - IN void *bind_context, - IN osm_madw_t *p_madw ) -{ - ibtrapgen_t* p_ibtrapgen = (ibtrapgen_t*)bind_context; - - OSM_LOG_ENTER( p_ibtrapgen->p_log ); - - osm_log( p_ibtrapgen->p_log, OSM_LOG_ERROR, - "__ibtrapgen_send_err_cb: ERR 0011: " - "MAD completed in error (%s).\n", - ib_get_err_str( p_madw->status ) ); - - CL_ASSERT( p_madw ); - - osm_log( p_ibtrapgen->p_log, OSM_LOG_ERROR, - "__ibtrapgen_send_err_cb: ERR 0012: " - "We shouldn't be here!! TID:0x%016" PRIx64 ".\n", - cl_ntoh64(p_madw->p_mad->trans_id) ); - OSM_LOG_EXIT( p_ibtrapgen->p_log ); -} - -/********************************************************************** - **********************************************************************/ -ib_api_status_t -ibtrapgen_bind( IN ibtrapgen_t * p_ibtrapgen ) -{ - ib_api_status_t status; - uint32_t num_ports = GUID_ARRAY_SIZE; - ib_port_attr_t attr_array[GUID_ARRAY_SIZE]; - osm_bind_info_t bind_info; - uint8_t i; - - OSM_LOG_ENTER( p_ibtrapgen->p_log ); - - /* - * Call the transport layer for a list of local port - * GUID values. - */ - status = osm_vendor_get_all_port_attr( p_ibtrapgen->p_vendor, - attr_array, &num_ports ); - if ( status != IB_SUCCESS ) - { - osm_log( p_ibtrapgen->p_log, OSM_LOG_ERROR, - "ibtrapgen_bind: ERR 0002: " - "Failure getting local port attributes (%s)\n", - ib_get_err_str( status ) ); - goto Exit; - } - - /* make sure the requested port exists */ - if ( p_ibtrapgen->p_opt->port_num > num_ports ) - { - osm_log( p_ibtrapgen->p_log, OSM_LOG_ERROR, - "ibtrapgen_bind: ERR 0003: " - "Given port number out of range %u > %u\n", - p_ibtrapgen->p_opt->port_num , num_ports ); - status = IB_NOT_FOUND; - goto Exit; - } - - for ( i = 0 ; i < num_ports ; i++ ) - { - osm_log(p_ibtrapgen->p_log, OSM_LOG_INFO, - "ibtrapgen_bind: Found port number:%u " - " with GUID:0x%016" PRIx64 "\n", - i, cl_ntoh64(attr_array[i].port_guid) ); - } - /* check if the port is active */ -/* if (attr_array[p_ibtrapgen->p_opt->port_num - 1].link_state < 4) */ -/* { */ -/* osm_log( p_ibtrapgen->p_log, OSM_LOG_ERROR, */ -/* "ibtrapgen_bind: ERR 0004: " */ -/* "Given port number link state is not active: %s.\n", */ -/* ib_get_port_state_str( */ -/* attr_array[p_ibtrapgen->p_opt->port_num - 1].link_state ) */ -/* ); */ -/* status = IB_NOT_FOUND; */ -/* goto Exit; */ -/* } */ - - p_ibtrapgen->port_guid = attr_array[p_ibtrapgen->p_opt->port_num - 1].port_guid; - /* save sm_lid as we need it when sending the Trap (dest lid)*/ - p_ibtrapgen->p_opt->sm_lid = attr_array[p_ibtrapgen->p_opt->port_num - 1].sm_lid; - - osm_log(p_ibtrapgen->p_log, OSM_LOG_DEBUG, - "ibtrapgen_bind: Port Num:%u " - "GUID:0x%016"PRIx64"\n", - p_ibtrapgen->p_opt->port_num, - p_ibtrapgen->port_guid ); - - /* ok finaly bind the sa interface to this port */ - /* TODO - BIND LIKE THE osm_sm_mad_ctrl does */ - bind_info.class_version = 1; - bind_info.is_report_processor = TRUE; - bind_info.is_responder = TRUE; - bind_info.is_trap_processor = TRUE; - bind_info.mad_class = IB_MCLASS_SUBN_LID; - bind_info.port_guid = p_ibtrapgen->port_guid; - bind_info.recv_q_size = OSM_SM_DEFAULT_QP0_RCV_SIZE; - bind_info.send_q_size = OSM_SM_DEFAULT_QP0_SEND_SIZE; - - osm_log(p_ibtrapgen->p_log, OSM_LOG_DEBUG, - "ibtrapgen_bind: Trying to bind to GUID:0x%016"PRIx64"\n", - bind_info.port_guid ); - - p_ibtrapgen->h_bind = osm_vendor_bind( p_ibtrapgen->p_vendor, - &bind_info, - &p_ibtrapgen->mad_pool, - __ibtrapgen_rcv_callback, - __ibtrapgen_send_err_cb, - p_ibtrapgen ); - - if( p_ibtrapgen->h_bind == OSM_BIND_INVALID_HANDLE ) - { - osm_log( p_ibtrapgen->p_log, OSM_LOG_ERROR, - "ibtrapgen_bind: ERR 0005: " - "Unable to bind to SA\n" ); - status = IB_ERROR; - goto Exit; - } - - Exit: - OSM_LOG_EXIT( p_ibtrapgen->p_log ); - return ( status ); -} - -/********************************************************************** - **********************************************************************/ -void -ibtrapgen_destroy( IN ibtrapgen_t * p_ibtrapgen ) -{ - if( p_ibtrapgen->p_vendor ) - { - osm_vendor_delete( &p_ibtrapgen->p_vendor ); - } - - osm_log_destroy( p_ibtrapgen->p_log ); - cl_free( p_ibtrapgen->p_log ); -} - -/********************************************************************** - **********************************************************************/ - -ib_api_status_t -ibtrapgen_run( IN ibtrapgen_t * const p_ibtrapgen ) -{ - osm_madw_t* p_report_madw; - ib_mad_notice_attr_t* p_report_ntc; - ib_mad_t* p_mad; - ib_smp_t* p_smp_mad; - osm_mad_addr_t mad_addr; - static atomic32_t trap_fwd_trans_id = 0x02DAB000; - ib_api_status_t status; - osm_log_t *p_log = p_ibtrapgen->p_log; - uint16_t i; - - OSM_LOG_ENTER( p_log ); - - osm_log( p_log, OSM_LOG_INFO, - "ibtrapgen_run: " - "Sending trap:%u from LID:0x%X %u times\n", - p_ibtrapgen->p_opt->trap_num, - p_ibtrapgen->p_opt->lid, - p_ibtrapgen->p_opt->number ); - - printf("-V- SM lid is : 0x%04X\n",cl_ntoh16(p_ibtrapgen->p_opt->sm_lid)); - mad_addr.dest_lid = (p_ibtrapgen->p_opt->sm_lid); - /* ??? - what is path_bits? What should be the value here?? */ - mad_addr.path_bits = 0; - /* ??? - what is static_rate? What should be the value here?? */ - mad_addr.static_rate = 0; - - mad_addr.addr_type.smi.source_lid = cl_hton16(p_ibtrapgen->p_opt->lid); - mad_addr.addr_type.smi.port_num = p_ibtrapgen->p_opt->src_port; - - for (i = 1 ; i <= p_ibtrapgen->p_opt->number ; i++ ) - { - p_report_madw = osm_mad_pool_get( &p_ibtrapgen->mad_pool, - p_ibtrapgen->h_bind, - MAD_BLOCK_SIZE, - &mad_addr ); - - if( !p_report_madw ) - { - osm_log(p_log, OSM_LOG_ERROR, - "ibtrapgen_run: ERR 00020: " - "osm_mad_pool_get failed.\n" ); - status = IB_ERROR; - goto Exit; - } - - p_report_madw->resp_expected = FALSE; - - /* advance trap trans id (cant simply ++ on some systems inside ntoh) */ - p_mad = osm_madw_get_mad_ptr( p_report_madw ); - ib_mad_init_new(p_mad, - IB_MCLASS_SUBN_LID, - 1, - IB_MAD_METHOD_TRAP, - cl_hton64( (uint64_t)cl_atomic_inc( &trap_fwd_trans_id ) ), - IB_MAD_ATTR_NOTICE, - 0); - - p_smp_mad = osm_madw_get_smp_ptr( p_report_madw ); - - /* The payload is analyzed as mad notice attribute */ - p_report_ntc = (ib_mad_notice_attr_t*)(ib_smp_get_payload_ptr(p_smp_mad)); - - cl_memclr( p_report_ntc, sizeof(*p_report_ntc) ); - p_report_ntc->generic_type = 0x83; /* is generic subn mgt type */ - ib_notice_set_prod_type(p_report_ntc, 2); /* A switch generator */ - p_report_ntc->g_or_v.generic.trap_num = cl_hton16(p_ibtrapgen->p_opt->trap_num); - p_report_ntc->issuer_lid = cl_hton16(p_ibtrapgen->p_opt->lid); - if (p_ibtrapgen->p_opt->trap_num == 128) - { - p_report_ntc->data_details.ntc_128.sw_lid = cl_hton16(p_ibtrapgen->p_opt->lid); - } - else - { - p_report_ntc->data_details.ntc_129_131.lid = - cl_hton16(p_ibtrapgen->p_opt->lid); - p_report_ntc->data_details.ntc_129_131.port_num = - p_ibtrapgen->p_opt->src_port; - } - - status = osm_vendor_send(p_report_madw->h_bind, p_report_madw, FALSE ); - if (status != IB_SUCCESS) - { - osm_log(p_log, OSM_LOG_ERROR, - "ibtrapgen_run: ERR 0021: " - "osm_vendor_send. status = %s\n", - ib_get_err_str(status)); - goto Exit; - } - osm_log(p_log, OSM_LOG_INFO, - "ibtrapgen_run: " - "Sent trap number:%u out of:%u\n", - i, - p_ibtrapgen->p_opt->number ); - /* sleep according to rate time. The usleep is in usec - need to revert - the milisecs to usecs. */ - usleep(p_ibtrapgen->p_opt->rate*1000); - } - - Exit: - // sleep(3); - OSM_LOG_EXIT( p_log ); - return(status); -} diff --git a/branches/opensm_3/user/ibtrapgen/ibtrapgen.h b/branches/opensm_3/user/ibtrapgen/ibtrapgen.h deleted file mode 100644 index 6fe54862..00000000 --- a/branches/opensm_3/user/ibtrapgen/ibtrapgen.h +++ /dev/null @@ -1,313 +0,0 @@ -/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - This software program is available to you under a choice of one of two - licenses. You may choose to be licensed under either the GNU General Public - License (GPL) Version 2, June 1991, available at - http://www.fsf.org/copyleft/gpl.html, or the Intel BSD + Patent License, - the text of which follows: - - "Recipient" has requested a license and Intel Corporation ("Intel") - is willing to grant a license for the software entitled - InfiniBand(tm) System Software (the "Software") being provided by - Intel Corporation. - - The following definitions apply to this License: - - "Licensed Patents" means patent claims licensable by Intel Corporation which - are necessarily infringed by the use or sale of the Software alone or when - combined with the operating system referred to below. - - "Recipient" means the party to whom Intel delivers this Software. - "Licensee" means Recipient and those third parties that receive a license to - any operating system available under the GNU Public License version 2.0 or - later. - - Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - - The license is provided to Recipient and Recipient's Licensees under the - following terms. - - Redistribution and use in source and binary forms of the Software, with or - without modification, are permitted provided that the following - conditions are met: - Redistributions of source code of the Software may retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form of the Software may reproduce the above - copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of Intel Corporation nor the names of its contributors shall - be used to endorse or promote products derived from this Software without - specific prior written permission. - - Intel hereby grants Recipient and Licensees a non-exclusive, worldwide, - royalty-free patent license under Licensed Patents to make, use, sell, offer - to sell, import and otherwise transfer the Software, if any, in source code - and object code form. This license shall include changes to the Software that - are error corrections or other minor changes to the Software that do not add - functionality or features when the Software is incorporated in any version of - a operating system that has been distributed under the GNU General Public - License 2.0 or later. This patent license shall apply to the combination of - the Software and any operating system licensed under the GNU Public License - version 2.0 or later if, at the time Intel provides the Software to - Recipient, such addition of the Software to the then publicly - available versions of such operating system available under the GNU - Public License version 2.0 or later (whether in gold, beta or alpha - form) causes such combination to be covered by the Licensed - Patents. The patent license shall not apply to any other - combinations which include the Software. No hardware per se is - licensed hereunder. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------*/ - - -/* - * Abstract: - * Declaration of ibtrapgen_t. - * This object represents the ibtrapgen object. - * - * Environment: - * Linux User Mode - * - * $Revision: 1.1 $ - */ - -#ifndef _IBTRAPGEN_H_ -#define _IBTRAPGEN_H_ - -#include -#include -#include -#include -#include -#include - -/****h* Trap_Generator_App/Ibtrapgen - * NAME - * Ibtrapgen - * - * DESCRIPTION - * The Ibtrapgen object create/join and leave multicast group. - * - * AUTHOR - * Yael Kalka, Mellanox. - * - *********/ - -/****s* Trap_Generator_App/ibtrapgen_opt_t - * NAME - * ibtrapgen_opt_t - * - * DESCRIPTION - * Ibtrapgen options structure. This structure contains the various - * specific configuration parameters for ibtrapgen. - * - * SYNOPSYS - */ -typedef struct _ibtrapgen_opt -{ - uint8_t trap_num; - uint16_t number; - uint16_t rate; - uint16_t lid; - uint16_t sm_lid; - uint8_t src_port; - uint8_t port_num; - uint32_t transaction_timeout; - boolean_t force_log_flush; - char *log_file; -} ibtrapgen_opt_t; -/* - * FIELDS - * - * trap_num - * Trap number to generate. - * - * number - * Number of times trap should be generated. - * - * rate - * Rate of trap generation (in miliseconds) - * - * lid - * Lid from which the trap should be generated. - * - * src_port - * Source port from which the trap should be generated. - * - * port_num - * Port num used for communicating with the SA. - * - * SEE ALSO - *********/ - -/****s* Trap Generator App/ibtrapgen_t - * NAME - * ibtrapgen_t - * - * DESCRIPTION - * Ibtrapgen structure. - * - * This object should be treated as opaque and should - * be manipulated only through the provided functions. - * - * SYNOPSYS - */ -typedef struct _ibtrapgen -{ - osm_log_t *p_log; - struct _osm_vendor *p_vendor; - osm_bind_handle_t h_bind; - osm_mad_pool_t mad_pool; - - ibtrapgen_opt_t *p_opt; - ib_net64_t port_guid; -} ibtrapgen_t; -/* - * FIELDS - * p_log - * Log facility used by all Ibtrapgen components. - * - * p_vendor - * Pointer to the vendor transport layer. - * - * h_bind - * The bind handle obtained by osm_vendor_sa_api/osmv_bind_sa - * - * mad_pool - * The mad pool provided for teh vendor layer to allocate mad wrappers in - * - * p_opt - * ibtrapgen options structure - * - * guid - * guid for the port over which ibtrapgen is running. - * - * SEE ALSO - *********/ - -/****f* Trap_Generator_App/ibtrapgen_destroy - * NAME - * ibtrapgen_destroy - * - * DESCRIPTION - * The ibtrapgen_destroy function destroys an ibtrapgen object, releasing - * all resources. - * - * SYNOPSIS - */ -void ibtrapgen_destroy( IN ibtrapgen_t * p_ibtrapgen ); - -/* - * PARAMETERS - * p_ibtrapgen - * [in] Pointer to a Trap_Generator_App object to destroy. - * - * RETURN VALUE - * This function does not return a value. - * - * NOTES - * Performs any necessary cleanup of the specified Trap_Generator_App object. - * Further operations should not be attempted on the destroyed object. - * This function should only be called after a call to ibtrapgen_init. - * - * SEE ALSO - * ibtrapgen_init - *********/ - -/****f* Trap_Generator_App/ibtrapgen_init - * NAME - * ibtrapgen_init - * - * DESCRIPTION - * The ibtrapgen_init function initializes a Trap_Generator_App object for use. - * - * SYNOPSIS - */ -ib_api_status_t ibtrapgen_init( IN ibtrapgen_t * const p_ibtrapgen, - IN ibtrapgen_opt_t * const p_opt, - IN const osm_log_level_t log_flags - ); - -/* - * PARAMETERS - * p_ibtrapgen - * [in] Pointer to an ibtrapgen_t object to initialize. - * - * p_opt - * [in] Pointer to the options structure. - * - * log_flags - * [in] Log level flags to set. - * - * RETURN VALUES - * IB_SUCCESS if the Trap_Generator_App object was initialized successfully. - * - * NOTES - * Allows calling other Trap_Generator_App methods. - * - * SEE ALSO - * ibtrapgen object, ibtrapgen_construct, ibtrapgen_destroy - *********/ - - -/****f* Trap_Generator_App/ibtrapgen_bind - * NAME - * ibtrapgen_bind - * - * DESCRIPTION - * Binds ibtrapgen to a local port. - * - * SYNOPSIS - */ -ib_api_status_t ibtrapgen_bind( IN ibtrapgen_t * p_ibtrapgen ); -/* - * PARAMETERS - * p_ibtrapgen - * [in] Pointer to an ibtrapgen_t object. - * - * RETURN VALUES - * IB_SUCCESS if OK - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* Trap_Generator_App/ibtrapgen_run - * NAME - * ibtrapgen_run - * - * DESCRIPTION - * Runs the ibtrapgen flow: Creation of traps. - * - * SYNOPSIS - */ -ib_api_status_t ibtrapgen_run( IN ibtrapgen_t * const p_ibtrapgen ); - -/* - * PARAMETERS - * p_ibtrapgen - * [in] Pointer to an ibtrapgen_t object. - * - * RETURN VALUES - * IB_SUCCESS on success - * - * NOTES - * - * SEE ALSO - *********/ - -#endif /* */ diff --git a/branches/opensm_3/user/ibtrapgen/main.c b/branches/opensm_3/user/ibtrapgen/main.c deleted file mode 100644 index f7f1de7d..00000000 --- a/branches/opensm_3/user/ibtrapgen/main.c +++ /dev/null @@ -1,465 +0,0 @@ -/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - This software program is available to you under a choice of one of two - licenses. You may choose to be licensed under either the GNU General Public - License (GPL) Version 2, June 1991, available at - http://www.fsf.org/copyleft/gpl.html, or the Intel BSD + Patent License, - the text of which follows: - - "Recipient" has requested a license and Intel Corporation ("Intel") - is willing to grant a license for the software entitled - InfiniBand(tm) System Software (the "Software") being provided by - Intel Corporation. - - The following definitions apply to this License: - - "Licensed Patents" means patent claims licensable by Intel Corporation which - are necessarily infringed by the use or sale of the Software alone or when - combined with the operating system referred to below. - - "Recipient" means the party to whom Intel delivers this Software. - "Licensee" means Recipient and those third parties that receive a license to - any operating system available under the GNU Public License version 2.0 or - later. - - Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - - The license is provided to Recipient and Recipient's Licensees under the - following terms. - - Redistribution and use in source and binary forms of the Software, with or - without modification, are permitted provided that the following - conditions are met: - Redistributions of source code of the Software may retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form of the Software may reproduce the above - copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of Intel Corporation nor the names of its contributors shall - be used to endorse or promote products derived from this Software without - specific prior written permission. - - Intel hereby grants Recipient and Licensees a non-exclusive, worldwide, - royalty-free patent license under Licensed Patents to make, use, sell, offer - to sell, import and otherwise transfer the Software, if any, in source code - and object code form. This license shall include changes to the Software that - are error corrections or other minor changes to the Software that do not add - functionality or features when the Software is incorporated in any version of - a operating system that has been distributed under the GNU General Public - License 2.0 or later. This patent license shall apply to the combination of - the Software and any operating system licensed under the GNU Public License - version 2.0 or later if, at the time Intel provides the Software to - Recipient, such addition of the Software to the then publicly - available versions of such operating system available under the GNU - Public License version 2.0 or later (whether in gold, beta or alpha - form) causes such combination to be covered by the Licensed - Patents. The patent license shall not apply to any other - combinations which include the Software. No hardware per se is - licensed hereunder. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------*/ - - -/* - * Abstract: - * Command line interface for ibtrapgen. - * Parse and fill in the options and call the actual code. - * Implemented in ibtrapgen: - * Initialize the ibmgrp object (and log) - * Bind ibmgrp to the requested IB port. - * Run the actual command - * - * Environment: - * Linux User Mode - * - * $Revision: 1.1 $ - */ - -#include -#include -#ifndef __WIN__ -#include -#endif -#include -#include -#include "ibtrapgen.h" - -#define DEFAULT_RETRY_COUNT 3 -#define DEFAULT_TRANS_TIMEOUT_MILLISEC 1000 - -/********************************************************************** - **********************************************************************/ -boolean_t -ibtrapgen_is_debug() -{ -#if defined( _DEBUG_ ) - return TRUE; -#else - return FALSE; -#endif /* defined( _DEBUG_ ) */ -} - -/********************************************************************** - **********************************************************************/ -void show_usage(void); - -void -show_usage( ) -{ - printf( "\n------- ibtrapgen - Usage and options ----------------------\n" ); - printf( "Usage: one of the following optional flows:\n" ); - printf(" ibtrapgen -t|--trap_num -n|--number \n" - " -r|--rate -l|--lid \n" - " -s|--src_port -p|--port_num \n" ); - printf( "\nOptions:\n" ); - printf( "-t \n" - "--trap_num \n" - " This option specifies the number of the trap to generate.\n" - " Valid values are 128-131.\n" ); - printf( "-n \n" - "--number \n" - " This option specifies the number of times to generate this trap.\n" - " If not specified - default to 1.\n" ); - printf( "-r \n" - "--rate \n" - " This option specifies the rate of the trap generation.\n" - " What is the time period between one generation and another?\n" - " The value is given in miliseconds. \n" - " If the number of trap creations is 1 - this value is ignored.\n" ); - printf( "-l \n" - "--lid \n" - " This option specifies the lid address from where the trap should\n" - " be generated.\n" ); - printf( "-s \n" - "--src_port \n" - " This option specifies the port number from which the trap should\n" - " be generated. If trap number is 128 - this value is ignored (since\n" - " trap 128 is not sent with a specific port number)\n" ); - printf( "-p \n" - "--port_num \n" - " This is the port number used for communicating with\n" - " the SA.\n" ); - printf( "-h\n" - "--help\n" " Display this usage info then exit.\n\n" ); - printf( "-o\n" - "--out_log_file\n" - " This option defines the log to be the given file.\n" - " By default the log goes to stdout.\n\n"); - printf( "-v\n" - " This option increases the log verbosity level.\n" - " The -v option may be specified multiple times\n" - " to further increase the verbosity level.\n" - " See the -vf option for more information about.\n" - " log verbosity.\n\n" ); - printf( "-V\n" - " This option sets the maximum verbosity level and\n" - " forces log flushing.\n" - " The -V is equivalent to '-vf 0xFF -d 2'.\n" - " See the -vf option for more information about.\n" - " log verbosity.\n\n" ); - printf( "-x \n" - " This option sets the log verbosity level.\n" - " A flags field must follow the -vf option.\n" - " A bit set/clear in the flags enables/disables a\n" - " specific log level as follows:\n" - " BIT LOG LEVEL ENABLED\n" - " ---- -----------------\n" - " 0x01 - ERROR (error messages)\n" - " 0x02 - INFO (basic messages, low volume)\n" - " 0x04 - VERBOSE (interesting stuff, moderate volume)\n" - " 0x08 - DEBUG (diagnostic, high volume)\n" - " 0x10 - FUNCS (function entry/exit, very high volume)\n" - " 0x20 - FRAMES (dumps all SMP and GMP frames)\n" - " 0x40 - currently unused.\n" - " 0x80 - currently unused.\n" - " Without -x, ibtrapgen defaults to ERROR + INFO (0x3).\n" - " Specifying -x 0 disables all messages.\n" - " Specifying -x 0xFF enables all messages (see -V).\n\n" ); -} - -/********************************************************************** - **********************************************************************/ -/* - Converts a GID string of the format 0xPPPPPPPPPPPPPPPP:GGGGGGGGGGGGGGGG - to a gid type -*/ -int -str2gid( - IN char *str, - OUT ib_gid_t *p_gid - ); - -int -str2gid( - IN char *str, - OUT ib_gid_t *p_gid - ) -{ - ib_gid_t temp; - char buf[38]; - char *p_prefix, *p_guid; - - CL_ASSERT(p_gid); - - strcpy(buf, str); - p_prefix = buf; - /*p_guid = index(buf, ':');*/ - p_guid = strchr( buf, ':' ); - - if (! p_guid) - { - printf("Wrong format for gid %s\n", buf); - return 1; - } - - *p_guid = '\0'; - p_guid++; - - errno = 0; - temp.unicast.prefix = cl_hton64(strtoull(p_prefix, NULL, 0)); - if (errno) { - printf("Wrong format for gid prefix:%s (got %u)\n", - p_prefix, errno); - return 1; - } - - temp.unicast.interface_id = cl_hton64(strtoull(p_guid, NULL, 16)); - if (errno) { - printf("Wrong format for gid guid:%s\n", p_guid); - return 1; - } - - *p_gid = temp; - return 0; -} -void OsmReportState(IN const char *p_str) -{ -} -/********************************************************************** - **********************************************************************/ -int OSM_CDECL -main( int argc, - char *argv[] ) -{ - static ibtrapgen_t ibtrapgen; - ibtrapgen_opt_t opt = { 0 }; - ib_api_status_t status; - uint32_t log_flags = OSM_LOG_ERROR | OSM_LOG_INFO; - uint32_t next_option; - const char *const short_option = "t:n:r:s:l:p:o:vVh"; - - /* - * In the array below, the 2nd parameter specified the number - * of arguments as follows: - * 0: no arguments - * 1: argument - * 2: optional - */ - const struct option long_option[] = { - {"trap_num", 1, NULL, 't'}, - {"number", 1, NULL, 'n'}, - {"rate", 1, NULL, 'r'}, - {"lid", 1, NULL, 'l'}, - {"src_port", 1, NULL, 's'}, - {"port_num", 1, NULL, 'p'}, - {"help", 0, NULL, 'h'}, - {"verbose", 0, NULL, 'v'}, - {"out_log_file", 1, NULL, 'o'}, - {"vf", 1, NULL, 'x'}, - {"V", 0, NULL, 'V'}, - - {NULL, 0, NULL, 0} /* Required at end of array */ - }; - - - opt.trap_num = 0; - opt.number = 1; /* This is the default value */ - opt.rate = 0; - opt.lid = 0; - opt.src_port = 0; - opt.port_num = 0; - opt.log_file = NULL; - opt.force_log_flush = FALSE; - opt.transaction_timeout = DEFAULT_TRANS_TIMEOUT_MILLISEC; - - do - { - next_option = getopt_long_only( argc, argv, short_option, - long_option, NULL ); - - switch ( next_option ) - { - case 't': - /* - * Define the trap number - */ - opt.trap_num = (uint8_t)atoi( optarg ); - if ((opt.trap_num < 128) || (opt.trap_num > 131)) - { - printf( "-E- Given trap number is illegal! \n" - " Supportes generation of traps 128-131.\n" ); - exit(1); - } - printf( "-I- Trap Number = %u\n", opt.trap_num ); - break; - - case 'n': - /* - * Define the number of occurences - */ - opt.number = (uint16_t)atoi( optarg ); - - printf( "-I- Number Trap Occurences = %u\n", opt.number ); - break; - - case 'r': - /* - * Define the rate of the trap - */ - opt.rate = (uint16_t)atoi( optarg ); - - printf( "-I- Trap Rate = %u miliseconds\n", opt.rate ); - break; - - - case 'l': - /* - * Define the source lid of the trap - */ - opt.lid = (uint16_t)strtoul( optarg , NULL , 16); - - printf( "-I- Trap Lid = 0x%04X\n", opt.lid ); - break; - - case 's': - /* - * Define the source port number of the trap - */ - opt.src_port = (uint8_t)atoi( optarg ); - - printf( "-I- Trap Port Number = %u\n", opt.src_port ); - break; - - case 'p': - /* - * Specifies port guid with which to bind. - */ - opt.port_num = (uint8_t)atoi( optarg ); - printf( "-I- Port Num:%u\n", opt.port_num ); - break; - - case 'o': - opt.log_file = optarg; - printf("-I- Log File:%s\n", opt.log_file ); - break; - - case 'v': - /* - * Increases log verbosity. - */ - log_flags = ( log_flags << 1 ) | 1; - printf( "-I- Verbose option -v (log flags = 0x%X)\n", log_flags ); - break; - - case 'V': - /* - * Specifies maximum log verbosity. - */ - log_flags = 0xFFFFFFFF; - opt.force_log_flush = TRUE; - printf( "-I- Enabling maximum log verbosity\n" ); - break; - - case 'h': - show_usage( ); - return 0; - - case 'x': - log_flags = strtol( optarg, NULL, 0 ); - printf( "-I- Verbose option -vf (log flags = 0x%X)\n", - log_flags ); - break; - - case -1: - /* printf( "Done with args\n" ); */ - break; - - default: /* something wrong */ - abort( ); - } - - } - while( next_option != -1 ); - - /* Check for mandatory options */ - if (opt.trap_num == 0) - { - printf( "-E- Missing trap number.\n" ); - exit(1); - } - if (opt.lid == 0) - { - printf( "-E- Missing lid.\n" ); - exit(1); - } - if (opt.src_port == 0 && opt.trap_num >= 129 && opt.trap_num <= 131) - { - /* for trap 129-131 should be given source port number */ - printf( "-E- source port number.\n" ); - exit(1); - } - if (opt.port_num == 0) - { - printf( "-E- Missing port number.\n" ); - exit(1); - } - if (opt.rate == 0 && opt.number > 1) - { - /* for number of traps greater than 1 need to give the rate for the - trap generation. */ - printf( "-E- Missing rate.\n" ); - exit(1); - } - - - /* init the main object and sub objects (log and osm vendor) */ - status = ibtrapgen_init( &ibtrapgen, &opt, ( osm_log_level_t ) log_flags ); - if( status != IB_SUCCESS ) - { - printf("-E- fail to init ibtrapgen.\n"); - goto Exit; - } - - /* bind to a specific port */ - status = ibtrapgen_bind( &ibtrapgen ); - if (status != IB_SUCCESS) exit(status); - - /* actual work */ - status = ibtrapgen_run( &ibtrapgen ); - if (status != IB_SUCCESS) - { - printf("IBTRAPGEN: FAIL\n"); - } - else - { - printf("IBTRAPGEN: PASS\n"); - } - - //ibtrapgen_destroy( &ibtrapgen ); - - Exit: - exit ( status ); -} diff --git a/branches/opensm_3/user/ibtrapgen/osm_files.c b/branches/opensm_3/user/ibtrapgen/osm_files.c deleted file mode 100644 index 95065542..00000000 --- a/branches/opensm_3/user/ibtrapgen/osm_files.c +++ /dev/null @@ -1,9 +0,0 @@ - -/* Supply required OpenSM src files - easier to maintain/diff these files - * against OFE/openSM source. - */ - -#include <..\opensm\osm_mad_pool.c> -#include <..\opensm\osm_log.c> -#include <..\opensm\osm_helper.c> - diff --git a/branches/opensm_3/user/ibtrapgen/vendor-ibal.inc b/branches/opensm_3/user/ibtrapgen/vendor-ibal.inc deleted file mode 100644 index 303cdd49..00000000 --- a/branches/opensm_3/user/ibtrapgen/vendor-ibal.inc +++ /dev/null @@ -1,2 +0,0 @@ - -!INCLUDE ..\opensm\vendor-ibal.inc diff --git a/branches/opensm_3/user/ibtrapgen/vendor-umad.inc b/branches/opensm_3/user/ibtrapgen/vendor-umad.inc deleted file mode 100644 index d106d80f..00000000 --- a/branches/opensm_3/user/ibtrapgen/vendor-umad.inc +++ /dev/null @@ -1,2 +0,0 @@ - -!INCLUDE ..\opensm\vendor-umad.inc diff --git a/branches/opensm_3/user/include/complib/cl_dispatcher.h b/branches/opensm_3/user/include/complib/cl_dispatcher.h deleted file mode 100644 index 0840f62a..00000000 --- a/branches/opensm_3/user/include/complib/cl_dispatcher.h +++ /dev/null @@ -1,631 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of dispatcher abstraction. - */ - -#ifndef _CL_DISPATCHER_H_ -#define _CL_DISPATCHER_H_ - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* Component Library/Dispatcher -* NAME -* Dispatcher -* -* DESCRIPTION -* The Dispatcher provides a facility for message routing to -* asynchronous worker threads. -* -* The Dispatcher functions operate on a cl_dispatcher_t structure -* which should be treated as opaque and should be manipulated -* only through the provided functions. -* -* SEE ALSO -* Structures: -* cl_dispatcher_t -* -* Initialization/Destruction: -* cl_disp_construct, cl_disp_init, cl_disp_shutdown, cl_disp_destroy -* -* Manipulation: -* cl_disp_post, cl_disp_reset, cl_disp_wait_on -*********/ -/****s* Component Library: Dispatcher/cl_disp_msgid_t -* NAME -* cl_disp_msgid_t -* -* DESCRIPTION -* Defines the type of dispatcher messages. -* -* SYNOPSIS -*/ -typedef uint32_t cl_disp_msgid_t; -/**********/ - -/****s* Component Library: Dispatcher/CL_DISP_MSGID_NONE -* NAME -* CL_DISP_MSGID_NONE -* -* DESCRIPTION -* Defines a message value that means "no message". -* This value is used during registration by Dispatcher clients -* that do not wish to receive messages. -* -* No Dispatcher message is allowed to have this value. -* -* SYNOPSIS -*/ -#define CL_DISP_MSGID_NONE 0xFFFFFFFF -/**********/ - -/****s* Component Library: Dispatcher/CL_DISP_INVALID_HANDLE -* NAME -* CL_DISP_INVALID_HANDLE -* -* DESCRIPTION -* Defines the value of an invalid Dispatcher registration handle. -* -* SYNOPSIS -*/ -#define CL_DISP_INVALID_HANDLE ((cl_disp_reg_handle_t)0) -/*********/ - -/****f* Component Library: Dispatcher/cl_pfn_msgrcv_cb_t -* NAME -* cl_pfn_msgrcv_cb_t -* -* DESCRIPTION -* This typedef defines the prototype for client functions invoked -* by the Dispatcher. The Dispatcher calls the corresponding -* client function when delivering a message to the client. -* -* The client function must be reentrant if the user creates a -* Dispatcher with more than one worker thread. -* -* SYNOPSIS -*/ -typedef void - (*cl_pfn_msgrcv_cb_t) (IN void *context, IN void *p_data); -/* -* PARAMETERS -* context -* [in] Client specific context specified in a call to -* cl_disp_register -* -* p_data -* [in] Pointer to the client specific data payload -* of this message. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* This typedef provides a function prototype reference for -* the function provided by Dispatcher clients as a parameter -* to the cl_disp_register function. -* -* SEE ALSO -* Dispatcher, cl_disp_register -*********/ - -/****f* Component Library: Dispatcher/cl_pfn_msgdone_cb_t -* NAME -* cl_pfn_msgdone_cb_t -* -* DESCRIPTION -* This typedef defines the prototype for client functions invoked -* by the Dispatcher. The Dispatcher calls the corresponding -* client function after completing delivery of a message. -* -* The client function must be reentrant if the user creates a -* Dispatcher with more than one worker thread. -* -* SYNOPSIS -*/ -typedef void - (*cl_pfn_msgdone_cb_t) (IN void *context, IN void *p_data); -/* -* PARAMETERS -* context -* [in] Client specific context specified in a call to -* cl_disp_post -* -* p_data -* [in] Pointer to the client specific data payload -* of this message. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* This typedef provides a function prototype reference for -* the function provided by Dispatcher clients as a parameter -* to the cl_disp_post function. -* -* SEE ALSO -* Dispatcher, cl_disp_post -*********/ - -/****s* Component Library: Dispatcher/cl_dispatcher_t -* NAME -* cl_dispatcher_t -* -* DESCRIPTION -* Dispatcher structure. -* -* The Dispatcher is thread safe. -* -* The cl_dispatcher_t structure should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct _cl_dispatcher { - cl_spinlock_t lock; - cl_ptr_vector_t reg_vec; - cl_qlist_t reg_list; - cl_thread_pool_t worker_threads; - cl_qlist_t msg_fifo; - cl_qpool_t msg_pool; - uint64_t last_msg_queue_time_us; -} cl_dispatcher_t; -/* -* FIELDS -* reg_vec -* Vector of registration info objects. Indexed by message msg_id. -* -* lock -* Spinlock to guard internal structures. -* -* msg_fifo -* FIFO of messages being processed by the Dispatcher. New -* messages are posted to the tail of the FIFO. Worker threads -* pull messages from the front. -* -* worker_threads -* Thread pool of worker threads to dispose of posted messages. -* -* msg_pool -* Pool of message objects to be processed through the FIFO. -* -* reg_count -* Count of the number of registrants. -* -* state -* Indicates the state of the object. -* -* last_msg_queue_time_us -* The time that the last message spent in the Q in usec -* -* SEE ALSO -* Dispatcher -*********/ - -/****s* Component Library: Dispatcher/cl_disp_reg_info_t -* NAME -* cl_disp_reg_info_t -* -* DESCRIPTION -* Defines the dispatcher registration object structure. -* -* The cl_disp_reg_info_t structure is for internal use by the -* Dispatcher only. -* -* SYNOPSIS -*/ -typedef struct _cl_disp_reg_info { - cl_list_item_t list_item; - cl_pfn_msgrcv_cb_t pfn_rcv_callback; - const void *context; - atomic32_t ref_cnt; - cl_disp_msgid_t msg_id; - cl_dispatcher_t *p_disp; -} cl_disp_reg_info_t; -/* -* FIELDS -* pfn_rcv_callback -* Client's message receive callback. -* -* context -* Client's context for message receive callback. -* -* rcv_thread_count -* Number of threads currently in the receive callback. -* -* msg_done_thread_count -* Number of threads currently in the message done callback. -* -* state -* State of this registration object. -* DISP_REGSTATE_INIT: initialized and inactive -* DISP_REGSTATE_ACTIVE: in active use -* DISP_REGSTATE_UNREGPEND: unregistration is pending -* -* msg_id -* Dispatcher message msg_id value for this registration object. -* -* p_disp -* Pointer to parent Dispatcher. -* -* SEE ALSO -*********/ - -/****s* Component Library: Dispatcher/cl_disp_msg_t -* NAME -* cl_disp_msg_t -* -* DESCRIPTION -* Defines the dispatcher message structure. -* -* The cl_disp_msg_t structure is for internal use by the -* Dispatcher only. -* -* SYNOPSIS -*/ -typedef struct _cl_disp_msg { - cl_pool_item_t item; - const void *p_data; - cl_disp_reg_info_t *p_src_reg; - cl_disp_reg_info_t *p_dest_reg; - cl_pfn_msgdone_cb_t pfn_xmt_callback; - uint64_t in_time; - const void *context; -} cl_disp_msg_t; -/* -* FIELDS -* item -* List & Pool linkage. Must be first element in the structure!! -* -* msg_id -* The message's numberic ID value. -* -* p_data -* Pointer to the data payload for this message. The payload -* is opaque to the Dispatcher. -* -* p_reg_info -* Pointer to the registration info of the sender. -* -* pfn_xmt_callback -* Client's message done callback. -* -* in_time -* The absolute time the message was inserted into the queue -* -* context -* Client's message done callback context. -* -* SEE ALSO -*********/ - -/****s* Component Library: Dispatcher/cl_disp_reg_info_t -* NAME -* cl_disp_reg_info_t -* -* DESCRIPTION -* Defines the Dispatcher registration handle. This handle -* should be treated as opaque by the client. -* -* SYNOPSIS -*/ -typedef const struct _cl_disp_reg_info *cl_disp_reg_handle_t; -/**********/ - -/****f* Component Library: Dispatcher/cl_disp_construct -* NAME -* cl_disp_construct -* -* DESCRIPTION -* This function constructs a Dispatcher object. -* -* SYNOPSIS -*/ -void cl_disp_construct(IN cl_dispatcher_t * const p_disp); -/* -* PARAMETERS -* p_disp -* [in] Pointer to a Dispatcher. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling cl_disp_init and cl_disp_destroy. -* -* SEE ALSO -* Dispatcher, cl_disp_init, cl_disp_destroy -*********/ - -/****f* Component Library: Dispatcher/cl_disp_init -* NAME -* cl_disp_init -* -* DESCRIPTION -* This function initializes a Dispatcher object. -* -* SYNOPSIS -*/ -cl_status_t -cl_disp_init(IN cl_dispatcher_t * const p_disp, - IN const uint32_t thread_count, IN const char *const name); -/* -* PARAMETERS -* p_disp -* [in] Pointer to a Dispatcher. -* -* thread_count -* [in] The number of worker threads to create in this Dispatcher. -* A value of 0 causes the Dispatcher to create one worker thread -* per CPU in the system. When the Dispatcher is created with -* only one thread, the Dispatcher guarantees to deliver posted -* messages in order. When the Dispatcher is created with more -* than one thread, messages may be delivered out of order. -* -* name -* [in] Name to associate with the threads. The name may be up to 16 -* characters, including a terminating null character. All threads -* created in the Dispatcher have the same name. -* -* RETURN VALUE -* CL_SUCCESS if the operation is successful. -* -* SEE ALSO -* Dispatcher, cl_disp_destoy, cl_disp_register, cl_disp_unregister, -* cl_disp_post -*********/ - -/****f* Component Library: Dispatcher/cl_disp_shutdown -* NAME -* cl_disp_shutdown -* -* DESCRIPTION -* This function shutdown a Dispatcher object. So it unreg all messages and -* clears the fifo and waits for the threads to exit -* -* SYNOPSIS -*/ -void cl_disp_shutdown(IN cl_dispatcher_t * const p_disp); -/* -* PARAMETERS -* p_disp -* [in] Pointer to a Dispatcher. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* This function does not returns until all worker threads -* have exited client callback functions and been successfully -* shutdowned. -* -* SEE ALSO -* Dispatcher, cl_disp_construct, cl_disp_init -*********/ - -/****f* Component Library: Dispatcher/cl_disp_destroy -* NAME -* cl_disp_destroy -* -* DESCRIPTION -* This function destroys a Dispatcher object. -* -* SYNOPSIS -*/ -void cl_disp_destroy(IN cl_dispatcher_t * const p_disp); -/* -* PARAMETERS -* p_disp -* [in] Pointer to a Dispatcher. -* -* RETURN VALUE -* This function does not return a value. -* -* SEE ALSO -* Dispatcher, cl_disp_construct, cl_disp_init -*********/ - -/****f* Component Library: Dispatcher/cl_disp_register -* NAME -* cl_disp_register -* -* DESCRIPTION -* This function registers a client with a Dispatcher object. -* -* SYNOPSIS -*/ -cl_disp_reg_handle_t -cl_disp_register(IN cl_dispatcher_t * const p_disp, - IN const cl_disp_msgid_t msg_id, - IN cl_pfn_msgrcv_cb_t pfn_callback OPTIONAL, - IN const void *const context); -/* -* PARAMETERS -* p_disp -* [in] Pointer to a Dispatcher. -* -* msg_id -* [in] Numberic message ID for which the client is registering. -* If the client does not wish to receive any messages, -* (a send-only client) then the caller should set this value -* to CL_DISP_MSGID_NONE. For efficiency, numeric message msg_id -* values should start with 0 and should be contiguous, or nearly so. -* -* pfn_callback -* [in] Message receive callback. The Dispatcher calls this -* function after receiving a posted message with the -* appropriate message msg_id value. Send-only clients may specify -* NULL for this value. -* -* context -* [in] Client context value passed to the cl_pfn_msgrcv_cb_t -* function. -* -* RETURN VALUE -* On success a Dispatcher registration handle. -* CL_CL_DISP_INVALID_HANDLE otherwise. -* -* SEE ALSO -* Dispatcher, cl_disp_unregister, cl_disp_post -*********/ - -/****f* Component Library: Dispatcher/cl_disp_unregister -* NAME -* cl_disp_unregister -* -* DESCRIPTION -* This function unregisters a client from a Dispatcher. -* -* SYNOPSIS -*/ -void cl_disp_unregister(IN const cl_disp_reg_handle_t handle); -/* -* PARAMETERS -* handle -* [in] cl_disp_reg_handle_t value return by cl_disp_register. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* This function will not return until worker threads have exited -* the callback functions for this client. Do not invoke this -* function from a callback. -* -* SEE ALSO -* Dispatcher, cl_disp_register -*********/ - -/****f* Component Library: Dispatcher/cl_disp_post -* NAME -* cl_disp_post -* -* DESCRIPTION -* This function posts a message to a Dispatcher object. -* -* SYNOPSIS -*/ -cl_status_t -cl_disp_post(IN const cl_disp_reg_handle_t handle, - IN const cl_disp_msgid_t msg_id, - IN const void *const p_data, - IN cl_pfn_msgdone_cb_t pfn_callback OPTIONAL, - IN const void *const context); -/* -* PARAMETERS -* handle -* [in] cl_disp_reg_handle_t value return by cl_disp_register. -* -* msg_id -* [in] Numeric message msg_id value associated with this message. -* -* p_data -* [in] Data payload for this message. -* -* pfn_callback -* [in] Pointer to a cl_pfn_msgdone_cb_t function. -* The Dispatcher calls this function after the message has been -* processed by the recipient. -* The caller may pass NULL for this value, which indicates no -* message done callback is necessary. -* -* context -* [in] Client context value passed to the cl_pfn_msgdone_cb_t -* function. -* -* RETURN VALUE -* CL_SUCCESS if the message was successfully queued in the Dispatcher. -* -* NOTES -* The caller must not modify the memory pointed to by p_data until -* the Dispatcher call the pfn_callback function. -* -* SEE ALSO -* Dispatcher -*********/ - -/****f* Component Library: Dispatcher/cl_disp_get_queue_status -* NAME -* cl_disp_get_queue_status -* -* DESCRIPTION -* This function posts a message to a Dispatcher object. -* -* SYNOPSIS -*/ -void -cl_disp_get_queue_status(IN const cl_disp_reg_handle_t handle, - OUT uint32_t * p_num_queued_msgs, - OUT uint64_t * p_last_msg_queue_time_ms); -/* -* PARAMETERS -* handle -* [in] cl_disp_reg_handle_t value return by cl_disp_register. -* -* p_last_msg_queue_time_ms -* [out] pointer to a variable to hold the time the last popped up message -* spent in the queue -* -* p_num_queued_msgs -* [out] number of messages in the queue -* -* RETURN VALUE -* Thr time the last popped up message stayed in the queue, in msec -* -* NOTES -* Extarnel Locking is not required. -* -* SEE ALSO -* Dispatcher -*********/ - -END_C_DECLS -#endif /* !defined(_CL_DISPATCHER_H_) */ diff --git a/branches/opensm_3/user/include/complib/cl_event_wheel.h b/branches/opensm_3/user/include/complib/cl_event_wheel.h deleted file mode 100644 index abc5ed00..00000000 --- a/branches/opensm_3/user/include/complib/cl_event_wheel.h +++ /dev/null @@ -1,457 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of event wheel abstraction. - */ - -#ifndef _CL_EVENT_WHEEL_H_ -#define _CL_EVENT_WHEEL_H_ - -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* Component Library/Event_Wheel -* NAME -* Event_Wheel -* -* DESCRIPTION -* The Event_Wheel provides a facility for registering delayed events -* and getting called once they timeout. -* -* The Event_Wheel functions operate on a cl_event_wheel_t structure -* which should be treated as opaque and should be manipulated -* only through the provided functions. -* -* SEE ALSO -* Structures: -* cl_event_wheel_t -* -* Initialization/Destruction: -* cl_event_wheel_construct, cl_event_wheel_init, cl_event_wheel_destroy -* -* Manipulation: -* cl_event_wheel_reg, cl_event_wheel_unreg -* -*********/ -/****f* Component Library: Event_Wheel/cl_pfn_event_aged_cb_t -* NAME -* cl_pfn_event_aged_cb_t -* -* DESCRIPTION -* This typedef defines the prototype for client functions invoked -* by the Event_Wheel. The Event_Wheel calls the corresponding -* client function when the specific item has aged. -* -* SYNOPSIS -*/ -typedef uint64_t - (*cl_pfn_event_aged_cb_t) (IN uint64_t key, - IN uint32_t num_regs, IN void *context); -/* -* PARAMETERS -* key -* [in] The key used for registering the item in the call to -* cl_event_wheel_reg -* -* num_regs -* [in] The number of times this event was registered (pushed in time). -* -* context -* [in] Client specific context specified in a call to -* cl_event_wheel_reg -* -* RETURN VALUE -* This function returns the abosolute time the event should fire in [usec]. -* If lower then current time means the event should be unregistered -* immediatly. -* -* NOTES -* This typedef provides a function prototype reference for -* the function provided by Event_Wheel clients as a parameter -* to the cl_event_wheel_reg function. -* -* SEE ALSO -* Event_Wheel, cl_event_wheel_reg -*********/ - -/****s* Component Library: Event_Wheel/cl_event_wheel_t -* NAME -* cl_event_wheel_t -* -* DESCRIPTION -* Event_Wheel structure. -* -* The Event_Wheel is thread safe. -* -* The cl_event_wheel_t structure should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct _cl_event_wheel { - cl_spinlock_t lock; - cl_spinlock_t *p_external_lock; - - cl_qmap_t events_map; - boolean_t closing; - cl_qlist_t events_wheel; - cl_timer_t timer; -} cl_event_wheel_t; -/* -* FIELDS -* lock -* Spinlock to guard internal structures. -* -* p_external_lock -* Reference to external spinlock to guard internal structures -* if the event wheel is part of a larger object protected by its own lock -* -* events_map -* A Map holding all registered event items by their key. -* -* closing -* A flag indicating the event wheel is closing. This means that -* callbacks that are called when closing == TRUE should just be ignored. -* -* events_wheel -* A list of the events sorted by expiration time. -* -* timer -* The timer scheduling event time propagation. -* -* SEE ALSO -* Event_Wheel -*********/ - -/****s* Component Library: Event_Wheel/cl_event_wheel_reg_info_t -* NAME -* cl_event_wheel_reg_info_t -* -* DESCRIPTION -* Defines the event_wheel registration object structure. -* -* The cl_event_wheel_reg_info_t structure is for internal use by the -* Event_Wheel only. -* -* SYNOPSIS -*/ -typedef struct _cl_event_wheel_reg_info { - cl_map_item_t map_item; - cl_list_item_t list_item; - uint64_t key; - cl_pfn_event_aged_cb_t pfn_aged_callback; - uint64_t aging_time; - uint32_t num_regs; - void *context; - cl_event_wheel_t *p_event_wheel; -} cl_event_wheel_reg_info_t; -/* -* FIELDS -* map_item -* The map item of this event -* -* list_item -* The sorted by aging time list item -* -* key -* The key by which one can find the event -* -* pfn_aged_callback -* The clients Event-Aged callback -* -* aging_time -* The delta time [msec] for which the event should age. -* -* num_regs -* The number of times the same event (key) was registered -* -* context -* Client's context for event-aged callback. -* -* p_event_wheel -* Pointer to this event wheel object -* -* SEE ALSO -*********/ - -/****f* Component Library: Event_Wheel/cl_event_wheel_construct -* NAME -* cl_event_wheel_construct -* -* DESCRIPTION -* This function constructs a Event_Wheel object. -* -* SYNOPSIS -*/ -void cl_event_wheel_construct(IN cl_event_wheel_t * const p_event_wheel); -/* -* PARAMETERS -* p_event_wheel -* [in] Pointer to a Event_Wheel. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling cl_event_wheel_init and cl_event_wheel_destroy. -* -* SEE ALSO -* Event_Wheel, cl_event_wheel_init, cl_event_wheel_destroy -*********/ - -/****f* Component Library: Event_Wheel/cl_event_wheel_init -* NAME -* cl_event_wheel_init -* -* DESCRIPTION -* This function initializes a Event_Wheel object. -* -* SYNOPSIS -*/ -cl_status_t -cl_event_wheel_init(IN cl_event_wheel_t * const p_event_wheel); - -/* -* PARAMETERS -* p_event_wheel -* [in] Pointer to a Event_Wheel. -* -* RETURN VALUE -* CL_SUCCESS if the operation is successful. -* -* SEE ALSO -* Event_Wheel, cl_event_wheel_destoy, cl_event_wheel_reg, cl_event_wheel_unreg -* -*********/ - -/****f* Component Library: Event_Wheel/cl_event_wheel_init -* NAME -* cl_event_wheel_init -* -* DESCRIPTION -* This function initializes a Event_Wheel object. -* -* SYNOPSIS -*/ -cl_status_t -cl_event_wheel_init_ex(IN cl_event_wheel_t * const p_event_wheel, - IN cl_spinlock_t * p_external_lock); - -/* -* PARAMETERS -* p_event_wheel -* [in] Pointer to a Event_Wheel. -* -* p_external_lock -* [in] Reference to external spinlock to guard internal structures -* if the event wheel is part of a larger object protected by its own lock -* -* RETURN VALUE -* CL_SUCCESS if the operation is successful. -* -* SEE ALSO -* Event_Wheel, cl_event_wheel_destoy, cl_event_wheel_reg, cl_event_wheel_unreg -* -*********/ - -/****f* Component Library: Event_Wheel/cl_event_wheel_destroy -* NAME -* cl_event_wheel_destroy -* -* DESCRIPTION -* This function destroys a Event_Wheel object. -* -* SYNOPSIS -*/ -void cl_event_wheel_destroy(IN cl_event_wheel_t * const p_event_wheel); -/* -* PARAMETERS -* p_event_wheel -* [in] Pointer to a Event_Wheel. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* This function does not returns until all client callback functions -* been successfully finished. -* -* SEE ALSO -* Event_Wheel, cl_event_wheel_construct, cl_event_wheel_init -*********/ - -/****f* Component Library: Event_Wheel/cl_event_wheel_dump -* NAME -* cl_event_wheel_dump -* -* DESCRIPTION -* This function dumps the details of an Event_Whell object. -* -* SYNOPSIS -*/ -void cl_event_wheel_dump(IN cl_event_wheel_t * const p_event_wheel); -/* -* PARAMETERS -* p_event_wheel -* [in] Pointer to a Event_Wheel. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Note that this function should be called inside a lock of the event wheel! -* It doesn't aquire the lock by itself. -* -* SEE ALSO -* Event_Wheel, cl_event_wheel_construct, cl_event_wheel_init -*********/ - -/****f* Component Library: Event_Wheel/cl_event_wheel_reg -* NAME -* cl_event_wheel_reg -* -* DESCRIPTION -* This function registers a client with a Event_Wheel object. -* -* SYNOPSIS -*/ -cl_status_t -cl_event_wheel_reg(IN cl_event_wheel_t * const p_event_wheel, - IN const uint64_t key, - IN const uint64_t aging_time_usec, - IN cl_pfn_event_aged_cb_t pfn_callback, - IN void *const context); -/* -* PARAMETERS -* p_event_wheel -* [in] Pointer to a Event_Wheel. -* -* key -* [in] The specifc Key by which events are registered. -* -* aging_time_usec -* [in] The absolute time this event should age in usec -* -* pfn_callback -* [in] Event Aging callback. The Event_Wheel calls this -* function after the time the event has registed for has come. -* -* context -* [in] Client context value passed to the cl_pfn_event_aged_cb_t -* function. -* -* RETURN VALUE -* On success a Event_Wheel CL_SUCCESS or CL_ERROR otherwise. -* -* SEE ALSO -* Event_Wheel, cl_event_wheel_unreg -*********/ - -/****f* Component Library: Event_Wheel/cl_event_wheel_unreg -* NAME -* cl_event_wheel_unreg -* -* DESCRIPTION -* This function unregisters a client event from a Event_Wheel. -* -* SYNOPSIS -*/ -void -cl_event_wheel_unreg(IN cl_event_wheel_t * const p_event_wheel, - IN uint64_t key); -/* -* PARAMETERS -* p_event_wheel -* [in] Pointer to a Event_Wheel. -* -* key -* [in] The key used for registering the event -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* After the event has aged it is automatically removed from -* the event wheel. So it should only be invoked when the need arises -* to remove existing events before they age. -* -* SEE ALSO -* Event_Wheel, cl_event_wheel_reg -*********/ - -/****f* Component Library: Event_Wheel/cl_event_wheel_num_regs -* NAME -* cl_event_wheel_num_regs -* -* DESCRIPTION -* This function returns the number of times an event was registered. -* -* SYNOPSIS -*/ -uint32_t -cl_event_wheel_num_regs(IN cl_event_wheel_t * const p_event_wheel, - IN uint64_t key); -/* -* PARAMETERS -* p_event_wheel -* [in] Pointer to a Event_Wheel. -* -* key -* [in] The key used for registering the event -* -* RETURN VALUE -* The number of times the event was registered. -* 0 if never registered or eventually aged. -* -* SEE ALSO -* Event_Wheel, cl_event_wheel_reg, cl_event_wheel_unreg -*********/ - -END_C_DECLS -#endif /* !defined(_CL_EVENT_WHEEL_H_) */ diff --git a/branches/opensm_3/user/include/iba/ib_cm_types.h b/branches/opensm_3/user/include/iba/ib_cm_types.h deleted file mode 100644 index 29fa2bcc..00000000 --- a/branches/opensm_3/user/include/iba/ib_cm_types.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if !defined(__IB_CM_TYPES_H__) -#define __IB_CM_TYPES_H__ - -#ifndef __WIN__ - -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* - * Defines known Communication management class versions - */ -#define IB_MCLASS_CM_VER_2 2 -#define IB_MCLASS_CM_VER_1 1 -/* - * Defines the size of user available data in communication management MADs - */ -#define IB_REQ_PDATA_SIZE_VER2 92 -#define IB_MRA_PDATA_SIZE_VER2 222 -#define IB_REJ_PDATA_SIZE_VER2 148 -#define IB_REP_PDATA_SIZE_VER2 196 -#define IB_RTU_PDATA_SIZE_VER2 224 -#define IB_LAP_PDATA_SIZE_VER2 168 -#define IB_APR_PDATA_SIZE_VER2 148 -#define IB_DREQ_PDATA_SIZE_VER2 220 -#define IB_DREP_PDATA_SIZE_VER2 224 -#define IB_SIDR_REQ_PDATA_SIZE_VER2 216 -#define IB_SIDR_REP_PDATA_SIZE_VER2 136 -#define IB_REQ_PDATA_SIZE_VER1 92 -#define IB_MRA_PDATA_SIZE_VER1 222 -#define IB_REJ_PDATA_SIZE_VER1 148 -#define IB_REP_PDATA_SIZE_VER1 204 -#define IB_RTU_PDATA_SIZE_VER1 224 -#define IB_LAP_PDATA_SIZE_VER1 168 -#define IB_APR_PDATA_SIZE_VER1 151 -#define IB_DREQ_PDATA_SIZE_VER1 220 -#define IB_DREP_PDATA_SIZE_VER1 224 -#define IB_SIDR_REQ_PDATA_SIZE_VER1 216 -#define IB_SIDR_REP_PDATA_SIZE_VER1 140 -#define IB_ARI_SIZE 72 // redefine -#define IB_APR_INFO_SIZE 72 -/****d* Access Layer/ib_rej_status_t -* NAME -* ib_rej_status_t -* -* DESCRIPTION -* Rejection reasons. -* -* SYNOPSIS -*/ -typedef ib_net16_t ib_rej_status_t; -/* -* SEE ALSO -* ib_cm_rej, ib_cm_rej_rec_t -* -* SOURCE -*/ -#define IB_REJ_INSUF_QP CL_HTON16(1) -#define IB_REJ_INSUF_EEC CL_HTON16(2) -#define IB_REJ_INSUF_RESOURCES CL_HTON16(3) -#define IB_REJ_TIMEOUT CL_HTON16(4) -#define IB_REJ_UNSUPPORTED CL_HTON16(5) -#define IB_REJ_INVALID_COMM_ID CL_HTON16(6) -#define IB_REJ_INVALID_COMM_INSTANCE CL_HTON16(7) -#define IB_REJ_INVALID_SID CL_HTON16(8) -#define IB_REJ_INVALID_XPORT CL_HTON16(9) -#define IB_REJ_STALE_CONN CL_HTON16(10) -#define IB_REJ_RDC_NOT_EXIST CL_HTON16(11) -#define IB_REJ_INVALID_GID CL_HTON16(12) -#define IB_REJ_INVALID_LID CL_HTON16(13) -#define IB_REJ_INVALID_SL CL_HTON16(14) -#define IB_REJ_INVALID_TRAFFIC_CLASS CL_HTON16(15) -#define IB_REJ_INVALID_HOP_LIMIT CL_HTON16(16) -#define IB_REJ_INVALID_PKT_RATE CL_HTON16(17) -#define IB_REJ_INVALID_ALT_GID CL_HTON16(18) -#define IB_REJ_INVALID_ALT_LID CL_HTON16(19) -#define IB_REJ_INVALID_ALT_SL CL_HTON16(20) -#define IB_REJ_INVALID_ALT_TRAFFIC_CLASS CL_HTON16(21) -#define IB_REJ_INVALID_ALT_HOP_LIMIT CL_HTON16(22) -#define IB_REJ_INVALID_ALT_PKT_RATE CL_HTON16(23) -#define IB_REJ_PORT_REDIRECT CL_HTON16(24) -#define IB_REJ_INVALID_MTU CL_HTON16(26) -#define IB_REJ_INSUFFICIENT_RESP_RES CL_HTON16(27) -#define IB_REJ_USER_DEFINED CL_HTON16(28) -#define IB_REJ_INVALID_RNR_RETRY CL_HTON16(29) -#define IB_REJ_DUPLICATE_LOCAL_COMM_ID CL_HTON16(30) -#define IB_REJ_INVALID_CLASS_VER CL_HTON16(31) -#define IB_REJ_INVALID_FLOW_LBL CL_HTON16(32) -#define IB_REJ_INVALID_ALT_FLOW_LBL CL_HTON16(33) - -#define IB_REJ_SERVICE_HANDOFF CL_HTON16(65535) -/******/ - -/****d* Access Layer/ib_apr_status_t -* NAME -* ib_apr_status_t -* -* DESCRIPTION -* Automatic path migration status information. -* -* SYNOPSIS -*/ -typedef uint8_t ib_apr_status_t; -/* -* SEE ALSO -* ib_cm_apr, ib_cm_apr_rec_t -* -* SOURCE - */ -#define IB_AP_SUCCESS 0 -#define IB_AP_INVALID_COMM_ID 1 -#define IB_AP_UNSUPPORTED 2 -#define IB_AP_REJECT 3 -#define IB_AP_REDIRECT 4 -#define IB_AP_IS_CURRENT 5 -#define IB_AP_INVALID_QPN_EECN 6 -#define IB_AP_INVALID_LID 7 -#define IB_AP_INVALID_GID 8 -#define IB_AP_INVALID_FLOW_LBL 9 -#define IB_AP_INVALID_TCLASS 10 -#define IB_AP_INVALID_HOP_LIMIT 11 -#define IB_AP_INVALID_PKT_RATE 12 -#define IB_AP_INVALID_SL 13 -/******/ - -/****d* Access Layer/ib_cm_cap_mask_t -* NAME -* ib_cm_cap_mask_t -* -* DESCRIPTION -* Capability mask values in ClassPortInfo. -* -* SYNOPSIS -*/ -#define IB_CM_RELIABLE_CONN_CAPABLE CL_HTON16(9) -#define IB_CM_RELIABLE_DGRM_CAPABLE CL_HTON16(10) -#define IB_CM_RDGRM_CAPABLE CL_HTON16(11) -#define IB_CM_UNRELIABLE_CONN_CAPABLE CL_HTON16(12) -#define IB_CM_SIDR_CAPABLE CL_HTON16(13) -/* -* SEE ALSO -* ib_cm_rep, ib_class_port_info_t -* -* SOURCE -* -*******/ - -/* - * Service ID resolution status - */ -typedef uint16_t ib_sidr_status_t; -#define IB_SIDR_SUCCESS 0 -#define IB_SIDR_UNSUPPORTED 1 -#define IB_SIDR_REJECT 2 -#define IB_SIDR_NO_QP 3 -#define IB_SIDR_REDIRECT 4 -#define IB_SIDR_UNSUPPORTED_VER 5 - -END_C_DECLS -#endif /* ndef __WIN__ */ -#endif /* __IB_CM_TYPES_H__ */ diff --git a/branches/opensm_3/user/include/opensm/osm_attrib_req.h b/branches/opensm_3/user/include/opensm/osm_attrib_req.h deleted file mode 100644 index 0389eee8..00000000 --- a/branches/opensm_3/user/include/opensm/osm_attrib_req.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_ATTRIB_REQ_H_ -#define _OSM_ATTRIB_REQ_H_ - -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* - * Abstract: - * Declaration of the attribute request object. This object - * encapsulates information needed by the generic request controller - * to request an attribute from a node. - * These objects are part of the OpenSM family of objects. - */ -/****h* OpenSM/Attribute Request -* NAME -* Attribute Request -* -* DESCRIPTION -* The Attribute Request structure encapsulates -* encapsulates information needed by the generic request controller -* to request an attribute from a node. -* -* This structure allows direct access to member variables. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Attribute Request/osm_attrib_req_t -* NAME -* osm_attrib_req_t -* -* DESCRIPTION -* Attribute request structure. -* -* This structure allows direct access to member variables. -* -* SYNOPSIS -*/ -typedef struct osm_attrib_req { - uint16_t attrib_id; - uint32_t attrib_mod; - osm_madw_context_t context; - osm_dr_path_t path; - cl_disp_msgid_t err_msg; -} osm_attrib_req_t; -/* -* FIELDS -* attrib_id -* Attribute ID for this request. -* -* attrib_mod -* Attribute modifier for this request. -* -* context -* Context to insert in outbound mad wrapper context. -* -* path -* The directed route path to the node. -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_ATTRIB_REQ_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_base.h b/branches/opensm_3/user/include/opensm/osm_base.h deleted file mode 100644 index 6f34f848..00000000 --- a/branches/opensm_3/user/include/opensm/osm_base.h +++ /dev/null @@ -1,906 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Basic OpenSM definitions and structures. - * This object represents an OpenSM "base class". - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_BASE_H_ -#define _OSM_BASE_H_ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#ifdef __WIN__ -#include -#endif - -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Constants -* NAME -* Constants -* -* DESCRIPTION -* The following constants are used throughout the OpenSM. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****h* OpenSM/Base -* NAME -* Base -* -* DESCRIPTION -* The Base object encapsulates basic information needed by the -* OpenSM to manage objects. Each OpenSM object includes the -* Base object as the first member. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Base/OSM_DEFAULT_M_KEY -* NAME -* OSM_DEFAULT_M_KEY -* -* DESCRIPTION -* Managment key value used by the OpenSM. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_M_KEY 0 -/********/ -/****s* OpenSM: Base/OSM_DEFAULT_SM_KEY -* NAME -* OSM_DEFAULT_SM_KEY -* -* DESCRIPTION -* Subnet Manager key value used by the OpenSM. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_SM_KEY CL_HTON64(1) -/********/ -/****s* OpenSM: Base/OSM_DEFAULT_SA_KEY -* NAME -* OSM_DEFAULT_SA_KEY -* -* DESCRIPTION -* Subnet Adminstration key value. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_SA_KEY OSM_DEFAULT_SM_KEY -/********/ -/****s* OpenSM: Base/OSM_DEFAULT_LMC -* NAME -* OSM_DEFAULT_LMC -* -* DESCRIPTION -* Default LMC value used by the OpenSM. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_LMC 0 -/********/ -/****s* OpenSM: Base/OSM_DEFAULT_MAX_OP_VLS -* NAME -* OSM_DEFAULT_MAX_OP_VLS -* -* DESCRIPTION -* Default Maximal Operational VLs to be initialized on -* the link ports PortInfo by the OpenSM. -* Default value provides backward compatibility. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_MAX_OP_VLS 5 -/********/ -/****s* OpenSM: Base/OSM_DEFAULT_SL -* NAME -* OSM_DEFAULT_SL -* -* DESCRIPTION -* Default SL value used by the OpenSM. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_SL 0 -/********/ -/****s* OpenSM: Base/OSM_DEFAULT_SM_PRIORITY -* NAME -* OSM_DEFAULT_SM_PRIORITY -* -* DESCRIPTION -* Default SM priority value used by the OpenSM, -* as defined in the SMInfo attribute. 0 is the lowest priority. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_SM_PRIORITY 0 -/********/ -/****d* OpenSM: Base/OSM_DEFAULT_TMP_DIR -* NAME -* OSM_DEFAULT_TMP_DIR -* -* DESCRIPTION -* Specifies the default temporary directory for the log file, -* osm-subnet.lst, and other log files. -* -* SYNOPSIS -*/ -#ifdef __WIN__ -#define OSM_DEFAULT_TMP_DIR "%TEMP%\\" -#else -#define OSM_DEFAULT_TMP_DIR "/var/log/" -#endif -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_CACHE_DIR -* NAME -* OSM_DEFAULT_CACHE_DIR -* -* DESCRIPTION -* Specifies the default cache directory for the db files. -* -* SYNOPSIS -*/ -#ifdef __WIN__ -#define OSM_DEFAULT_CACHE_DIR OPENSM_CONFIG_DIR -#else -#define OSM_DEFAULT_CACHE_DIR "/var/cache/opensm" -#endif -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_LOG_FILE -* NAME -* OSM_DEFAULT_LOG_FILE -* -* DESCRIPTION -* Specifies the default log file name -* -* SYNOPSIS -*/ -#ifdef __WIN__ -#define OSM_DEFAULT_LOG_FILE OSM_DEFAULT_TMP_DIR "osm.log" -#else -#define OSM_DEFAULT_LOG_FILE "/var/log/opensm.log" -#endif -/***********/ - -/****d* OpenSM: Base/OSM_DEFAULT_CONFIG_FILE -* NAME -* OSM_DEFAULT_CONFIG_FILE -* -* DESCRIPTION -* Specifies the default OpenSM config file name -* -* SYNOPSIS -*/ -#if defined(HAVE_DEFAULT_OPENSM_CONFIG_FILE) -#define OSM_DEFAULT_CONFIG_FILE HAVE_DEFAULT_OPENSM_CONFIG_FILE -#elif defined (OPENSM_CONFIG_DIR) -#define OSM_DEFAULT_CONFIG_FILE OPENSM_CONFIG_DIR "/opensm.conf" -#else -#define OSM_DEFAULT_CONFIG_FILE "/etc/opensm/opensm.conf" -#endif -/***********/ - -/****d* OpenSM: Base/OSM_DEFAULT_PARTITION_CONFIG_FILE -* NAME -* OSM_DEFAULT_PARTITION_CONFIG_FILE -* -* DESCRIPTION -* Specifies the default partition config file name -* -* SYNOPSIS -*/ -#if defined(HAVE_DEFAULT_PARTITION_CONFIG_FILE) -#define OSM_DEFAULT_PARTITION_CONFIG_FILE HAVE_DEFAULT_PARTITION_CONFIG_FILE -#elif defined(OPENSM_CONFIG_DIR) -#define OSM_DEFAULT_PARTITION_CONFIG_FILE OPENSM_CONFIG_DIR "/partitions.conf" -#else -#define OSM_DEFAULT_PARTITION_CONFIG_FILE "/etc/opensm/partitions.conf" -#endif -/***********/ - -/****d* OpenSM: Base/OSM_DEFAULT_QOS_POLICY_FILE -* NAME -* OSM_DEFAULT_QOS_POLICY_FILE -* -* DESCRIPTION -* Specifies the default QoS policy file name -* -* SYNOPSIS -*/ -#if defined(HAVE_DEFAULT_QOS_POLICY_FILE) -#define OSM_DEFAULT_QOS_POLICY_FILE HAVE_DEFAULT_QOS_POLICY_FILE -#elif defined(OPENSM_CONFIG_DIR) -#define OSM_DEFAULT_QOS_POLICY_FILE OPENSM_CONFIG_DIR "/qos-policy.conf" -#else -#define OSM_DEFAULT_QOS_POLICY_FILE "/etc/opensm/qos-policy.conf" -#endif -/***********/ - -/****d* OpenSM: Base/OSM_DEFAULT_PREFIX_ROUTES_FILE -* NAME -* OSM_DEFAULT_PREFIX_ROUTES_FILE -* -* DESCRIPTION -* Specifies the default prefix routes file name -* -* SYNOPSIS -*/ -#if defined(HAVE_DEFAULT_PREFIX_ROUTES_FILE) -#define OSM_DEFAULT_PREFIX_ROUTES_FILE HAVE_DEFAULT_PREFIX_ROUTES_FILE -#elif defined(OPENSM_CONFIG_DIR) -#define OSM_DEFAULT_PREFIX_ROUTES_FILE OPENSM_CONFIG_DIR "/prefix-routes.conf" -#else -#define OSM_DEFAULT_PREFIX_ROUTES_FILE "/etc/opensm/prefix-routes.conf" -#endif -/***********/ - -/****d* OpenSM: Base/OSM_DEFAULT_SWEEP_INTERVAL_SECS -* NAME -* OSM_DEFAULT_SWEEP_INTERVAL_SECS -* -* DESCRIPTION -* Specifies the default number of seconds between subnet sweeps. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_SWEEP_INTERVAL_SECS 10 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_TRANS_TIMEOUT_MILLISEC -* NAME -* OSM_DEFAULT_TRANS_TIMEOUT_MILLISEC -* -* DESCRIPTION -* Specifies the default transaction timeout in milliseconds. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_TRANS_TIMEOUT_MILLISEC 200 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_SUBNET_TIMEOUT -* NAME -* OSM_DEFAULT_SUBNET_TIMEOUT -* -* DESCRIPTION -* Specifies the default subnet timeout. -* timeout time = 4us * 2^timeout. -* We use here ~1sec. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_SUBNET_TIMEOUT 0x12 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_SWITCH_PACKET_LIFE -* NAME -* OSM_DEFAULT_SWITCH_PACKET_LIFE -* -* DESCRIPTION -* Specifies the default max life time for a pcket on the switch. -* timeout time = 4us * 2^timeout. -* We use here the value of ~1sec -* A Value > 19dec disables this mechanism. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_SWITCH_PACKET_LIFE 0x12 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_HEAD_OF_QUEUE_LIFE -* NAME -* OSM_DEFAULT_HEAD_OF_QUEUE_LIFE -* -* DESCRIPTION -* Sets the time a packet can live in the head of the VL Queue -* We use here the value of ~1sec -* A Value > 19dec disables this mechanism. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_HEAD_OF_QUEUE_LIFE 0x12 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_LEAF_HEAD_OF_QUEUE_LIFE -* NAME -* OSM_DEFAULT_LEAF_HEAD_OF_QUEUE_LIFE -* -* DESCRIPTION -* Sets the time a packet can live in the head of the VL Queue -* of a port that drives a CA port. -* We use here the value of ~256msec -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_LEAF_HEAD_OF_QUEUE_LIFE 0x10 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_VL_STALL_COUNT -* NAME -* OSM_DEFAULT_LEAF_VL_COUNT -* -* DESCRIPTION -* Sets the number of consecutive head of queue life time drops that -* puts the VL into stalled state. In stalled state, the port is supposed -* to drop everything for 8*(head of queue lifetime) -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_VL_STALL_COUNT 0x7 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_LEAF_VL_STALL_COUNT -* NAME -* OSM_DEFAULT_LEAF_VL_STALL_COUNT -* -* DESCRIPTION -* Sets the number of consecutive head of queue life time drops that -* puts the VL into stalled state. In stalled state, the port is supposed -* to drop everything for 8*(head of queue lifetime). This value is for -* switch ports driving a CA port. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_LEAF_VL_STALL_COUNT 0x7 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_TRAP_SUPRESSION_TIMEOUT -* NAME -* OSM_DEFAULT_TRAP_SUPRESSION_TIMEOUT -* -* DESCRIPTION -* Specifies the default timeout for ignoring same trap. -* timeout time = 5000000us -* We use here ~5sec. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_TRAP_SUPRESSION_TIMEOUT 5000000 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_UNHEALTHY_TIMEOUT -* NAME -* OSM_DEFAULT_UNHEALTHY_TIMEOUT -* -* DESCRIPTION -* Specifies the default timeout for setting port as unhealthy. -* timeout time = 60000000us -* We use here ~60sec. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_UNHEALTHY_TIMEOUT 60000000 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_ERROR_THRESHOLD -* NAME -* OSM_DEFAULT_ERROR_THRESHOLD -* -* DESCRIPTION -* Specifies default link error threshold to be set by SubnSet(PortInfo). -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_ERROR_THRESHOLD 0x08 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_SMP_MAX_ON_WIRE -* NAME -* OSM_DEFAULT_SMP_MAX_ON_WIRE -* -* DESCRIPTION -* Specifies the default number of VL15 SMP MADs allowed on -* the wire at any one time. -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_SMP_MAX_ON_WIRE 4 -/***********/ -/****d* OpenSM: Base/OSM_SM_DEFAULT_QP0_RCV_SIZE -* NAME -* OSM_SM_DEFAULT_QP0_RCV_SIZE -* -* DESCRIPTION -* Specifies the default size (in MADs) of the QP0 receive queue -* -* SYNOPSIS -*/ -#define OSM_SM_DEFAULT_QP0_RCV_SIZE 256 -/***********/ -/****d* OpenSM: Base/OSM_SM_DEFAULT_QP0_SEND_SIZE -* NAME -* OSM_SM_DEFAULT_QP0_SEND_SIZE -* -* DESCRIPTION -* Specifies the default size (in MADs) of the QP0 send queue -* -* SYNOPSIS -*/ -#define OSM_SM_DEFAULT_QP0_SEND_SIZE 256 -/***********/ -/****d* OpenSM: Base/OSM_SM_DEFAULT_QP1_RCV_SIZE -* NAME -* OSM_SM_DEFAULT_QP1_RCV_SIZE -* -* DESCRIPTION -* Specifies the default size (in MADs) of the QP1 receive queue -* -* SYNOPSIS -*/ -#define OSM_SM_DEFAULT_QP1_RCV_SIZE 256 -/***********/ -/****d* OpenSM: Base/OSM_SM_DEFAULT_QP1_SEND_SIZE -* NAME -* OSM_SM_DEFAULT_QP1_SEND_SIZE -* -* DESCRIPTION -* Specifies the default size (in MADs) of the QP1 send queue -* -* SYNOPSIS -*/ -#define OSM_SM_DEFAULT_QP1_SEND_SIZE 256 -/****d* OpenSM: Base/OSM_PM_DEFAULT_QP1_RCV_SIZE -* NAME -* OSM_PM_DEFAULT_QP1_RCV_SIZE -* -* DESCRIPTION -* Specifies the default size (in MADs) of the QP1 receive queue -* -* SYNOPSIS -*/ -#define OSM_PM_DEFAULT_QP1_RCV_SIZE 256 -/***********/ -/****d* OpenSM: Base/OSM_PM_DEFAULT_QP1_SEND_SIZE -* NAME -* OSM_PM_DEFAULT_QP1_SEND_SIZE -* -* DESCRIPTION -* Specifies the default size (in MADs) of the QP1 send queue -* -* SYNOPSIS -*/ -#define OSM_PM_DEFAULT_QP1_SEND_SIZE 256 -/****d* OpenSM: Base/OSM_SM_DEFAULT_POLLING_TIMEOUT_MILLISECS -* NAME -* OSM_SM_DEFAULT_POLLING_TIMEOUT_MILLISECS -* -* DESCRIPTION -* Specifies the polling timeout (in miliseconds) - the timeout -* between one poll to another. -* -* SYNOPSIS -*/ -#define OSM_SM_DEFAULT_POLLING_TIMEOUT_MILLISECS 10000 -/**********/ -/****d* OpenSM: Base/OSM_SM_DEFAULT_POLLING_RETRY_NUMBER -* NAME -* OSM_SM_DEFAULT_POLLING_RETRY_NUMBER -* -* DESCRIPTION -* Specifies the number of polling retries before the SM goes back -* to DISCOVERY stage. So the default total time for handoff is 40 sec. -* -* SYNOPSIS -*/ -#define OSM_SM_DEFAULT_POLLING_RETRY_NUMBER 4 -/**********/ -/****d* OpenSM: MC Member Record Receiver/OSM_DEFAULT_MGRP_MTU -* Name -* OSM_DEFAULT_MGRP_MTU -* -* DESCRIPTION -* Default MTU used for new MGRP creation (2048 bytes) -* Note it includes the MTUSelector which is set to "Greater Than" -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_MGRP_MTU 0x04 -/***********/ -/****d* OpenSM: MC Member Record Receiver/OSM_DEFAULT_MGRP_RATE -* Name -* OSM_DEFAULT_MGRP_RATE -* -* DESCRIPTION -* Default RATE used for new MGRP creation (10Gb/sec) -* Note it includes the RateSelector which is set to "Greater Than" -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_MGRP_RATE 0x03 -/***********/ -/****d* OpenSM: MC Member Record Receiver/OSM_DEFAULT_MGRP_SCOPE -* Name -* OSM_DEFAULT_MGRP_SCOPE -* -* DESCRIPTION -* Default SCOPE used for new MGRP creation (link local) -* -* SYNOPSIS -*/ -#define OSM_DEFAULT_MGRP_SCOPE IB_MC_SCOPE_LINK_LOCAL -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_QOS_MAX_VLS - * Name - * OSM_DEFAULT_QOS_MAX_VLS - * - * DESCRIPTION - * Default Maximum VLs used by the OpenSM. - * - * SYNOPSIS - */ -#define OSM_DEFAULT_QOS_MAX_VLS 15 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_QOS_HIGH_LIMIT - * Name - * OSM_DEFAULT_QOS_HIGH_LIMIT - * - * DESCRIPTION - * Default Limit of High Priority in VL Arbitration used by OpenSM. - * - * SYNOPSIS - */ -#define OSM_DEFAULT_QOS_HIGH_LIMIT 0 -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_QOS_VLARB_HIGH - * Name - * OSM_DEFAULT_QOS_VLARB_HIGH - * - * DESCRIPTION - * Default High Priority VL Arbitration table used by the OpenSM. - * - * SYNOPSIS - */ -#define OSM_DEFAULT_QOS_VLARB_HIGH "0:4,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0" -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_QOS_VLARB_LOW - * Name - * OSM_DEFAULT_QOS_VLARB_LOW - * - * DESCRIPTION - * Default Low Priority VL Arbitration table used by the OpenSM. - * - * SYNOPSIS - */ -#define OSM_DEFAULT_QOS_VLARB_LOW "0:0,1:4,2:4,3:4,4:4,5:4,6:4,7:4,8:4,9:4,10:4,11:4,12:4,13:4,14:4" -/***********/ -/****d* OpenSM: Base/OSM_DEFAULT_QOS_SL2VL - * Name - * OSM_DEFAULT_QOS_SL2VL - * - * DESCRIPTION - * Default QoS SL2VL Mapping Table used by the OpenSM. - * - * SYNOPSIS - */ -#define OSM_DEFAULT_QOS_SL2VL "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7" -/***********/ -/****d* OpenSM: Base/OSM_NO_PATH -* NAME -* OSM_NO_PATH -* -* DESCRIPTION -* Value indicating there is no path to the given LID. -* -* SYNOPSIS -*/ -#define OSM_NO_PATH 0xFF -/**********/ -/****d* OpenSM: Base/OSM_NODE_DESC_UNKNOWN -* NAME -* OSM_NODE_DESC_UNKNOWN -* -* DESCRIPTION -* Value indicating the Node Description is not set and is "unknown" -* -* SYNOPSIS -*/ -#define OSM_NODE_DESC_UNKNOWN "" -/**********/ -/****d* OpenSM: Base/osm_thread_state_t -* NAME -* osm_thread_state_t -* -* DESCRIPTION -* Enumerates the possible states of worker threads, such -* as the subnet sweeper. -* -* SYNOPSIS -*/ -typedef enum _osm_thread_state { - OSM_THREAD_STATE_NONE = 0, - OSM_THREAD_STATE_INIT, - OSM_THREAD_STATE_RUN, - OSM_THREAD_STATE_EXIT -} osm_thread_state_t; -/***********/ - -/* - * OSM_CAP are from IBA 1.2.1 Table 117 and Table 188 - */ - -/****d* OpenSM: Base/OSM_CAP_IS_TRAP_SUP -* Name -* OSM_CAP_IS_SUBN_TRAP_SUP -* -* DESCRIPTION -* Management class generates Trap() MADs -* -* SYNOPSIS -*/ -#define OSM_CAP_IS_SUBN_TRAP_SUP (1 << 0) -/***********/ - -/****d* OpenSM: Base/OSM_CAP_IS_GET_SET_NOTICE_SUP -* Name -* OSM_CAP_IS_GET_SET_NOTICE_SUP -* -* DESCRIPTION -* Management class supports Get/Set(Notice) -* -* SYNOPSIS -*/ -#define OSM_CAP_IS_SUBN_GET_SET_NOTICE_SUP (1 << 1) -/***********/ - -/****d* OpenSM: Base/OSM_CAP_IS_SUBN_OPT_RECS_SUP -* Name -* OSM_CAP_IS_SUBN_OPT_RECS_SUP -* -* DESCRIPTION -* Support all optional attributes except: -* MCMemberRecord, TraceRecord, MultiPathRecord -* -* SYNOPSIS -*/ -#define OSM_CAP_IS_SUBN_OPT_RECS_SUP (1 << 8) -/***********/ - -/****d* OpenSM: Base/OSM_CAP_IS_UD_MCAST_SUP -* Name -* OSM_CAP_IS_UD_MCAST_SUP -* -* DESCRIPTION -* Multicast is supported -* -* SYNOPSIS -*/ -#define OSM_CAP_IS_UD_MCAST_SUP (1 << 9) -/***********/ - -/****d* OpenSM: Base/OSM_CAP_IS_MULTIPATH_SUP -* Name -* OSM_CAP_IS_MULTIPATH_SUP -* -* DESCRIPTION -* MultiPathRecord and TraceRecord are supported -* -* SYNOPSIS -*/ -#define OSM_CAP_IS_MULTIPATH_SUP (1 << 10) -/***********/ - -/****d* OpenSM: Base/OSM_CAP_IS_REINIT_SUP -* Name -* OSM_CAP_IS_REINIT_SUP -* -* DESCRIPTION -* SM/SA supports re-initialization supported -* -* SYNOPSIS -*/ -#define OSM_CAP_IS_REINIT_SUP (1 << 11) -/***********/ - -/****d* OpenSM: Base/OSM_CAP_IS_PORT_INFO_CAPMASK_MATCH_SUPPORTED -* Name -* OSM_CAP_IS_PORT_INFO_CAPMASK_MATCH_SUPPORTED -* -* DESCRIPTION -* SM/SA supports enhanced SA PortInfoRecord searches per 1.2 Errata: -* ClassPortInfo:CapabilityMask.IsPortInfoCapMaskMatchSupported is 1, -* then the AttributeModifier of the SubnAdmGet() and SubnAdmGetTable() -* methods affects the matching behavior on the PortInfo:CapabilityMask -* component. If the high-order bit (bit 31) of the AttributeModifier -* is set to 1, matching on the CapabilityMask component will not be an -* exact bitwise match as described in . Instead, -* matching will only be performed on those bits which are set to 1 in -* the PortInfo:CapabilityMask embedded in the query. -* -* SYNOPSIS -*/ -#define OSM_CAP_IS_PORT_INFO_CAPMASK_MATCH_SUPPORTED (1 << 13) -/***********/ - -/****d* OpenSM: Base/OSM_CAP2_IS_QOS_SUPPORTED -* Name -* OSM_CAP2_IS_QOS_SUPPORTED -* -* DESCRIPTION -* QoS is supported -* -* SYNOPSIS -*/ -#define OSM_CAP2_IS_QOS_SUPPORTED (1 << 1) -/***********/ - -/****d* OpenSM: Base/OSM_CAP2_IS_REVERSE_PATH_PKEY_SUPPPORTED -* Name -* OSM_CAP2_IS_REVERSE_PATH_PKEY_SUPPPORTED -* -* DESCRIPTION -* Reverse path PKeys indicate in PathRecord responses -* -* SYNOPSIS -*/ -#define OSM_CAP2_IS_REVERSE_PATH_PKEY_SUPPPORTED (1 << 2) -/***********/ - -/****d* OpenSM: Base/OSM_CAP2_IS_MCAST_TOP_SUPPORTED -* Name -* OSM_CAP2_IS_MCAST_TOP_SUPPORTED -* -* DESCRIPTION -* SwitchInfo.MulticastFDBTop is supported -* -* SYNOPSIS -*/ -#define OSM_CAP2_IS_MCAST_TOP_SUPPORTED (1 << 3) -/***********/ - -/****d* OpenSM: Base/OSM_CAP2_IS_HIERARCHY_SUPPORTED -* Name -* -* DESCRIPTION -* Hierarchy info suppported -* -* SYNOPSIS -*/ -#define OSM_CAP2_IS_HIERARCHY_SUPPORTED (1 << 4) -/***********/ - -/****d* OpenSM: Base/osm_signal_t -* NAME -* osm_signal_t -* -* DESCRIPTION -* Enumerates the possible signal codes used by the OSM managers -* This cannot be an enum type, since conversion to and from -* integral types is necessary when passing signals through -* the dispatcher. -* -* SYNOPSIS -*/ -#define OSM_SIGNAL_NONE 0 -#define OSM_SIGNAL_SWEEP 1 -#define OSM_SIGNAL_IDLE_TIME_PROCESS_REQUEST 2 -#define OSM_SIGNAL_PERFMGR_SWEEP 3 -#define OSM_SIGNAL_MAX 3 - -typedef unsigned int osm_signal_t; -/***********/ - -/****d* OpenSM: Base/osm_sm_signal_t -* NAME -* osm_sm_signal_t -* -* DESCRIPTION -* Enumerates the possible signals used by the OSM_SM_MGR -* -* SYNOPSIS -*/ -typedef enum _osm_sm_signal { - OSM_SM_SIGNAL_NONE = 0, - OSM_SM_SIGNAL_DISCOVERY_COMPLETED, - OSM_SM_SIGNAL_POLLING_TIMEOUT, - OSM_SM_SIGNAL_DISCOVER, - OSM_SM_SIGNAL_DISABLE, - OSM_SM_SIGNAL_HANDOVER, - OSM_SM_SIGNAL_HANDOVER_SENT, - OSM_SM_SIGNAL_ACKNOWLEDGE, - OSM_SM_SIGNAL_STANDBY, - OSM_SM_SIGNAL_MASTER_OR_HIGHER_SM_DETECTED, - OSM_SM_SIGNAL_WAIT_FOR_HANDOVER, - OSM_SM_SIGNAL_MAX -} osm_sm_signal_t; -/***********/ - -/****s* OpenSM: Base/MAX_GUID_FILE_LINE_LENGTH -* NAME -* MAX_GUID_FILE_LINE_LENGTH -* -* DESCRIPTION -* The maximum line number when reading guid file -* -* SYNOPSIS -*/ -#define MAX_GUID_FILE_LINE_LENGTH 120 -/**********/ - -/****s* OpenSM: Base/VendorOUIs -* NAME -* VendorOUIs -* -* DESCRIPTION -* Known device vendor ID and GUID OUIs -* -* SYNOPSIS -*/ -#define OSM_VENDOR_ID_INTEL 0x00D0B7 -#define OSM_VENDOR_ID_MELLANOX 0x0002C9 -#define OSM_VENDOR_ID_REDSWITCH 0x000617 -#define OSM_VENDOR_ID_SILVERSTORM 0x00066A -#define OSM_VENDOR_ID_TOPSPIN 0x0005AD -#define OSM_VENDOR_ID_FUJITSU 0x00E000 -#define OSM_VENDOR_ID_FUJITSU2 0x000B5D -#define OSM_VENDOR_ID_VOLTAIRE 0x0008F1 -#define OSM_VENDOR_ID_YOTTAYOTTA 0x000453 -#define OSM_VENDOR_ID_PATHSCALE 0x001175 -#define OSM_VENDOR_ID_IBM 0x000255 -#define OSM_VENDOR_ID_DIVERGENET 0x00084E -#define OSM_VENDOR_ID_FLEXTRONICS 0x000B8C -#define OSM_VENDOR_ID_AGILENT 0x0030D3 -#define OSM_VENDOR_ID_OBSIDIAN 0x001777 -#define OSM_VENDOR_ID_BAYMICRO 0x000BC1 -#define OSM_VENDOR_ID_LSILOGIC 0x00A0B8 -#define OSM_VENDOR_ID_DDN 0x0001FF -#define OSM_VENDOR_ID_PANTA 0x001393 -#define OSM_VENDOR_ID_HP 0x001708 -#define OSM_VENDOR_ID_RIOWORKS 0x005045 -#define OSM_VENDOR_ID_SUN 0x0003BA -#define OSM_VENDOR_ID_SUN2 0x002128 -#define OSM_VENDOR_ID_3LEAFNTWKS 0x0016A1 -#define OSM_VENDOR_ID_XSIGO 0x001397 -#define OSM_VENDOR_ID_HP2 0x0018FE -#define OSM_VENDOR_ID_DELL 0x00188B -#define OSM_VENDOR_ID_SUPERMICRO 0x003048 -#define OSM_VENDOR_ID_HP3 0x0019BB -#define OSM_VENDOR_ID_HP4 0x00237D - -/**********/ - -END_C_DECLS -#endif /* _OSM_BASE_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_config.h b/branches/opensm_3/user/include/opensm/osm_config.h deleted file mode 100644 index 2b940989..00000000 --- a/branches/opensm_3/user/include/opensm/osm_config.h +++ /dev/null @@ -1,69 +0,0 @@ -/* include/opensm/osm_config.h. Generated from osm_config.h.in by configure. */ -/* include/osm_config.h.in - * - * Defines various OpenSM configuration parameters to be used by various - * plugins and third party tools. - * - * NOTE: Defines used in header files MUST be included here to ensure plugin - * compatibility. - */ - -#ifndef _OSM_CONFIG_H_ -#define _OSM_CONFIG_H_ 1 - -/* define 1 if OpenSM build is in a debug mode */ -/* #undef OSM_DEBUG */ - -/* Define as 1 if you want Dual Sided RMPP Support */ -#define DUAL_SIDED_RMPP 1 - -/* Define as 1 if you want to enable a console on a socket connection */ -/* #undef ENABLE_OSM_CONSOLE_SOCKET */ - -/* Define as 1 if you want to enable the event plugin */ -/* #undef ENABLE_OSM_DEFAULT_EVENT_PLUGIN */ - -/* Define as 1 if you want to enable the performance manager */ -/* #undef ENABLE_OSM_PERF_MGR */ - -/* Define as 1 if you want to enable the performance manager profiling code */ -/* #undef ENABLE_OSM_PERF_MGR_PROFILE */ - -/* Define OpenSM config directory */ -#define OPENSM_CONFIG_DIR "%ProgramFiles%\\OFED\\OpenSM" - -/* Define a default node name map file */ -#define HAVE_DEFAULT_NODENAME_MAP OPENSM_CONFIG_DIR "\\ib-node-name-map" - -/* Define a default OpenSM config file */ -#define HAVE_DEFAULT_OPENSM_CONFIG_FILE OPENSM_CONFIG_DIR "\\opensm.conf" - -/* Define a Partition config file */ -#define HAVE_DEFAULT_PARTITION_CONFIG_FILE OPENSM_CONFIG_DIR "\\partitions.conf" - -/* Define a Prefix Routes config file */ -#define HAVE_DEFAULT_PREFIX_ROUTES_FILE OPENSM_CONFIG_DIR "\\prefix-routes.conf" - -/* Define a QOS policy config file */ -#define HAVE_DEFAULT_QOS_POLICY_FILE OPENSM_CONFIG_DIR "\\qos-policy.conf" - -/* Define as 1 for vapi vendor */ -/* #undef OSM_VENDOR_INTF_MTL */ - -/* Define as 1 for OpenIB vendor */ -#ifdef OSM_VENDOR_INTF_AL -#undef OSM_VENDOR_INTF_OPENIB -#else -#define OSM_VENDOR_INTF_OPENIB 1 -#endif - -/* Define as 1 for sim vendor */ -/* #undef OSM_VENDOR_INTF_SIM */ - -/* Define as 1 for ts vendor */ -/* #undef OSM_VENDOR_INTF_TS */ - -/* Define as 1 if you want Vendor RMPP Support */ -#define VENDOR_RMPP_SUPPORT 1 - -#endif /* _OSM_CONFIG_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_config.h.in b/branches/opensm_3/user/include/opensm/osm_config.h.in deleted file mode 100644 index 3164568e..00000000 --- a/branches/opensm_3/user/include/opensm/osm_config.h.in +++ /dev/null @@ -1,64 +0,0 @@ -/* include/osm_config.h.in - * - * Defines various OpenSM configuration parameters to be used by various - * plugins and third party tools. - * - * NOTE: Defines used in header files MUST be included here to ensure plugin - * compatibility. - */ - -#ifndef _OSM_CONFIG_H_ -#define _OSM_CONFIG_H_ - -/* define 1 if OpenSM build is in a debug mode */ -#undef OSM_DEBUG - -/* Define as 1 if you want Dual Sided RMPP Support */ -#undef DUAL_SIDED_RMPP - -/* Define as 1 if you want to enable a console on a socket connection */ -#undef ENABLE_OSM_CONSOLE_SOCKET - -/* Define as 1 if you want to enable the event plugin */ -#undef ENABLE_OSM_DEFAULT_EVENT_PLUGIN - -/* Define as 1 if you want to enable the performance manager */ -#undef ENABLE_OSM_PERF_MGR - -/* Define as 1 if you want to enable the performance manager profiling code */ -#undef ENABLE_OSM_PERF_MGR_PROFILE - -/* Define a default node name map file */ -#undef HAVE_DEFAULT_NODENAME_MAP - -/* Define a default OpenSM config file */ -#undef HAVE_DEFAULT_OPENSM_CONFIG_FILE - -/* Define a Partition config file */ -#undef HAVE_DEFAULT_PARTITION_CONFIG_FILE - -/* Define a Prefix Routes config file */ -#undef HAVE_DEFAULT_PREFIX_ROUTES_FILE - -/* Define a QOS policy config file */ -#undef HAVE_DEFAULT_QOS_POLICY_FILE - -/* Define OpenSM config directory */ -#undef OPENSM_CONFIG_DIR - -/* Define as 1 for vapi vendor */ -#undef OSM_VENDOR_INTF_MTL - -/* Define as 1 for OpenIB vendor */ -#undef OSM_VENDOR_INTF_OPENIB - -/* Define as 1 for sim vendor */ -#undef OSM_VENDOR_INTF_SIM - -/* Define as 1 for ts vendor */ -#undef OSM_VENDOR_INTF_TS - -/* Define as 1 if you want Vendor RMPP Support */ -#undef VENDOR_RMPP_SUPPORT - -#endif /* _OSM_CONFIG_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_console.h b/branches/opensm_3/user/include/opensm/osm_console.h deleted file mode 100644 index 671c57d5..00000000 --- a/branches/opensm_3/user/include/opensm/osm_console.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2005-2007 Voltaire, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_CONSOLE_H_ -#define _OSM_CONSOLE_H_ - -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -int osm_console(osm_opensm_t * p_osm); -END_C_DECLS -#endif /* _OSM_CONSOLE_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_console_io.h b/branches/opensm_3/user/include/opensm/osm_console_io.h deleted file mode 100644 index 39a64df2..00000000 --- a/branches/opensm_3/user/include/opensm/osm_console_io.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2005-2007 Voltaire, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ -/* - * Abstract: - * Declaration of osm_console_t. - * This object represents the OpenSM Console object. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_CONSOLE_IO_H_ -#define _OSM_CONSOLE_IO_H_ - -#include -#include - -#define OSM_DISABLE_CONSOLE "off" -#define OSM_LOCAL_CONSOLE "local" -#define OSM_REMOTE_CONSOLE "socket" -#define OSM_LOOPBACK_CONSOLE "loopback" -#define OSM_CONSOLE_NAME "OSM Console" - -#define OSM_DEFAULT_CONSOLE OSM_DISABLE_CONSOLE -#define OSM_DEFAULT_CONSOLE_PORT 10000 -#define OSM_DAEMON_NAME "opensm" - -#define OSM_COMMAND_PROMPT "$ " - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -typedef struct osm_console { - int socket; - int in_fd; - int out_fd; - int authorized; - FILE *in; - FILE *out; - char client_type[32]; - char client_ip[64]; - char client_hn[128]; -} osm_console_t; - -void osm_console_prompt(FILE * out); -int osm_console_init(osm_subn_opt_t * opt, osm_console_t * p_oct, osm_log_t * p_log); -void osm_console_exit(osm_console_t * p_oct, osm_log_t * p_log); -int is_console_enabled(osm_subn_opt_t *p_opt); - -#ifdef ENABLE_OSM_CONSOLE_SOCKET -int cio_open(osm_console_t * p_oct, int new_fd, osm_log_t * p_log); -int cio_close(osm_console_t * p_oct, osm_log_t * p_log); -int is_authorized(osm_console_t * p_oct); -#else -#define cio_close(c, log) -#endif - -END_C_DECLS -#endif /* _OSM_CONSOLE_IO_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_db.h b/branches/opensm_3/user/include/opensm/osm_db.h deleted file mode 100644 index fd2d3c85..00000000 --- a/branches/opensm_3/user/include/opensm/osm_db.h +++ /dev/null @@ -1,424 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_DB_H_ -#define _OSM_DB_H_ - -/* - * Abstract: - * Declaration of the DB interface. - */ - -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Database -* NAME -* Database -* -* DESCRIPTION -* The OpenSM database interface provide the means to restore persistent -* data, query, modify, delete and eventually commit it back to the -* persistent media. -* -* The interface is defined such that it can is not "data dependent": -* All keys and data items are texts. -* -* The DB implementation should be thread safe, thus callers do not need to -* provide serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Eitan Zahavi, Mellanox Technologies LTD -* -*********/ -/****s* OpenSM: Database/osm_db_domain_t -* NAME -* osm_db_domain_t -* -* DESCRIPTION -* A domain of the database. Can be viewed as a database table. -* -* The osm_db_domain_t object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_db_domain { - struct osm_db *p_db; - void *p_domain_imp; -} osm_db_domain_t; -/* -* FIELDS -* p_db -* Pointer to the parent database object. -* -* p_domain_imp -* Pointer to the db implementation object -* -* SEE ALSO -* osm_db_t -*********/ - -/****s* OpenSM: Database/osm_db_t -* NAME -* osm_db_t -* -* DESCRIPTION -* The main database object. -* -* The osm_db_t object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_db { - void *p_db_imp; - osm_log_t *p_log; - cl_list_t domains; -} osm_db_t; -/* -* FIELDS -* p_db_imp -* Pointer to the database implementation object -* -* p_log -* Pointer to the OSM logging facility -* -* domains -* List of initialize domains -* -* SEE ALSO -*********/ - -/****f* OpenSM: Database/osm_db_construct -* NAME -* osm_db_construct -* -* DESCRIPTION -* Construct a database. -* -* SYNOPSIS -*/ -void osm_db_construct(IN osm_db_t * p_db); -/* -* PARAMETERS -* p_db -* [in] Pointer to the database object to construct -* -* RETURN VALUES -* NONE -* -* SEE ALSO -* Database, osm_db_init, osm_db_destroy -*********/ - -/****f* OpenSM: Database/osm_db_destroy -* NAME -* osm_db_destroy -* -* DESCRIPTION -* Destroys the osm_db_t structure. -* -* SYNOPSIS -*/ -void osm_db_destroy(IN osm_db_t * p_db); -/* -* PARAMETERS -* p_db -* [in] Pointer to osm_db_t structure to destroy -* -* SEE ALSO -* Database, osm_db_construct, osm_db_init -*********/ - -/****f* OpenSM: Database/osm_db_init -* NAME -* osm_db_init -* -* DESCRIPTION -* Initializes the osm_db_t structure. -* -* SYNOPSIS -*/ -int osm_db_init(IN osm_db_t * p_db, IN osm_log_t * p_log); -/* -* PARAMETERS -* -* p_db -* [in] Pointer to the database object to initialize -* -* p_log -* [in] Pointer to the OSM logging facility -* -* RETURN VALUES -* 0 on success 1 otherwise -* -* SEE ALSO -* Database, osm_db_construct, osm_db_destroy -*********/ - -/****f* OpenSM: Database/osm_db_domain_init -* NAME -* osm_db_domain_init -* -* DESCRIPTION -* Initializes the osm_db_domain_t structure. -* -* SYNOPSIS -*/ -osm_db_domain_t *osm_db_domain_init(IN osm_db_t * p_db, IN char *domain_name); -/* -* PARAMETERS -* -* p_db -* [in] Pointer to the database object to initialize -* -* domain_name -* [in] a char array with the domain name. -* -* RETURN VALUES -* pointer to the new domain object or NULL if failed. -* -* SEE ALSO -* Database, osm_db_construct, osm_db_destroy -*********/ - -/****f* OpenSM: Database/osm_db_restore -* NAME -* osm_db_restore -* -* DESCRIPTION -* Reads the entire domain from persistent storage - overrides all -* existing cached data (if any). -* -* SYNOPSIS -*/ -int osm_db_restore(IN osm_db_domain_t * p_domain); -/* -* PARAMETERS -* -* p_domain -* [in] Pointer to the database domain object to restore -* from persistent db -* -* RETURN VALUES -* 0 if successful 1 otherwize -* -* SEE ALSO -* Database, osm_db_domain_init, osm_db_clear, osm_db_store, -* osm_db_keys, osm_db_lookup, osm_db_update, osm_db_delete -*********/ - -/****f* OpenSM: Database/osm_db_clear -* NAME -* osm_db_clear -* -* DESCRIPTION -* Clears the entire domain values from/in the cache -* -* SYNOPSIS -*/ -int osm_db_clear(IN osm_db_domain_t * p_domain); -/* -* PARAMETERS -* -* p_domain -* [in] Pointer to the database domain object to clear -* -* RETURN VALUES -* 0 if successful 1 otherwize -* -* SEE ALSO -* Database, osm_db_domain_init, osm_db_restore, osm_db_store, -* osm_db_keys, osm_db_lookup, osm_db_update, osm_db_delete -*********/ - -/****f* OpenSM: Database/osm_db_store -* NAME -* osm_db_store -* -* DESCRIPTION -* Store the domain cache back to the database (commit) -* -* SYNOPSIS -*/ -int osm_db_store(IN osm_db_domain_t * p_domain); -/* -* PARAMETERS -* -* p_domain -* [in] Pointer to the database domain object to restore from -* persistent db -* -* RETURN VALUES -* 0 if successful 1 otherwize -* -* SEE ALSO -* Database, osm_db_domain_init, osm_db_restore, osm_db_clear, -* osm_db_keys, osm_db_lookup, osm_db_update, osm_db_delete -*********/ - -/****f* OpenSM: Database/osm_db_keys -* NAME -* osm_db_keys -* -* DESCRIPTION -* Retrive all keys of the domain -* -* SYNOPSIS -*/ -int osm_db_keys(IN osm_db_domain_t * p_domain, OUT cl_list_t * p_key_list); -/* -* PARAMETERS -* -* p_domain -* [in] Pointer to the database domain object -* -* p_key_list -* [out] List of key values. It should be PRE constructed and initialized. -* -* RETURN VALUES -* 0 if successful 1 otherwize -* -* NOTE: the caller needs to free and destruct the list, -* the keys returned are intrnal to the hash and should NOT be free'ed -* -* SEE ALSO -* Database, osm_db_domain_init, osm_db_restore, osm_db_clear, osm_db_store, -* osm_db_lookup, osm_db_update, osm_db_delete -*********/ - -/****f* OpenSM: Database/osm_db_lookup -* NAME -* osm_db_lookup -* -* DESCRIPTION -* Lookup an entry in the domain by the given key -* -* SYNOPSIS -*/ -/* lookup value by key */ -char *osm_db_lookup(IN osm_db_domain_t * p_domain, IN char *p_key); -/* -* PARAMETERS -* -* p_domain -* [in] Pointer to the database domain object -* -* key -* [in] The key to look for -* -* RETURN VALUES -* the value as char * or NULL if not found -* -* SEE ALSO -* Database, osm_db_domain_init, osm_db_restore, osm_db_clear, osm_db_store, -* osm_db_keys, osm_db_update, osm_db_delete -*********/ - -/****f* OpenSM: Database/osm_db_update -* NAME -* osm_db_update -* -* DESCRIPTION -* Set the value of the given key -* -* SYNOPSIS -*/ -int osm_db_update(IN osm_db_domain_t * p_domain, IN char *p_key, IN char *p_val); -/* -* PARAMETERS -* -* p_domain -* [in] Pointer to the database domain object -* -* p_key -* [in] The key to update -* -* p_val -* [in] The value to update -* -* RETURN VALUES -* 0 on success -* -* NOTE: the value will be duplicated so can be free'ed -* -* SEE ALSO -* Database, osm_db_domain_init, osm_db_restore, osm_db_clear, osm_db_store, -* osm_db_keys, osm_db_lookup, osm_db_delete -*********/ - -/****f* OpenSM: Database/osm_db_delete -* NAME -* osm_db_delete -* -* DESCRIPTION -* Delete an entry by the given key -* -* SYNOPSIS -*/ -int osm_db_delete(IN osm_db_domain_t * p_domain, IN char *p_key); -/* -* PARAMETERS -* -* p_domain -* [in] Pointer to the database domain object -* -* p_key -* [in] The key to look for -* -* RETURN VALUES -* 0 on success -* -* SEE ALSO -* Database, osm_db_domain_init, osm_db_restore, osm_db_clear, osm_db_store, -* osm_db_keys, osm_db_lookup, osm_db_update -*********/ - -END_C_DECLS -#endif /* _OSM_DB_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_db_pack.h b/branches/opensm_3/user/include/opensm/osm_db_pack.h deleted file mode 100644 index 039cbd8d..00000000 --- a/branches/opensm_3/user/include/opensm/osm_db_pack.h +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/****h* OpenSM/DB-Pack -* NAME -* Database Types -* -* DESCRIPTION -* This module provides packing and unpacking of the database -* storage into specific types. -* -* The following domains/conversions are supported: -* guid2lid - key is a guid and data is a lid. -* -* AUTHOR -* Eitan Zahavi, Mellanox Technologies LTD -* -*********/ - -#ifndef _OSM_DB_PACK_H_ -#define _OSM_DB_PACK_H_ - -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****f* OpenSM: DB-Pack/osm_db_guid2lid_init -* NAME -* osm_db_guid2lid_init -* -* DESCRIPTION -* Initialize a domain for the guid2lid table -* -* SYNOPSIS -*/ -static inline osm_db_domain_t *osm_db_guid2lid_init(IN osm_db_t * p_db) -{ - return (osm_db_domain_init(p_db, "guid2lid")); -} - -/* -* PARAMETERS -* p_db -* [in] Pointer to the database object to construct -* -* RETURN VALUES -* The pointer to the new allocated domain object or NULL. -* -* NOTE: DB domains are destroyed by the osm_db_destroy -* -* SEE ALSO -* Database, osm_db_init, osm_db_destroy -*********/ - -/****f* OpenSM: DB-Pack/osm_db_guid2lid_init -* NAME -* osm_db_guid2lid_init -* -* DESCRIPTION -* Initialize a domain for the guid2lid table -* -* SYNOPSIS -*/ -typedef struct osm_db_guid_elem { - cl_list_item_t item; - uint64_t guid; -} osm_db_guid_elem_t; -/* -* FIELDS -* item -* required for list manipulations -* -* guid -* -************/ - -/****f* OpenSM: DB-Pack/osm_db_guid2lid_guids -* NAME -* osm_db_guid2lid_guids -* -* DESCRIPTION -* Provides back a list of guid elements. -* -* SYNOPSIS -*/ -int osm_db_guid2lid_guids(IN osm_db_domain_t * p_g2l, - OUT cl_qlist_t * p_guid_list); -/* -* PARAMETERS -* p_g2l -* [in] Pointer to the guid2lid domain -* -* p_guid_list -* [out] A quick list of guid elements of type osm_db_guid_elem_t -* -* RETURN VALUES -* 0 if successful -* -* NOTE: the output qlist should be initialized and each item freed -* by the caller, then destroyed. -* -* SEE ALSO -* osm_db_guid2lid_init, osm_db_guid2lid_guids, osm_db_guid2lid_get -* osm_db_guid2lid_set, osm_db_guid2lid_delete -*********/ - -/****f* OpenSM: DB-Pack/osm_db_guid2lid_get -* NAME -* osm_db_guid2lid_get -* -* DESCRIPTION -* Get a lid range by given guid. -* -* SYNOPSIS -*/ -int osm_db_guid2lid_get(IN osm_db_domain_t * p_g2l, IN uint64_t guid, - OUT uint16_t * p_min_lid, OUT uint16_t * p_max_lid); -/* -* PARAMETERS -* p_g2l -* [in] Pointer to the guid2lid domain -* -* guid -* [in] The guid to look for -* -* p_min_lid -* [out] Pointer to the resulting min lid in host order. -* -* p_max_lid -* [out] Pointer to the resulting max lid in host order. -* -* RETURN VALUES -* 0 if successful. The lid will be set to 0 if not found. -* -* SEE ALSO -* osm_db_guid2lid_init, osm_db_guid2lid_guids -* osm_db_guid2lid_set, osm_db_guid2lid_delete -*********/ - -/****f* OpenSM: DB-Pack/osm_db_guid2lid_set -* NAME -* osm_db_guid2lid_set -* -* DESCRIPTION -* Set a lid range for the given guid. -* -* SYNOPSIS -*/ -int osm_db_guid2lid_set(IN osm_db_domain_t * p_g2l, IN uint64_t guid, - IN uint16_t min_lid, IN uint16_t max_lid); -/* -* PARAMETERS -* p_g2l -* [in] Pointer to the guid2lid domain -* -* guid -* [in] The guid to look for -* -* min_lid -* [in] The min lid value to set -* -* max_lid -* [in] The max lid value to set -* -* RETURN VALUES -* 0 if successful -* -* SEE ALSO -* osm_db_guid2lid_init, osm_db_guid2lid_guids -* osm_db_guid2lid_get, osm_db_guid2lid_delete -*********/ - -/****f* OpenSM: DB-Pack/osm_db_guid2lid_delete -* NAME -* osm_db_guid2lid_delete -* -* DESCRIPTION -* Delete the entry by the given guid -* -* SYNOPSIS -*/ -int osm_db_guid2lid_delete(IN osm_db_domain_t * p_g2l, IN uint64_t guid); -/* -* PARAMETERS -* p_g2l -* [in] Pointer to the guid2lid domain -* -* guid -* [in] The guid to look for -* -* RETURN VALUES -* 0 if successful otherwise 1 -* -* SEE ALSO -* osm_db_guid2lid_init, osm_db_guid2lid_guids -* osm_db_guid2lid_get, osm_db_guid2lid_set -*********/ - -END_C_DECLS -#endif /* _OSM_DB_PACK_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_errors.h b/branches/opensm_3/user/include/opensm/osm_errors.h deleted file mode 100644 index 667e0b48..00000000 --- a/branches/opensm_3/user/include/opensm/osm_errors.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of error code ranges for the various OpenSM modules. - */ - -#ifndef _OSM_ERRORS_H_ -#define _OSM_ERRORS_H_ - -/* - Generic Request Controller - 0100 - 01FF - - Node Info Receive Controller - 0200 - 02FF - - Generic Requester - 0300 - 03FF - - Node Info Receiver - 0400 - 04FF - - Node Description Receiver - 0500 - 05FF - - Node Description Receive Controller - 0600 - 06FF - - Port Info Receiver - 0700 - 07FF - - Port Info Receive Controller - 0800 - 08FF - - Mad Pool - 0900 - 09FF - - SM - 1000 - 10FF - - SM MAD Controller - 1100 - 11FF - - VL15 Interface - 1200 - 12FF - - Switch Info Receive Controller - 1300 - 13FF - - Switch Info Receiver - 1400 - 14FF - - State Manager - 1500 - 15FF - - State Manager Controller - 1600 - 16FF - - LID Manager - 1700 - 17FF - - Link Manager - 1800 - 18FF - - Drop Manager - 1900 - 19FF - - Linear Forwarding Receive Controller - 2000 - 20FF - - Linear Forwarding Receiver - 2100 - 21FF - - Vendor Specific - 2200 - 22FF - - SMInfo Receive Controller - 2300 - 23FF - - SMInfo Info Receiver - 2400 - 24FF - - Generic Responder - 2500 - 25FF - - Linear Forwarding Receive Controller - 2600 - 26FF - - Linear Forwarding Receiver - 2700 - 27FF - - SA MAD controller - 2800 - 28FF - - Node Record Controller - 2900 - 29FF - - PortInfo Record Controller - 3000 - 30FF - - Link Record Controller - 3100 - 31FF - - Path Record Controller - 3200 - 32FF - - SMInfo Record Controller - 3300 - 33FF - - Multicast Record Controller - 3400 - 34FF - - Unicast Manager - 3500 - 35FF - - Multicast Manager - 3600 - 36FF - - SA Response - 3700 - 37FF - - Link Record Receiver - 3800 - 38FF - - Multicast Forwarding Receive Controller - 3900 - 39FF - - Multicast Forwarding Receiver - 4000 - 40FF - - SMInfo Record Receiver - 4100 - 41FF - - PortInfo Record Receiver - 4200 - 42FF - - Service Record Receiver - 4300 - 43FF - -*/ - -#endif /* _OSM_ERRORS_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_event_plugin.h b/branches/opensm_3/user/include/opensm/osm_event_plugin.h deleted file mode 100644 index 1ba26593..00000000 --- a/branches/opensm_3/user/include/opensm/osm_event_plugin.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2007 The Regents of the University of California. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_EVENT_PLUGIN_H_ -#define _OSM_EVENT_PLUGIN_H_ - -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM Event plugin interface -* DESCRIPTION -* Database interface to record subnet events -* -* Implementations of this object _MUST_ be thread safe. -* -* AUTHOR -* Ira Weiny, LLNL -* -*********/ - -#define OSM_EPI_NODE_NAME_LEN (65) - -struct osm_opensm; -/** ========================================================================= - * Event types - */ -typedef enum { - OSM_EVENT_ID_PORT_ERRORS = 0, - OSM_EVENT_ID_PORT_DATA_COUNTERS, - OSM_EVENT_ID_PORT_SELECT, - OSM_EVENT_ID_TRAP, - OSM_EVENT_ID_SUBNET_UP, - OSM_EVENT_ID_MAX -} osm_epi_event_id_t; - -typedef struct osm_epi_port_id { - uint64_t node_guid; - uint8_t port_num; - char node_name[OSM_EPI_NODE_NAME_LEN]; -} osm_epi_port_id_t; - -/** ========================================================================= - * Port error event - * OSM_EVENT_ID_PORT_COUNTER - * This is a difference from the last reading. NOT an absolute reading. - */ -typedef struct osm_epi_pe_event { - osm_epi_port_id_t port_id; - uint64_t symbol_err_cnt; - uint64_t link_err_recover; - uint64_t link_downed; - uint64_t rcv_err; - uint64_t rcv_rem_phys_err; - uint64_t rcv_switch_relay_err; - uint64_t xmit_discards; - uint64_t xmit_constraint_err; - uint64_t rcv_constraint_err; - uint64_t link_integrity; - uint64_t buffer_overrun; - uint64_t vl15_dropped; - time_t time_diff_s; -} osm_epi_pe_event_t; - -/** ========================================================================= - * Port data counter event - * This is a difference from the last reading. NOT an absolute reading. - */ -typedef struct osm_epi_dc_event { - osm_epi_port_id_t port_id; - uint64_t xmit_data; - uint64_t rcv_data; - uint64_t xmit_pkts; - uint64_t rcv_pkts; - uint64_t unicast_xmit_pkts; - uint64_t unicast_rcv_pkts; - uint64_t multicast_xmit_pkts; - uint64_t multicast_rcv_pkts; - time_t time_diff_s; -} osm_epi_dc_event_t; - -/** ========================================================================= - * Port select event - * This is a difference from the last reading. NOT an absolute reading. - */ -typedef struct osm_api_ps_event { - osm_epi_port_id_t port_id; - uint64_t xmit_wait; - time_t time_diff_s; -} osm_epi_ps_event_t; - -/** ========================================================================= - * Plugin creators should allocate an object of this type - * (named OSM_EVENT_PLUGIN_IMPL_NAME) - * The version should be set to OSM_EVENT_PLUGIN_INTERFACE_VER - */ -#define OSM_EVENT_PLUGIN_IMPL_NAME "osm_event_plugin" -#define OSM_ORIG_EVENT_PLUGIN_INTERFACE_VER 1 -#define OSM_EVENT_PLUGIN_INTERFACE_VER 2 -typedef struct osm_event_plugin { - const char *osm_version; - void *(*create) (struct osm_opensm *osm); - void (*delete) (void *plugin_data); - void (*report) (void *plugin_data, osm_epi_event_id_t event_id, - void *event_data); -} osm_event_plugin_t; - -/** ========================================================================= - * The plugin structure should be considered opaque - */ -typedef struct osm_epi_plugin { - cl_list_item_t list; - void *handle; - osm_event_plugin_t *impl; - void *plugin_data; - char *plugin_name; -} osm_epi_plugin_t; - -/** - * functions - */ -osm_epi_plugin_t *osm_epi_construct(struct osm_opensm *osm, char *plugin_name); -void osm_epi_destroy(osm_epi_plugin_t * plugin); - -/** ========================================================================= - * Helper functions - */ -static inline void -osm_epi_create_port_id(osm_epi_port_id_t * port_id, uint64_t node_guid, - uint8_t port_num, char *node_name) -{ - port_id->node_guid = node_guid; - port_id->port_num = port_num; - strncpy(port_id->node_name, node_name, OSM_EPI_NODE_NAME_LEN); - port_id->node_name[OSM_EPI_NODE_NAME_LEN - 1] = '\0'; -} - -END_C_DECLS -#endif /* _OSM_EVENT_PLUGIN_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_helper.h b/branches/opensm_3/user/include/opensm/osm_helper.h deleted file mode 100644 index 1c2fae63..00000000 --- a/branches/opensm_3/user/include/opensm/osm_helper.h +++ /dev/null @@ -1,549 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_HELPER_H_ -#define _OSM_HELPER_H_ - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* - * Abstract: - * Declaration of helpful functions. - */ -/****f* OpenSM: Helper/ib_get_sa_method_str - * NAME - * ib_get_sa_method_str - * - * DESCRIPTION - * Returns a string for the specified SA Method value. - * - * SYNOPSIS - */ -const char *ib_get_sa_method_str(IN uint8_t method); -/* - * PARAMETERS - * method - * [in] Network order METHOD ID value. - * - * RETURN VALUES - * Pointer to the method string. - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OpenSM: Helper/ib_get_sm_method_str -* NAME -* ib_get_sm_method_str -* -* DESCRIPTION -* Returns a string for the specified SM Method value. -* -* SYNOPSIS -*/ -const char *ib_get_sm_method_str(IN uint8_t method); -/* -* PARAMETERS -* method -* [in] Network order METHOD ID value. -* -* RETURN VALUES -* Pointer to the method string. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Helper/ib_get_sm_attr_str -* NAME -* ib_get_sm_attr_str -* -* DESCRIPTION -* Returns a string for the specified SM attribute value. -* -* SYNOPSIS -*/ -const char *ib_get_sm_attr_str(IN ib_net16_t attr); -/* -* PARAMETERS -* attr -* [in] Network order attribute ID value. -* -* RETURN VALUES -* Pointer to the attribute string. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Helper/ib_get_sa_attr_str -* NAME -* ib_get_sa_attr_str -* -* DESCRIPTION -* Returns a string for the specified SA attribute value. -* -* SYNOPSIS -*/ -const char *ib_get_sa_attr_str(IN ib_net16_t attr); -/* -* PARAMETERS -* attr -* [in] Network order attribute ID value. -* -* RETURN VALUES -* Pointer to the attribute string. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Helper/ib_get_trap_str -* NAME -* ib_get_trap_str -* -* DESCRIPTION -* Returns a name for the specified trap. -* -* SYNOPSIS -*/ -const char *ib_get_trap_str(uint16_t trap_num); -/* -* PARAMETERS -* trap_num -* [in] Network order trap number. -* -* RETURN VALUES -* Name of the trap. -* -*********/ - -extern const ib_gid_t ib_zero_gid; - -/****f* IBA Base: Types/ib_gid_is_notzero -* NAME -* ib_gid_is_notzero -* -* DESCRIPTION -* Returns a boolean indicating whether or not the GID is zero. -* -* SYNOPSIS -*/ -static inline boolean_t ib_gid_is_notzero(IN const ib_gid_t * p_gid) -{ - return memcmp(p_gid, &ib_zero_gid, sizeof(*p_gid)); -} - -/* -* PARAMETERS -* p_gid -* [in] Pointer to the GID object. -* -* RETURN VALUES -* Returns TRUE if GID is not zero. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* ib_gid_t -*********/ - -/****f* OpenSM: Helper/osm_dump_port_info -* NAME -* osm_dump_port_info -* -* DESCRIPTION -* Dumps the PortInfo attribute to the log. -* -* SYNOPSIS -*/ -void osm_dump_port_info(IN osm_log_t * p_log, IN ib_net64_t node_guid, - IN ib_net64_t port_guid, IN uint8_t port_num, - IN const ib_port_info_t * p_pi, - IN osm_log_level_t log_level); -/* -* PARAMETERS -* p_log -* [in] Pointer to the osm_log_t object -* -* node_guid -* [in] Node GUID that owns this port. -* -* port_guid -* [in] Port GUID for this port. -* -* port_num -* [in] Port number for this port. -* -* p_pi -* [in] Pointer to the PortInfo attribute -* -* log_level -* [in] Log verbosity level with which to dump the data. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -void osm_dump_path_record(IN osm_log_t * p_log, IN const ib_path_rec_t * p_pr, - IN osm_log_level_t log_level); - -void osm_dump_multipath_record(IN osm_log_t * p_log, - IN const ib_multipath_rec_t * p_mpr, - IN osm_log_level_t log_level); - -void osm_dump_node_record(IN osm_log_t * p_log, - IN const ib_node_record_t * p_nr, - IN osm_log_level_t log_level); - -void osm_dump_mc_record(IN osm_log_t * p_log, IN const ib_member_rec_t * p_mcmr, - IN osm_log_level_t log_level); - -void osm_dump_link_record(IN osm_log_t * p_log, - IN const ib_link_record_t * p_lr, - IN osm_log_level_t log_level); - -void osm_dump_service_record(IN osm_log_t * p_log, - IN const ib_service_record_t * p_sr, - IN osm_log_level_t log_level); - -void osm_dump_portinfo_record(IN osm_log_t * p_log, - IN const ib_portinfo_record_t * p_pir, - IN osm_log_level_t log_level); - -void osm_dump_guidinfo_record(IN osm_log_t * p_log, - IN const ib_guidinfo_record_t * p_gir, - IN osm_log_level_t log_level); - -void osm_dump_inform_info(IN osm_log_t * p_log, - IN const ib_inform_info_t * p_ii, - IN osm_log_level_t log_level); - -void osm_dump_inform_info_record(IN osm_log_t * p_log, - IN const ib_inform_info_record_t * p_iir, - IN osm_log_level_t log_level); - -void osm_dump_switch_info_record(IN osm_log_t * p_log, - IN const ib_switch_info_record_t * p_sir, - IN osm_log_level_t log_level); - -void osm_dump_sm_info_record(IN osm_log_t * p_log, - IN const ib_sminfo_record_t * p_smir, - IN osm_log_level_t log_level); - -void osm_dump_pkey_block(IN osm_log_t * p_log, IN uint64_t port_guid, - IN uint16_t block_num, IN uint8_t port_num, - IN const ib_pkey_table_t * p_pkey_tbl, - IN osm_log_level_t log_level); - -void osm_dump_slvl_map_table(IN osm_log_t * p_log, IN uint64_t port_guid, - IN uint8_t in_port_num, IN uint8_t out_port_num, - IN const ib_slvl_table_t * p_slvl_tbl, - IN osm_log_level_t log_level); - -void osm_dump_vl_arb_table(IN osm_log_t * p_log, IN uint64_t port_guid, - IN uint8_t block_num, IN uint8_t port_num, - IN const ib_vl_arb_table_t * p_vla_tbl, - IN osm_log_level_t log_level); - -/****f* OpenSM: Helper/osm_dump_port_info -* NAME -* osm_dump_port_info -* -* DESCRIPTION -* Dumps the PortInfo attribute to the log. -* -* SYNOPSIS -*/ -void osm_dump_node_info(IN osm_log_t * p_log, - IN const ib_node_info_t * p_ni, - IN osm_log_level_t log_level); -/* -* PARAMETERS -* p_log -* [in] Pointer to the osm_log_t object -* -* p_ni -* [in] Pointer to the NodeInfo attribute -* -* log_level -* [in] Log verbosity level with which to dump the data. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Helper/osm_dump_sm_info -* NAME -* osm_dump_sm_info -* -* DESCRIPTION -* Dumps the SMInfo attribute to the log. -* -* SYNOPSIS -*/ -void osm_dump_sm_info(IN osm_log_t * p_log, IN const ib_sm_info_t * p_smi, - IN osm_log_level_t log_level); -/* -* PARAMETERS -* p_log -* [in] Pointer to the osm_log_t object -* -* p_smi -* [in] Pointer to the SMInfo attribute -* -* log_level -* [in] Log verbosity level with which to dump the data. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Helper/osm_dump_switch_info -* NAME -* osm_dump_switch_info -* -* DESCRIPTION -* Dumps the SwitchInfo attribute to the log. -* -* SYNOPSIS -*/ -void osm_dump_switch_info(IN osm_log_t * p_log, - IN const ib_switch_info_t * p_si, - IN osm_log_level_t log_level); -/* -* PARAMETERS -* p_log -* [in] Pointer to the osm_log_t object -* -* p_si -* [in] Pointer to the SwitchInfo attribute -* -* log_level -* [in] Log verbosity level with which to dump the data. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Helper/osm_dump_notice -* NAME -* osm_dump_notice -* -* DESCRIPTION -* Dumps the Notice attribute to the log. -* -* SYNOPSIS -*/ -void osm_dump_notice(IN osm_log_t * p_log, - IN const ib_mad_notice_attr_t * p_ntci, - IN osm_log_level_t log_level); -/* -* PARAMETERS -* p_log -* [in] Pointer to the osm_log_t object -* -* p_ntci -* [in] Pointer to the Notice attribute -* -* log_level -* [in] Log verbosity level with which to dump the data. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* IBA Base: Types/osm_get_disp_msg_str -* NAME -* osm_get_disp_msg_str -* -* DESCRIPTION -* Returns a string for the specified Dispatcher message. -* -* SYNOPSIS -*/ -const char *osm_get_disp_msg_str(IN cl_disp_msgid_t msg); -/* -* PARAMETERS -* msg -* [in] Dispatcher message ID value. -* -* RETURN VALUES -* Pointer to the message description string. -* -* NOTES -* -* SEE ALSO -*********/ - -void osm_dump_dr_path(IN osm_log_t * p_log, IN const osm_dr_path_t * p_path, - IN osm_log_level_t level); - -void osm_dump_smp_dr_path(IN osm_log_t * p_log, IN const ib_smp_t * p_smp, - IN osm_log_level_t level); - -void osm_dump_dr_smp(IN osm_log_t * p_log, IN const ib_smp_t * p_smp, - IN osm_log_level_t level); - -void osm_dump_sa_mad(IN osm_log_t * p_log, IN const ib_sa_mad_t * p_smp, - IN osm_log_level_t level); - -/****f* IBA Base: Types/osm_get_sm_signal_str -* NAME -* osm_get_sm_signal_str -* -* DESCRIPTION -* Returns a string for the specified SM state. -* -* SYNOPSIS -*/ -const char *osm_get_sm_signal_str(IN osm_signal_t signal); -/* -* PARAMETERS -* state -* [in] Signal value -* -* RETURN VALUES -* Pointer to the signal description string. -* -* NOTES -* -* SEE ALSO -*********/ - -const char *osm_get_port_state_str_fixed_width(IN uint8_t port_state); - -const char *osm_get_node_type_str_fixed_width(IN uint8_t node_type); - -const char *osm_get_manufacturer_str(IN uint64_t guid_ho); - -const char *osm_get_mtu_str(IN uint8_t mtu); - -const char *osm_get_lwa_str(IN uint8_t lwa); - -const char *osm_get_mtu_str(IN uint8_t mtu); - -const char *osm_get_lwa_str(IN uint8_t lwa); - -const char *osm_get_lsa_str(IN uint8_t lsa); - -/****f* IBA Base: Types/osm_get_sm_mgr_signal_str -* NAME -* osm_get_sm_mgr_signal_str -* -* DESCRIPTION -* Returns a string for the specified SM manager signal. -* -* SYNOPSIS -*/ -const char *osm_get_sm_mgr_signal_str(IN osm_sm_signal_t signal); -/* -* PARAMETERS -* signal -* [in] SM manager signal -* -* RETURN VALUES -* Pointer to the signal description string. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* IBA Base: Types/osm_get_sm_mgr_state_str -* NAME -* osm_get_sm_mgr_state_str -* -* DESCRIPTION -* Returns a string for the specified SM manager state. -* -* SYNOPSIS -*/ -const char *osm_get_sm_mgr_state_str(IN uint16_t state); -/* -* PARAMETERS -* state -* [in] SM manager state -* -* RETURN VALUES -* Pointer to the state description string. -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_HELPER_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_inform.h b/branches/opensm_3/user/include/opensm/osm_inform.h deleted file mode 100644 index 293ee5ca..00000000 --- a/branches/opensm_3/user/include/opensm/osm_inform.h +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_inform_rec_t. - * This object represents an IBA Inform Record. - * This object is part of the OpenSM family of objects. - * - * Author: - * Eitan Zahavi, Mellanox - */ - -#ifndef _OSM_INFR_H_ -#define _OSM_INFR_H_ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Inform Record -* NAME -* Inform Record -* -* DESCRIPTION -* The Inform record encapsulates the information needed by the -* SA to manage InformInfo registrations and sending Reports(Notice) -* when SM receives Traps for registered LIDs. -* -* The inform records is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Eitan Zahavi, Mellanox -* -*********/ -/****s* OpenSM: Inform Record/osm_infr_t -* NAME -* osm_infr_t -* -* DESCRIPTION -* Inform Record structure. -* -* The osm_infr_t object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_infr { - cl_list_item_t list_item; - osm_bind_handle_t h_bind; - osm_sa_t *sa; - osm_mad_addr_t report_addr; - ib_inform_info_record_t inform_record; -} osm_infr_t; -/* -* FIELDS -* list_item -* List Item for qlist linkage. Must be first element!! -* -* h_bind -* A handle of lower level mad srvc -* -* sa -* A pointer to osm_sa object -* -* report_addr -* Report address -* -* inform_record -* The Inform Info Record -* -* SEE ALSO -*********/ - -/****f* OpenSM: Inform Record/osm_infr_new -* NAME -* osm_infr_new -* -* DESCRIPTION -* Allocates and initializes a Inform Record for use. -* -* SYNOPSIS -*/ -osm_infr_t *osm_infr_new(IN const osm_infr_t * p_infr_rec); -/* -* PARAMETERS -* p_inf_rec -* [in] Pointer to IB Inform Record -* -* RETURN VALUES -* pointer to osm_infr_t structure. -* -* NOTES -* Allows calling other inform record methods. -* -* SEE ALSO -* Inform Record, osm_infr_delete -*********/ - -/****f* OpenSM: Inform Record/osm_infr_delete -* NAME -* osm_infr_delete -* -* DESCRIPTION -* Destroys and deallocates the osm_infr_t structure. -* -* SYNOPSIS -*/ -void osm_infr_delete(IN osm_infr_t * p_infr); -/* -* PARAMETERS -* p_infr -* [in] Pointer to osm_infr_t structure -* -* SEE ALSO -* Inform Record, osm_infr_new -*********/ - -/****f* OpenSM: Inform Record/osm_infr_get_by_rec -* NAME -* osm_infr_get_by_rec -* -* DESCRIPTION -* Find a matching osm_infr_t in the subnet DB by inform_info_record -* -* SYNOPSIS -*/ -osm_infr_t *osm_infr_get_by_rec(IN osm_subn_t const *p_subn, - IN osm_log_t * p_log, - IN osm_infr_t * p_infr_rec); -/* -* PARAMETERS -* p_subn -* [in] Pointer to the subnet object -* -* p_log -* [in] Pointer to the log object -* -* p_inf_rec -* [in] Pointer to an inform_info record -* -* RETURN -* The matching osm_infr_t -* SEE ALSO -* Inform Record, osm_infr_new, osm_infr_delete -*********/ - -void osm_infr_insert_to_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log, - IN osm_infr_t * p_infr); - -void osm_infr_remove_from_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log, - IN osm_infr_t * p_infr); - -/****f* OpenSM: Inform Record/osm_report_notice -* NAME -* osm_report_notice -* -* DESCRIPTION -* Once a Trap was received by the osm_trap_rcv, or a Trap sourced in -* the SM was sent (Traps 64-67) this routine is called with a copy of -* the notice data. -* Given a notice attribute - compare and see if it matches the InformInfo -* Element and if it does - call the Report(Notice) for the -* target QP registered by the address stored in the InformInfo element -* -* SYNOPSIS -*/ -ib_api_status_t osm_report_notice(IN osm_log_t * p_log, IN osm_subn_t * p_subn, - IN ib_mad_notice_attr_t * p_ntc); -/* -* PARAMETERS -* p_rcv -* [in] Pointer to the trap receiver -* -* p_ntc -* [in] Pointer to a copy of the incoming trap notice attribute. -* -* RETURN -* IB_SUCCESS on good completion -* -* SEE ALSO -* Inform Record, osm_trap_rcv -*********/ - -END_C_DECLS -#endif /* _OSM_INFR_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_lid_mgr.h b/branches/opensm_3/user/include/opensm/osm_lid_mgr.h deleted file mode 100644 index 5d1a608b..00000000 --- a/branches/opensm_3/user/include/opensm/osm_lid_mgr.h +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_lid_mgr_t. - * This object represents the LID Manager object. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_LID_MGR_H_ -#define _OSM_LID_MGR_H_ - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -#define OSM_LID_MGR_LIST_SIZE_MIN 256 -/****h* OpenSM/LID Manager -* NAME -* LID Manager -* -* DESCRIPTION -* The LID Manager object encapsulates the information -* needed to control LID assignments on the subnet. -* -* The LID Manager object is thread safe. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -struct osm_sm; -/****s* OpenSM: LID Manager/osm_lid_mgr_t -* NAME -* osm_lid_mgr_t -* -* DESCRIPTION -* LID Manager structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_lid_mgr { - struct osm_sm *sm; - osm_subn_t *p_subn; - osm_db_t *p_db; - osm_log_t *p_log; - cl_plock_t *p_lock; - osm_db_domain_t *p_g2l; - cl_qlist_t free_ranges; - uint8_t used_lids[IB_LID_UCAST_END_HO + 1]; -} osm_lid_mgr_t; -/* -* FIELDS -* sm -* Pointer to the SM object. -* -* p_subn -* Pointer to the Subnet object for this subnet. -* -* p_db -* Pointer to the database (persistency) object -* -* p_log -* Pointer to the log object. -* -* p_lock -* Pointer to the serializing lock. -* -* p_g2l -* Pointer to the database domain storing guid to lid mapping. -* -* used_lids -* An array of used lids. keeps track of -* existing and non existing mapping of guid->lid -* -* free_ranges -* A list of available free lid ranges. The list is initialized -* by the code that initializes the lid assignment and is consumed -* by the procedure that finds a free range. It holds elements of -* type osm_lid_mgr_range_t -* -* SEE ALSO -* LID Manager object -*********/ - -/****f* OpenSM: LID Manager/osm_lid_mgr_construct -* NAME -* osm_lid_mgr_construct -* -* DESCRIPTION -* This function constructs a LID Manager object. -* -* SYNOPSIS -*/ -void osm_lid_mgr_construct(IN osm_lid_mgr_t * p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to a LID Manager object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows osm_lid_mgr_destroy -* -* Calling osm_lid_mgr_construct is a prerequisite to calling any other -* method except osm_lid_mgr_init. -* -* SEE ALSO -* LID Manager object, osm_lid_mgr_init, -* osm_lid_mgr_destroy -*********/ - -/****f* OpenSM: LID Manager/osm_lid_mgr_destroy -* NAME -* osm_lid_mgr_destroy -* -* DESCRIPTION -* The osm_lid_mgr_destroy function destroys the object, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_lid_mgr_destroy(IN osm_lid_mgr_t * p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to the object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified -* LID Manager object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to -* osm_lid_mgr_construct or osm_lid_mgr_init. -* -* SEE ALSO -* LID Manager object, osm_lid_mgr_construct, -* osm_lid_mgr_init -*********/ - -/****f* OpenSM: LID Manager/osm_lid_mgr_init -* NAME -* osm_lid_mgr_init -* -* DESCRIPTION -* The osm_lid_mgr_init function initializes a -* LID Manager object for use. -* -* SYNOPSIS -*/ -ib_api_status_t -osm_lid_mgr_init(IN osm_lid_mgr_t * p_mgr, IN struct osm_sm * sm); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to an osm_lid_mgr_t object to initialize. -* -* sm -* [in] Pointer to the SM object for this subnet. -* -* RETURN VALUES -* CL_SUCCESS if the LID Manager object was initialized -* successfully. -* -* NOTES -* Allows calling other LID Manager methods. -* -* SEE ALSO -* LID Manager object, osm_lid_mgr_construct, -* osm_lid_mgr_destroy -*********/ - -/****f* OpenSM: LID Manager/osm_lid_mgr_process_sm -* NAME -* osm_lid_mgr_process_sm -* -* DESCRIPTION -* Configures the SM's port with its designated LID values. -* -* SYNOPSIS -*/ -int osm_lid_mgr_process_sm(IN osm_lid_mgr_t * p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to an osm_lid_mgr_t object. -* -* RETURN VALUES -* Returns 0 on success and non-zero value otherwise. -* -* NOTES -* -* SEE ALSO -* LID Manager -*********/ - -/****f* OpenSM: LID Manager/osm_lid_mgr_process_subnet -* NAME -* osm_lid_mgr_process_subnet -* -* DESCRIPTION -* Configures subnet ports (except the SM port itself) with their -* designated LID values. -* -* SYNOPSIS -*/ -int osm_lid_mgr_process_subnet(IN osm_lid_mgr_t * p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to an osm_lid_mgr_t object. -* -* RETURN VALUES -* Returns 0 on success and non-zero value otherwise. -* -* NOTES -* -* SEE ALSO -* LID Manager -*********/ - -END_C_DECLS -#endif /* _OSM_LID_MGR_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_log.h b/branches/opensm_3/user/include/opensm/osm_log.h deleted file mode 100644 index b115e918..00000000 --- a/branches/opensm_3/user/include/opensm/osm_log.h +++ /dev/null @@ -1,474 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_log_t. - * This object represents the log file. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_LOG_H_ -#define _OSM_LOG_H_ - -#ifndef __WIN__ -#include -#endif -#include -#include -#include -#include - -#ifdef __GNUC__ -#define STRICT_OSM_LOG_FORMAT __attribute__((format(printf, 3, 4))) -#else -#define STRICT_OSM_LOG_FORMAT -#endif - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -#define LOG_ENTRY_SIZE_MAX 4096 -#define BUF_SIZE LOG_ENTRY_SIZE_MAX -#define __func__ __FUNCTION__ -#define OSM_LOG_ENTER( OSM_LOG_PTR ) \ - osm_log( OSM_LOG_PTR, OSM_LOG_FUNCS, \ - "%s: [\n", __func__); -#define OSM_LOG_EXIT( OSM_LOG_PTR ) \ - osm_log( OSM_LOG_PTR, OSM_LOG_FUNCS, \ - "%s: ]\n", __func__); -/****h* OpenSM/Log -* NAME -* Log -* -* DESCRIPTION -* -* AUTHOR -* -*********/ -typedef uint8_t osm_log_level_t; - -#define OSM_LOG_NONE 0x00 -#define OSM_LOG_ERROR 0x01 -#define OSM_LOG_INFO 0x02 -#define OSM_LOG_VERBOSE 0x04 -#define OSM_LOG_DEBUG 0x08 -#define OSM_LOG_FUNCS 0x10 -#define OSM_LOG_FRAMES 0x20 -#define OSM_LOG_ROUTING 0x40 -#define OSM_LOG_ALL 0x7f -#define OSM_LOG_SYS 0x80 - -/* - DEFAULT - turn on ERROR and INFO only -*/ -#define OSM_LOG_DEFAULT_LEVEL OSM_LOG_ERROR | OSM_LOG_INFO - -/****s* OpenSM: MAD Wrapper/osm_log_t -* NAME -* osm_log_t -* -* DESCRIPTION -* -* SYNOPSIS -*/ -typedef struct osm_log { - osm_log_level_t level; - cl_spinlock_t lock; - unsigned long count; - unsigned long max_size; - boolean_t flush; - FILE *out_port; - boolean_t accum_log_file; - boolean_t daemon; - char *log_file_name; - char *log_prefix; -} osm_log_t; -/*********/ - -/****f* OpenSM: Log/osm_log_construct -* NAME -* osm_log_construct -* -* DESCRIPTION -* This function constructs a Log object. -* -* SYNOPSIS -*/ -static inline void osm_log_construct(IN osm_log_t * p_log) -{ - cl_spinlock_construct(&p_log->lock); -} - -/* -* PARAMETERS -* p_log -* [in] Pointer to a Log object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_log_init, osm_log_init_v2, osm_log_destroy -* -* Calling osm_log_construct is a prerequisite to calling any other -* method except osm_log_init or osm_log_init_v2. -* -* SEE ALSO -* Log object, osm_log_init, osm_log_init_v2, -* osm_log_destroy -*********/ - -/****f* OpenSM: Log/osm_log_destroy -* NAME -* osm_log_destroy -* -* DESCRIPTION -* The osm_log_destroy function destroys the object, releasing -* all resources. -* -* SYNOPSIS -*/ -static inline void osm_log_destroy(IN osm_log_t * p_log) -{ - cl_spinlock_destroy(&p_log->lock); - if (p_log->out_port != stdout) { - fclose(p_log->out_port); - p_log->out_port = stdout; - } - closelog(); -} - -/* -* PARAMETERS -* p_log -* [in] Pointer to the object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified -* Log object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to -* osm_log_construct, osm_log_init, or osm_log_init_v2. -* -* SEE ALSO -* Log object, osm_log_construct, -* osm_log_init, osm_log_init_v2 -*********/ - -/****f* OpenSM: Log/osm_log_init_v2 -* NAME -* osm_log_init_v2 -* -* DESCRIPTION -* The osm_log_init_v2 function initializes a -* Log object for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_log_init_v2(IN osm_log_t * p_log, IN boolean_t flush, - IN uint8_t log_flags, IN const char *log_file, - IN unsigned long max_size, - IN boolean_t accum_log_file); -/* -* PARAMETERS -* p_log -* [in] Pointer to the log object. -* -* flush -* [in] Set to TRUE directs the log to flush all log messages -* immediately. This severely degrades log performance, -* and is normally used for debugging only. -* -* log_flags -* [in] The log verbosity level to be used. -* -* log_file -* [in] if not NULL defines the name of the log file. Otherwise -* it is stdout. -* -* RETURN VALUES -* CL_SUCCESS if the Log object was initialized -* successfully. -* -* NOTES -* Allows calling other Log methods. -* -* SEE ALSO -* Log object, osm_log_construct, -* osm_log_destroy -*********/ - -/****f* OpenSM: Log/osm_log_reopen_file -* NAME -* osm_log_reopen_file -* -* DESCRIPTION -* The osm_log_reopen_file function reopens the log file -* -* SYNOPSIS -*/ -int osm_log_reopen_file(osm_log_t * p_log); -/* -* PARAMETERS -* p_log -* [in] Pointer to the log object. -* -* RETURN VALUES -* 0 on success or nonzero value otherwise. -*********/ - -/****f* OpenSM: Log/osm_log_init -* NAME -* osm_log_init -* -* DESCRIPTION -* The osm_log_init function initializes a -* Log object for use. It is a wrapper for osm_log_init_v2(). -* -* SYNOPSIS -*/ -ib_api_status_t osm_log_init(IN osm_log_t * p_log, IN boolean_t flush, - IN uint8_t log_flags, IN const char *log_file, - IN boolean_t accum_log_file); -/* - * Same as osm_log_init_v2() but without max_size parameter - */ - -void osm_log(IN osm_log_t * p_log, IN osm_log_level_t verbosity, - IN const char *p_str, ...) STRICT_OSM_LOG_FORMAT; - -/****f* OpenSM: Log/osm_log_get_level -* NAME -* osm_log_get_level -* -* DESCRIPTION -* Returns the current log level. -* -* SYNOPSIS -*/ -static inline osm_log_level_t osm_log_get_level(IN const osm_log_t * p_log) -{ - return p_log->level; -} - -/* -* PARAMETERS -* p_log -* [in] Pointer to the log object. -* -* RETURN VALUES -* Returns the current log level. -* -* NOTES -* -* SEE ALSO -* Log object, osm_log_construct, -* osm_log_destroy -*********/ - -/****f* OpenSM: Log/osm_log_set_level -* NAME -* osm_log_set_level -* -* DESCRIPTION -* Sets the current log level. -* -* SYNOPSIS -*/ -static inline void osm_log_set_level(IN osm_log_t * p_log, - IN osm_log_level_t level) -{ - p_log->level = level; - osm_log(p_log, OSM_LOG_ALL, "Setting log level to: 0x%02x\n", level); -} - -/* -* PARAMETERS -* p_log -* [in] Pointer to the log object. -* -* level -* [in] New level to set. -* -* RETURN VALUES -* Returns the current log level. -* -* NOTES -* -* SEE ALSO -* Log object, osm_log_construct, -* osm_log_destroy -*********/ - -/****f* OpenSM: Log/osm_log_is_active -* NAME -* osm_log_is_active -* -* DESCRIPTION -* Returns TRUE if the specified log level would be logged. -* FALSE otherwise. -* -* SYNOPSIS -*/ -static inline boolean_t osm_log_is_active(IN const osm_log_t * p_log, - IN osm_log_level_t level) -{ - return ((p_log->level & level) != 0); -} - -/* -* PARAMETERS -* p_log -* [in] Pointer to the log object. -* -* level -* [in] Level to check. -* -* RETURN VALUES -* Returns TRUE if the specified log level would be logged. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* Log object, osm_log_construct, -* osm_log_destroy -*********/ - -extern void osm_log_msg_box(osm_log_t *log, osm_log_level_t level, - const char *func_name, const char *msg); -extern void osm_log_raw(IN osm_log_t * p_log, IN osm_log_level_t verbosity, - IN const char *p_buf); - -#define OSM_LOG(log, level, fmt, ...) do { \ - if (osm_log_is_active(log, (level))) \ - osm_log(log, level, "%s: " fmt, __func__, ## __VA_ARGS__); \ - } while (0) - -#define OSM_LOG_MSG_BOX(log, level, msg) \ - osm_log_msg_box(log, level, __func__, msg) - -#define DBG_CL_LOCK 0 - -#define CL_PLOCK_EXCL_ACQUIRE( __exp__ ) \ -{ \ - if (DBG_CL_LOCK) \ - printf("cl_plock_excl_acquire: Acquiring %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ - cl_plock_excl_acquire( __exp__ ); \ - if (DBG_CL_LOCK) \ - printf("cl_plock_excl_acquire: Acquired %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ -} - -#define CL_PLOCK_ACQUIRE( __exp__ ) \ -{ \ - if (DBG_CL_LOCK) \ - printf("cl_plock_acquire: Acquiring %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ - cl_plock_acquire( __exp__ ); \ - if (DBG_CL_LOCK) \ - printf("cl_plock_acquire: Acquired %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ -} - -#define CL_PLOCK_RELEASE( __exp__ ) \ -{ \ - if (DBG_CL_LOCK) \ - printf("cl_plock_release: Releasing %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ - cl_plock_release( __exp__ ); \ - if (DBG_CL_LOCK) \ - printf("cl_plock_release: Released %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ -} - -#define DBG_CL_SPINLOCK 0 -#define CL_SPINLOCK_RELEASE( __exp__ ) \ -{ \ - if (DBG_CL_SPINLOCK) \ - printf("cl_spinlock_release: Releasing %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ - cl_spinlock_release( __exp__ ); \ - if (DBG_CL_SPINLOCK) \ - printf("cl_spinlock_release: Released %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ -} - -#define CL_SPINLOCK_ACQUIRE( __exp__ ) \ -{ \ - if (DBG_CL_SPINLOCK) \ - printf("cl_spinlock_acquire: Acquiring %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ - cl_spinlock_acquire( __exp__ ); \ - if (DBG_CL_SPINLOCK) \ - printf("cl_spinlock_acquire: Acquired %p file %s, line %d\n", \ - __exp__,__FILE__, __LINE__); \ -} - -/****f* OpenSM: Helper/osm_is_debug -* NAME -* osm_is_debug -* -* DESCRIPTION -* The osm_is_debug function returns TRUE if the opensm was compiled -* in debug mode, and FALSE otherwise. -* -* SYNOPSIS -*/ -boolean_t osm_is_debug(void); -/* -* PARAMETERS -* None -* -* RETURN VALUE -* TRUE if compiled in debug version. FALSE otherwise. -* -* NOTES -* -*********/ - -END_C_DECLS -#endif /* _OSM_LOG_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_mad_pool.h b/branches/opensm_3/user/include/opensm/osm_mad_pool.h deleted file mode 100644 index c7665a6d..00000000 --- a/branches/opensm_3/user/include/opensm/osm_mad_pool.h +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_mad_pool_t. - * This object represents a pool of management datagram (MAD) objects. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_MAD_POOL_H_ -#define _OSM_MAD_POOL_H_ - -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/MAD Pool -* NAME -* MAD Pool -* -* DESCRIPTION -* The MAD Pool encapsulates the information needed by the -* OpenSM to manage a pool of MAD objects. The OpenSM allocates -* one MAD Pool per IBA subnet. -* -* The MAD Pool is thread safe. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: MAD Pool/osm_mad_pool_t -* NAME -* osm_mad_pool_t -* -* DESCRIPTION -* MAD Pool structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_mad_pool { - atomic32_t mads_out; -} osm_mad_pool_t; -/* -* FIELDS -* mads_out -* Running total of the number of MADs outstanding. -* -* SEE ALSO -* MAD Pool -*********/ - -/****f* OpenSM: MAD Pool/osm_mad_pool_construct -* NAME -* osm_mad_pool_construct -* -* DESCRIPTION -* This function constructs a MAD Pool. -* -* SYNOPSIS -*/ -void osm_mad_pool_construct(IN osm_mad_pool_t * p_pool); -/* -* PARAMETERS -* p_pool -* [in] Pointer to a MAD Pool to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_mad_pool_init, osm_mad_pool_destroy -* -* Calling osm_mad_pool_construct is a prerequisite to calling any other -* method except osm_mad_pool_init. -* -* SEE ALSO -* MAD Pool, osm_mad_pool_init, osm_mad_pool_destroy -*********/ - -/****f* OpenSM: MAD Pool/osm_mad_pool_destroy -* NAME -* osm_mad_pool_destroy -* -* DESCRIPTION -* The osm_mad_pool_destroy function destroys a node, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_mad_pool_destroy(IN osm_mad_pool_t * p_pool); -/* -* PARAMETERS -* p_pool -* [in] Pointer to a MAD Pool to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified MAD Pool. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to osm_mad_pool_construct or -* osm_mad_pool_init. -* -* SEE ALSO -* MAD Pool, osm_mad_pool_construct, osm_mad_pool_init -*********/ - -/****f* OpenSM: MAD Pool/osm_mad_pool_init -* NAME -* osm_mad_pool_init -* -* DESCRIPTION -* The osm_mad_pool_init function initializes a MAD Pool for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_mad_pool_init(IN osm_mad_pool_t * p_pool); -/* -* PARAMETERS -* p_pool -* [in] Pointer to an osm_mad_pool_t object to initialize. -* -* RETURN VALUES -* CL_SUCCESS if the MAD Pool was initialized successfully. -* -* NOTES -* Allows calling other MAD Pool methods. -* -* SEE ALSO -* MAD Pool, osm_mad_pool_construct, osm_mad_pool_destroy -*********/ - -/****f* OpenSM: MAD Pool/osm_mad_pool_get -* NAME -* osm_mad_pool_get -* -* DESCRIPTION -* Gets a MAD wrapper and wire MAD from the pool. -* -* SYNOPSIS -*/ -osm_madw_t *osm_mad_pool_get(IN osm_mad_pool_t * p_pool, - IN osm_bind_handle_t h_bind, - IN uint32_t total_size, - IN const osm_mad_addr_t * p_mad_addr); -/* -* PARAMETERS -* p_pool -* [in] Pointer to an osm_mad_pool_t object. -* -* h_bind -* [in] Handle returned from osm_vendor_bind() call to the -* port over which this mad will be sent. -* -* total_size -* [in] Total size, including MAD header of the requested MAD. -* -* p_mad_addr -* [in] Pointer to the MAD address structure. This parameter -* may be NULL for directed route MADs. -* -* RETURN VALUES -* Returns a pointer to a MAD wrapper containing the MAD. -* A return value of NULL means no MADs are available. -* -* NOTES -* The MAD must eventually be returned to the pool with a call to -* osm_mad_pool_put. -* -* The osm_mad_pool_construct or osm_mad_pool_init must be called before -* using this function. -* -* SEE ALSO -* MAD Pool, osm_mad_pool_put -*********/ - -/****f* OpenSM: MAD Pool/osm_mad_pool_put -* NAME -* osm_mad_pool_put -* -* DESCRIPTION -* Returns a MAD to the pool. -* -* SYNOPSIS -*/ -void osm_mad_pool_put(IN osm_mad_pool_t * p_pool, IN osm_madw_t * p_madw); -/* -* PARAMETERS -* p_pool -* [in] Pointer to an osm_mad_pool_t object. -* -* p_madw -* [in] Pointer to a MAD Wrapper for a MAD that was previously -* retrieved from the pool. -* -* RETURN VALUES -* This function does not return a value. -* -* NOTES -* The osm_mad_pool_construct or osm_mad_pool_init must be called before -* using this function. -* -* SEE ALSO -* MAD Pool, osm_mad_pool_get -*********/ - -/****f* OpenSM: MAD Pool/osm_mad_pool_get_wrapper -* NAME -* osm_mad_pool_get_wrapper -* -* DESCRIPTION -* Gets a only MAD wrapper from the pool (no wire MAD). -* -* SYNOPSIS -*/ -osm_madw_t *osm_mad_pool_get_wrapper(IN osm_mad_pool_t * p_pool, - IN osm_bind_handle_t h_bind, - IN uint32_t total_size, - IN const ib_mad_t * p_mad, - IN const osm_mad_addr_t * p_mad_addr); -/* -* PARAMETERS -* p_pool -* [in] Pointer to an osm_mad_pool_t object. -* -* h_bind -* [in] Handle returned from osm_vendor_bind() call to the -* port for which this mad wrapper will be used. -* -* total_size -* [in] Total size, including MAD header of the MAD that will -* be attached to this wrapper. -* -* p_mad -* [in] Pointer to the MAD to attach to this wrapper. -* -* p_mad_addr -* [in] Pointer to the MAD address structure. This parameter -* may be NULL for directed route MADs. -* -* RETURN VALUES -* Returns a pointer to a MAD wrapper. -* A return value of NULL means no MAD wrappers are available. -* -* NOTES -* The MAD must eventually be returned to the pool with a call to -* osm_mad_pool_put. -* -* The osm_mad_pool_construct or osm_mad_pool_init must be called before -* using this function. -* -* SEE ALSO -* MAD Pool, osm_mad_pool_put -*********/ - -/****f* OpenSM: MAD Pool/osm_mad_pool_get_wrapper_raw -* NAME -* osm_mad_pool_get_wrapper_raw -* -* DESCRIPTION -* Gets a only an uninitialized MAD wrapper from the pool (no wire MAD). -* -* SYNOPSIS -*/ -osm_madw_t *osm_mad_pool_get_wrapper_raw(IN osm_mad_pool_t * p_pool); -/* -* PARAMETERS -* p_pool -* [in] Pointer to an osm_mad_pool_t object. -* -* RETURN VALUES -* Returns a pointer to a MAD wrapper. -* A return value of NULL means no MAD wrappers are available. -* -* NOTES -* The MAD must eventually be returned to the pool with a call to -* osm_mad_pool_put. -* -* The osm_mad_pool_construct or osm_mad_pool_init must be called before -* using this function. -* -* SEE ALSO -* MAD Pool, osm_mad_pool_put -*********/ - -/****f* OpenSM: MAD Pool/osm_mad_pool_get_outstanding -* NAME -* osm_mad_pool_get_count -* -* DESCRIPTION -* Returns the running count of MADs currently outstanding from the pool. -* -* SYNOPSIS -*/ -static inline uint32_t -osm_mad_pool_get_outstanding(IN const osm_mad_pool_t * p_pool) -{ - return p_pool->mads_out; -} - -/* -* PARAMETERS -* p_pool -* [in] Pointer to an osm_mad_pool_t object. -* -* RETURN VALUES -* Returns the running count of MADs currently outstanding from the pool. -* -* NOTES -* The osm_mad_pool_construct or osm_mad_pool_init must be called before -* using this function. -* -* SEE ALSO -* MAD Pool, osm_mad_pool_get -*********/ - -END_C_DECLS -#endif /* _OSM_MAD_POOL_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_madw.h b/branches/opensm_3/user/include/opensm/osm_madw.h deleted file mode 100644 index 81d30e17..00000000 --- a/branches/opensm_3/user/include/opensm/osm_madw.h +++ /dev/null @@ -1,1120 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_mad_wrapper_t. - * This object represents the context wrapper for OpenSM MAD processing. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_MADW_H_ -#define _OSM_MADW_H_ - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****s* OpenSM: MAD Wrapper/osm_bind_info_t -* NAME -* osm_bind_info_t -* -* DESCRIPTION -* -* SYNOPSIS -*/ -typedef struct osm_bind_info { - ib_net64_t port_guid; - uint8_t mad_class; - uint8_t class_version; - boolean_t is_responder; - boolean_t is_trap_processor; - boolean_t is_report_processor; - uint32_t send_q_size; - uint32_t recv_q_size; - uint32_t timeout; - uint32_t retries; -} osm_bind_info_t; -/* -* FIELDS -* portguid -* PortGuid of local port -* -* mad_class -* Mgmt Class ID -* -* class_version -* Mgmt Class version -* -* is_responder -* True if this is a GSI Agent -* -* is_trap_processor -* True if GSI Trap msgs are handled -* -* is_report_processor -* True if GSI Report msgs are handled -* -* send_q_size -* SendQueueSize -* -* recv_q_size -* Receive Queue Size -* -* timeout -* Transaction timeout -* -* retries -* Number of retries for transaction -* -* SEE ALSO -*********/ - -/****h* OpenSM/MAD Wrapper -* NAME -* MAD Wrapper -* -* DESCRIPTION -* The MAD Wrapper object encapsulates the information needed by the -* OpenSM to manage individual MADs. The OpenSM allocates one MAD Wrapper -* per MAD. -* -* The MAD Wrapper is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ - -/****s* OpenSM: MAD Wrapper/osm_ni_context_t -* NAME -* osm_ni_context_t -* -* DESCRIPTION -* Context needed by recipient of NodeInfo attribute. -* -* SYNOPSIS -*/ -typedef struct osm_ni_context { - ib_net64_t node_guid; - uint8_t port_num; - ib_net64_t dup_node_guid; - uint8_t dup_port_num; - unsigned dup_count; -} osm_ni_context_t; -/* -* FIELDS -* p_node -* Pointer to the node thru which we got to this node. -* -* p_sw -* Pointer to the switch object (if any) of the switch -* thru which we got to this node. -* -* port_num -* Port number on the node or switch thru which we got -* to this node. -* -* SEE ALSO -*********/ - -/****s* OpenSM: MAD Wrapper/osm_pi_context_t -* NAME -* osm_pi_context_t -* -* DESCRIPTION -* Context needed by recipient of PortInfo attribute. -* -* SYNOPSIS -*/ -typedef struct osm_pi_context { - ib_net64_t node_guid; - ib_net64_t port_guid; - boolean_t set_method; - boolean_t light_sweep; - boolean_t active_transition; -} osm_pi_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_nd_context_t -* NAME -* osm_nd_context_t -* -* DESCRIPTION -* Context needed by recipient of NodeDescription attribute. -* -* SYNOPSIS -*/ -typedef struct osm_nd_context { - ib_net64_t node_guid; -} osm_nd_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_si_context_t -* NAME -* osm_si_context_t -* -* DESCRIPTION -* Context needed by recipient of SwitchInfo attribute. -* -* SYNOPSIS -*/ -typedef struct osm_si_context { - ib_net64_t node_guid; - boolean_t set_method; - boolean_t light_sweep; -} osm_si_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_lft_context_t -* NAME -* osm_lft_context_t -* -* DESCRIPTION -* Context needed by recipient of LinearForwardingTable attribute. -* -* SYNOPSIS -*/ -typedef struct osm_lft_context { - ib_net64_t node_guid; - boolean_t set_method; -} osm_lft_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_mft_context_t -* NAME -* osm_mft_context_t -* -* DESCRIPTION -* Context needed by recipient of MulticastForwardingTable attribute. -* -* SYNOPSIS -*/ -typedef struct osm_mft_context { - ib_net64_t node_guid; - boolean_t set_method; -} osm_mft_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_smi_context_t -* NAME -* osm_smi_context_t -* -* DESCRIPTION -* Context needed by recipient of SMInfo attribute. -* -* SYNOPSIS -*/ -typedef struct osm_smi_context { - ib_net64_t port_guid; - boolean_t set_method; - boolean_t light_sweep; -} osm_smi_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_pkey_context_t -* NAME -* osm_pkey_context_t -* -* DESCRIPTION -* Context needed by recipient of P_Key attribute. -* -* SYNOPSIS -*/ -typedef struct osm_pkey_context { - ib_net64_t node_guid; - ib_net64_t port_guid; - boolean_t set_method; -} osm_pkey_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_slvl_context_t -* NAME -* osm_slvl_context_t -* -* DESCRIPTION -* Context needed by recipient of PortInfo attribute. -* -* SYNOPSIS -*/ -typedef struct osm_slvl_context { - ib_net64_t node_guid; - ib_net64_t port_guid; - boolean_t set_method; -} osm_slvl_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_vla_context_t -* NAME -* osm_vla_context_t -* -* DESCRIPTION -* Context needed by recipient of VL Arb attribute. -* -* SYNOPSIS -*/ -typedef struct osm_vla_context { - ib_net64_t node_guid; - ib_net64_t port_guid; - boolean_t set_method; -} osm_vla_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_perfmgr_context_t -* DESCRIPTION -* Context for Performance manager queries -*/ -typedef struct osm_perfmgr_context { - uint64_t node_guid; - uint16_t port; - uint8_t mad_method; /* was this a get or a set */ -#if ENABLE_OSM_PERF_MGR_PROFILE - struct timeval query_start; -#endif -} osm_perfmgr_context_t; -/*********/ - -#ifndef OSM_VENDOR_INTF_OPENIB -/****s* OpenSM: MAD Wrapper/osm_arbitrary_context_t -* NAME -* osm_arbitrary_context_t -* -* DESCRIPTION -* Context needed by arbitrary recipient. -* -* SYNOPSIS -*/ -typedef struct osm_arbitrary_context { - void *context1; - void *context2; -} osm_arbitrary_context_t; -/*********/ -#endif - -/****s* OpenSM: MAD Wrapper/osm_madw_context_t -* NAME -* osm_madw_context_t -* -* DESCRIPTION -* Context needed by recipients of MAD responses. -* -* SYNOPSIS -*/ -typedef union _osm_madw_context { - osm_ni_context_t ni_context; - osm_pi_context_t pi_context; - osm_nd_context_t nd_context; - osm_si_context_t si_context; - osm_lft_context_t lft_context; - osm_mft_context_t mft_context; - osm_smi_context_t smi_context; - osm_slvl_context_t slvl_context; - osm_pkey_context_t pkey_context; - osm_vla_context_t vla_context; - osm_perfmgr_context_t perfmgr_context; -#ifndef OSM_VENDOR_INTF_OPENIB - osm_arbitrary_context_t arb_context; -#endif -} osm_madw_context_t; -/*********/ - -/****s* OpenSM: MAD Wrapper/osm_mad_addr_t -* NAME -* osm_mad_addr_t -* -* DESCRIPTION -* -* SYNOPSIS -*/ -typedef struct osm_mad_addr { - ib_net16_t dest_lid; - uint8_t path_bits; - uint8_t static_rate; - union addr_type { - struct _smi { - ib_net16_t source_lid; - uint8_t port_num; - } smi; - - struct _gsi { - ib_net32_t remote_qp; - ib_net32_t remote_qkey; - uint16_t pkey_ix; - uint8_t service_level; - boolean_t global_route; - ib_grh_t grh_info; - } gsi; - } addr_type; -} osm_mad_addr_t; -/* -* FIELDS -* -* SEE ALSO -*********/ - -/****s* OpenSM: MAD Wrapper/osm_madw_t -* NAME -* osm_madw_t -* -* DESCRIPTION -* Context needed for processing individual MADs -* -* SYNOPSIS -*/ -typedef struct osm_madw { - cl_list_item_t list_item; - osm_bind_handle_t h_bind; - osm_vend_wrap_t vend_wrap; - osm_mad_addr_t mad_addr; - osm_bind_info_t bind_info; - osm_madw_context_t context; - uint32_t mad_size; - ib_api_status_t status; - cl_disp_msgid_t fail_msg; - boolean_t resp_expected; - const ib_mad_t *p_mad; -} osm_madw_t; -/* -* FIELDS -* list_item -* List linkage for lists. MUST BE FIRST MEMBER! -* -* h_bind -* Bind handle for the port on which this MAD will be sent -* or was received. -* -* vend_wrap -* Transport vendor specific context. This structure is not -* used outside MAD transport vendor specific code. -* -* context -* Union of controller specific contexts needed for this MAD. -* This structure allows controllers to indirectly communicate -* with each other through the dispatcher. -* -* mad_size -* Size of this MAD in bytes. -* -* status -* Status of completed operation on the MAD. -* CL_SUCCESS if the operation was successful. -* -* fail_msg -* Dispatcher message with which to post this MAD on failure. -* This value is set by the originator of the MAD. -* If an operation on this MAD fails, for example due to a timeout, -* then the transport layer will dispose of the MAD by sending -* it through the Dispatcher with this message type. Presumably, -* there is a controller listening for the failure message that can -* properly clean up. -* -* resp_expected -* TRUE if a response is expected to this MAD. -* FALSE otherwise. -* -* p_mad -* Pointer to the wire MAD. The MAD itself cannot be part of the -* wrapper, since wire MADs typically reside in special memory -* registered with the local HCA. -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_init -* NAME -* osm_madw_init -* -* DESCRIPTION -* Initializes a MAD Wrapper object for use. -* -* SYNOPSIS -*/ -static inline void osm_madw_init(IN osm_madw_t * p_madw, - IN osm_bind_handle_t h_bind, - IN uint32_t mad_size, - IN const osm_mad_addr_t * p_mad_addr) -{ - memset(p_madw, 0, sizeof(*p_madw)); - p_madw->h_bind = h_bind; - p_madw->fail_msg = CL_DISP_MSGID_NONE; - p_madw->mad_size = mad_size; - if (p_mad_addr) - p_madw->mad_addr = *p_mad_addr; - p_madw->resp_expected = FALSE; -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object to initialize. -* -* h_bind -* [in] Pointer to the wire MAD. -* -* p_mad_addr -* [in] Pointer to the MAD address structure. This parameter may -* be NULL for directed route MADs. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_smp_ptr -* NAME -* osm_madw_get_smp_ptr -* -* DESCRIPTION -* Gets a pointer to the SMP in this MAD. -* -* SYNOPSIS -*/ -static inline ib_smp_t *osm_madw_get_smp_ptr(IN const osm_madw_t * p_madw) -{ - return ((ib_smp_t *) p_madw->p_mad); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object to initialize. -* -* RETURN VALUES -* Pointer to the start of the SMP MAD. -* -* NOTES -* -* SEE ALSO -* MAD Wrapper object -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_sa_mad_ptr -* NAME -* osm_madw_get_sa_mad_ptr -* -* DESCRIPTION -* Gets a pointer to the SA MAD in this MAD wrapper. -* -* SYNOPSIS -*/ -static inline ib_sa_mad_t *osm_madw_get_sa_mad_ptr(IN const osm_madw_t * p_madw) -{ - return ((ib_sa_mad_t *) p_madw->p_mad); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the SA MAD. -* -* NOTES -* -* SEE ALSO -* MAD Wrapper object -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_perfmgt_mad_ptr -* DESCRIPTION -* Gets a pointer to the PerfMgt MAD in this MAD wrapper. -* -* SYNOPSIS -*/ -static inline ib_perfmgt_mad_t *osm_madw_get_perfmgt_mad_ptr(IN const osm_madw_t - * p_madw) -{ - return ((ib_perfmgt_mad_t *) p_madw->p_mad); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the PerfMgt MAD. -* -* NOTES -* -* SEE ALSO -* MAD Wrapper object -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_ni_context_ptr -* NAME -* osm_madw_get_ni_context_ptr -* -* DESCRIPTION -* Gets a pointer to the NodeInfo context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_ni_context_t *osm_madw_get_ni_context_ptr(IN const osm_madw_t - * p_madw) -{ - return ((osm_ni_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_pi_context_ptr -* NAME -* osm_madw_get_pi_context_ptr -* -* DESCRIPTION -* Gets a pointer to the PortInfo context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_pi_context_t *osm_madw_get_pi_context_ptr(IN const osm_madw_t - * p_madw) -{ - return ((osm_pi_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_nd_context_ptr -* NAME -* osm_madw_get_nd_context_ptr -* -* DESCRIPTION -* Gets a pointer to the NodeDescription context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_nd_context_t *osm_madw_get_nd_context_ptr(IN const osm_madw_t - * p_madw) -{ - return ((osm_nd_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_lft_context_ptr -* NAME -* osm_madw_get_lft_context_ptr -* -* DESCRIPTION -* Gets a pointer to the LFT context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_lft_context_t *osm_madw_get_lft_context_ptr(IN const - osm_madw_t * - p_madw) -{ - return ((osm_lft_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_mft_context_ptr -* NAME -* osm_madw_get_mft_context_ptr -* -* DESCRIPTION -* Gets a pointer to the MFT context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_mft_context_t *osm_madw_get_mft_context_ptr(IN const - osm_madw_t * - p_madw) -{ - return ((osm_mft_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_si_context_ptr -* NAME -* osm_madw_get_si_context_ptr -* -* DESCRIPTION -* Gets a pointer to the SwitchInfo context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_si_context_t *osm_madw_get_si_context_ptr(IN const osm_madw_t - * p_madw) -{ - return ((osm_si_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_smi_context_ptr -* NAME -* osm_madw_get_smi_context_ptr -* -* DESCRIPTION -* Gets a pointer to the SMInfo context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_smi_context_t *osm_madw_get_smi_context_ptr(IN const - osm_madw_t * - p_madw) -{ - return ((osm_smi_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_pkey_context_ptr -* NAME -* osm_madw_get_pkey_context_ptr -* -* DESCRIPTION -* Gets a pointer to the P_Key context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_pkey_context_t *osm_madw_get_pkey_context_ptr(IN const - osm_madw_t * - p_madw) -{ - return ((osm_pkey_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_slvl_context_ptr -* NAME -* osm_madw_get_slvl_context_ptr -* -* DESCRIPTION -* Gets a pointer to the PortInfo context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_slvl_context_t *osm_madw_get_slvl_context_ptr(IN const - osm_madw_t * - p_madw) -{ - return ((osm_slvl_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_vla_context_ptr -* NAME -* osm_madw_get_vla_context_ptr -* -* DESCRIPTION -* Gets a pointer to the Vl Arb context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_vla_context_t *osm_madw_get_vla_context_ptr(IN const - osm_madw_t * - p_madw) -{ - return ((osm_vla_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ - -#ifndef OSM_VENDOR_INTF_OPENIB -/****f* OpenSM: MAD Wrapper/osm_madw_get_arbitrary_context_ptr -* NAME -* osm_madw_get_arbitrary_context_ptr -* -* DESCRIPTION -* Gets a pointer to the arbitrary context in this MAD. -* -* SYNOPSIS -*/ -static inline osm_arbitrary_context_t *osm_madw_get_arbitrary_context_ptr(IN - const - osm_madw_t - * - const - p_madw) -{ - return ((osm_arbitrary_context_t *) & p_madw->context); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Pointer to the start of the context structure. -* -* NOTES -* -* SEE ALSO -*********/ -#endif - -/****f* OpenSM: MAD Wrapper/osm_madw_get_vend_ptr -* NAME -* osm_madw_get_vend_ptr -* -* DESCRIPTION -* Gets a pointer to the vendor specific MAD wrapper component. -* -* SYNOPSIS -*/ -static inline osm_vend_wrap_t *osm_madw_get_vend_ptr(IN const osm_madw_t * - p_madw) -{ - return ((osm_vend_wrap_t *) & p_madw->vend_wrap); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Gets a pointer to the vendor specific MAD wrapper component. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_vend_ptr -* NAME -* osm_madw_get_vend_ptr -* -* DESCRIPTION -* Returns the bind handle associated with this MAD. -* -* SYNOPSIS -*/ -static inline osm_bind_handle_t -osm_madw_get_bind_handle(IN const osm_madw_t * p_madw) -{ - return ((osm_bind_handle_t) p_madw->h_bind); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Returns the bind handle associated with this MAD. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_mad_addr_ptr -* NAME -* osm_madw_get_mad_addr_ptr -* -* DESCRIPTION -* Returns the mad address structure associated with this MAD. -* -* SYNOPSIS -*/ -static inline osm_mad_addr_t *osm_madw_get_mad_addr_ptr(IN const osm_madw_t * - p_madw) -{ - return ((osm_mad_addr_t *) & p_madw->mad_addr); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Returns the mad address structure associated with this MAD. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_mad_ptr -* NAME -* osm_madw_get_mad_ptr -* -* DESCRIPTION -* Returns the mad address structure associated with this MAD. -* -* SYNOPSIS -*/ -static inline ib_mad_t *osm_madw_get_mad_ptr(IN const osm_madw_t * p_madw) -{ - return ((ib_mad_t *) p_madw->p_mad); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Returns the mad address structure associated with this MAD. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_get_err_msg -* NAME -* osm_madw_get_err_msg -* -* DESCRIPTION -* Returns the message with which to post this mad wrapper if -* an error occurs during processing the mad. -* -* SYNOPSIS -*/ -static inline cl_disp_msgid_t osm_madw_get_err_msg(IN const osm_madw_t * p_madw) -{ - return ((cl_disp_msgid_t) p_madw->fail_msg); -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* RETURN VALUES -* Returns the message with which to post this mad wrapper if -* an error occurs during processing the mad. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_set_mad -* NAME -* osm_madw_set_mad -* -* DESCRIPTION -* Associates a wire MAD with this MAD Wrapper object. -* -* SYNOPSIS -*/ -static inline void osm_madw_set_mad(IN osm_madw_t * p_madw, - IN const ib_mad_t * p_mad) -{ - p_madw->p_mad = p_mad; -} - -/* -* PARAMETERS -* p_madw -* [in] Pointer to an osm_madw_t object. -* -* p_mad -* [in] Pointer to the wire MAD to attach to this wrapper. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: MAD Wrapper/osm_madw_copy_context -* NAME -* osm_madw_copy_context -* -* DESCRIPTION -* Copies the controller context from one MAD Wrapper to another. -* -* SYNOPSIS -*/ -static inline void osm_madw_copy_context(IN osm_madw_t * p_dest, - IN const osm_madw_t * p_src) -{ - p_dest->context = p_src->context; -} - -/* -* PARAMETERS -* p_dest -* [in] Pointer to the destination osm_madw_t object. -* -* p_src -* [in] Pointer to the source osm_madw_t object. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_MADW_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_mcast_tbl.h b/branches/opensm_3/user/include/opensm/osm_mcast_tbl.h deleted file mode 100644 index 9f65f139..00000000 --- a/branches/opensm_3/user/include/opensm/osm_mcast_tbl.h +++ /dev/null @@ -1,486 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_mcast_tbl_t. - * This object represents a multicast forwarding table. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_MCAST_TBL_H_ -#define _OSM_MCAST_TBL_H_ - -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****s* OpenSM: Forwarding Table/osm_mcast_tbl_t -* NAME -* osm_mcast_tbl_t -* -* DESCRIPTION -* Multicast Forwarding Table structure. -* -* Callers may directly access this object. -* -* SYNOPSIS -*/ -typedef struct osm_mcast_fwdbl { - uint8_t num_ports; - uint8_t max_position; - uint16_t max_block; - int16_t max_block_in_use; - uint16_t num_entries; - uint16_t max_mlid_ho; - uint16_t mft_depth; - uint16_t(*p_mask_tbl)[][IB_MCAST_POSITION_MAX + 1]; -} osm_mcast_tbl_t; -/* -* FIELDS -* num_ports -* The number of ports in the port mask. This value -* is the same as the number of ports on the switch -* -* max_position -* Maximum bit mask position for this table. This value -* is computed from the number of ports on the switch. -* -* max_block -* Maximum block number supported in the table. This value -* is approximately the number of MLID entries divided by the -* number of MLIDs per block -* -* num_entries -* Number of entries in the table (aka number of MLIDs supported). -* -* max_mlid_ho -* Maximum MLID (host order) for the currently allocated multicast -* port mask table. -* -* mft_depth -* Number of MLIDs in the currently allocated multicast port mask -* table. -* -* p_mask_tbl -* Pointer to a two dimensional array of port_masks for this switch. -* The first dimension is MLID offset, second dimension is mask position. -* This pointer is null for switches that do not support multicast. -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_init -* NAME -* osm_mcast_tbl_init -* -* DESCRIPTION -* This function initializes a Multicast Forwarding Table object. -* -* SYNOPSIS -*/ -void osm_mcast_tbl_init(IN osm_mcast_tbl_t * p_tbl, IN uint8_t num_ports, - IN uint16_t capacity); -/* -* PARAMETERS -* num_ports -* [in] Number of ports in the switch owning this table. -* -* capacity -* [in] The number of MLID entries (starting at 0xC000) supported -* by this switch. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_delete -* NAME -* osm_mcast_tbl_delete -* -* DESCRIPTION -* This destroys and deallocates a Multicast Forwarding Table object. -* -* SYNOPSIS -*/ -void osm_mcast_tbl_delete(IN osm_mcast_tbl_t ** pp_tbl); -/* -* PARAMETERS -* pp_tbl -* [in] Pointer a Pointer to the Multicast Forwarding Table object. -* -* RETURN VALUE -* On success, returns a pointer to a new Multicast Forwarding Table object -* of the specified size. -* NULL otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_realloc -* NAME -* osm_mcast_tbl_realloc -* -* DESCRIPTION -* This function reallocates the multicast port mask table if necessary. -* -* SYNOPSIS -*/ -int osm_mcast_tbl_realloc(IN osm_mcast_tbl_t * p_tbl, IN unsigned mlid_offset); -/* -* PARAMETERS -* -* p_tbl -* [in] Pointer to the Multicast Forwarding Table object. -* -* mlid_offset -* [in] Offset of MLID being accessed. -* -* RETURN VALUE -* Returns 0 on success and non-zero value otherwise. -* -* NOTES -* -* SEE ALSO -*/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_destroy -* NAME -* osm_mcast_tbl_destroy -* -* DESCRIPTION -* This destroys and deallocates a Multicast Forwarding Table object. -* -* SYNOPSIS -*/ -void osm_mcast_tbl_destroy(IN osm_mcast_tbl_t * p_tbl); -/* -* PARAMETERS -* p_tbl -* [in] Pointer to the Multicast Forwarding Table object. -* -* RETURN VALUE -* None -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_set -* NAME -* osm_mcast_tbl_set -* -* DESCRIPTION -* Adds the port to the multicast group. -* -* SYNOPSIS -*/ -void osm_mcast_tbl_set(IN osm_mcast_tbl_t * p_tbl, IN uint16_t mlid_ho, - IN uint8_t port_num); -/* -* PARAMETERS -* p_tbl -* [in] Pointer to the Multicast Forwarding Table object. -* -* mlid_ho -* [in] MLID value (host order) for which to set the route. -* -* port_num -* [in] Port to add to the multicast group. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_clear_mlid -* NAME -* osm_mcast_tbl_clear_mlid -* -* DESCRIPTION -* Removes all multicast paths for the specified MLID. -* -* SYNOPSIS -*/ -void osm_mcast_tbl_clear_mlid(IN osm_mcast_tbl_t * p_tbl, IN uint16_t mlid_ho); -/* -* PARAMETERS -* p_tbl -* [in] Pointer to the Multicast Forwarding Table object. -* -* mlid_ho -* [in] MLID value (host order) for which to clear. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_is_port -* NAME -* osm_mcast_tbl_is_port -* -* DESCRIPTION -* Returns TRUE if the port is in the multicast group. -* -* SYNOPSIS -*/ -boolean_t osm_mcast_tbl_is_port(IN const osm_mcast_tbl_t * p_tbl, - IN uint16_t mlid_ho, IN uint8_t port_num); -/* -* PARAMETERS -* p_tbl -* [in] Pointer to the Multicast Forwarding Table object. -* -* mlid_ho -* [in] MLID value (host order). -* -* port_num -* [in] Port number on the switch -* -* RETURN VALUE -* Returns the port that routes the specified LID. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_is_any_port -* NAME -* osm_mcast_tbl_is_any_port -* -* DESCRIPTION -* Returns TRUE if any port is in the multicast group. -* -* SYNOPSIS -*/ -boolean_t osm_mcast_tbl_is_any_port(IN const osm_mcast_tbl_t * p_tbl, - IN uint16_t mlid_ho); -/* -* PARAMETERS -* p_tbl -* [in] Pointer to the Multicast Forwarding Table object. -* -* mlid_ho -* [in] MLID value (host order). -* -* RETURN VALUE -* Returns TRUE if any port is in the multicast group. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_set_block -* NAME -* osm_mcast_tbl_set_block -* -* DESCRIPTION -* Copies the specified block into the Multicast Forwarding Table. -* -* SYNOPSIS -*/ -ib_api_status_t osm_mcast_tbl_set_block(IN osm_mcast_tbl_t * p_tbl, - IN const ib_net16_t * p_block, - IN int16_t block_num, - IN uint8_t position); -/* -* PARAMETERS -* p_tbl -* [in] Pointer to the Multicast Forwarding Table object. -* -* p_block -* [in] Pointer to the Forwarding Table block. -* -* block_num -* [in] Block number of this block. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_get_tbl_block -* NAME -* osm_mcast_get_tbl_block -* -* DESCRIPTION -* Retrieve a multicast forwarding table block. -* -* SYNOPSIS -*/ -boolean_t osm_mcast_tbl_get_block(IN osm_mcast_tbl_t * p_tbl, - IN int16_t block_num, IN uint8_t position, - OUT ib_net16_t * p_block); -/* -* PARAMETERS -* p_tbl -* [in] Pointer to an osm_mcast_tbl_t object. -* -* p_block -* [in] Pointer to the Forwarding Table block. -* -* block_num -* [in] Block number of this block. -* -* p_block -* [out] Pointer to the 32 entry array to store the -* forwarding table clock specified by block_id. -* -* RETURN VALUES -* Returns true if there are more blocks necessary to -* configure all the MLIDs reachable from this switch. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_get_max_block -* NAME -* osm_mcast_tbl_get_max_block -* -* DESCRIPTION -* Returns the maximum block ID in this table. -* -* SYNOPSIS -*/ -static inline uint16_t osm_mcast_tbl_get_max_block(IN osm_mcast_tbl_t * p_tbl) -{ - return p_tbl->max_block; -} - -/* -* PARAMETERS -* p_tbl -* [in] Pointer to an osm_mcast_tbl_t object. -* -* RETURN VALUES -* Returns the maximum block ID in this table. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_get_max_block_in_use -* NAME -* osm_mcast_tbl_get_max_block_in_use -* -* DESCRIPTION -* Returns the maximum block ID in use in this table. -* A value of -1 indicates no blocks are in use. -* -* SYNOPSIS -*/ -static inline int16_t -osm_mcast_tbl_get_max_block_in_use(IN osm_mcast_tbl_t * p_tbl) -{ - return (p_tbl->max_block_in_use); -} - -/* -* PARAMETERS -* p_tbl -* [in] Pointer to an osm_mcast_tbl_t object. -* -* RETURN VALUES -* Returns the maximum block ID in use in this table. -* A value of -1 indicates no blocks are in use. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Forwarding Table/osm_mcast_tbl_get_max_position -* NAME -* osm_mcast_tbl_get_max_position -* -* DESCRIPTION -* Returns the maximum position in this table. -* -* SYNOPSIS -*/ -static inline uint8_t -osm_mcast_tbl_get_max_position(IN osm_mcast_tbl_t * p_tbl) -{ - return (p_tbl->max_position); -} - -/* -* PARAMETERS -* p_tbl -* [in] Pointer to an osm_mcast_tbl_t object. -* -* RETURN VALUES -* Returns the maximum position in this table. -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_MCAST_TBL_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_mcm_port.h b/branches/opensm_3/user/include/opensm/osm_mcm_port.h deleted file mode 100644 index ee0ff99d..00000000 --- a/branches/opensm_3/user/include/opensm/osm_mcm_port.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_mcm_port_t. - * This object represents the membership of a port in a multicast group. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_MCM_PORT_H_ -#define _OSM_MCM_PORT_H_ - -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS - -struct osm_mgrp; - -/****s* OpenSM: MCM Port Object/osm_mcm_port_t -* NAME -* osm_mcm_port_t -* -* DESCRIPTION -* This object represents a particular port as a member of a -* multicast group. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_mcm_port { - cl_map_item_t map_item; - cl_list_item_t list_item; - osm_port_t *port; - struct osm_mgrp *mgrp; - ib_gid_t port_gid; - uint8_t scope_state; - boolean_t proxy_join; -} osm_mcm_port_t; -/* -* FIELDS -* map_item -* Map Item for qmap linkage. Must be first element!! -* -* port -* Reference to the parent port. -* -* mgrp -* The pointer to multicast group where this port is member of -* -* port_gid -* GID of the member port. -* -* scope_state -* ??? -* -* proxy_join -* If FALSE - Join was performed by the endport identified -* by PortGID. If TRUE - Join was performed on behalf of -* the endport identified by PortGID by another port within -* the same partition. -* -* SEE ALSO -* MCM Port Object -*********/ - -/****f* OpenSM: MCM Port Object/osm_mcm_port_new -* NAME -* osm_mcm_port_new -* -* DESCRIPTION -* The osm_mcm_port_new function allocates and initializes a -* MCM Port Object for use. -* -* SYNOPSIS -*/ -osm_mcm_port_t *osm_mcm_port_new(IN osm_port_t * port, IN struct osm_mgrp *mgrp, - IN ib_member_rec_t *mcmr, IN boolean_t proxy); -/* -* PARAMETERS -* port -* [in] Pointer to the port object. -* -* mgrp -* [in] Pointer to multicast group where this port is joined. -* -* mcmr -* [in] Pointer to MCMember record of the join request -* -* proxy -* [in] proxy_join state analyzed from the request -* -* RETURN VALUES -* Pointer to the allocated and initialized MCM Port object. -* -* NOTES -* -* SEE ALSO -* MCM Port Object, osm_mcm_port_delete, -*********/ - -/****f* OpenSM: MCM Port Object/osm_mcm_port_delete -* NAME -* osm_mcm_port_delete -* -* DESCRIPTION -* The osm_mcm_port_delete function destroys and dellallocates an -* MCM Port Object, releasing all resources. -* -* SYNOPSIS -*/ -void osm_mcm_port_delete(IN osm_mcm_port_t * p_mcm); -/* -* PARAMETERS -* p_mcm -* [in] Pointer to a MCM Port Object to delete. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* -* SEE ALSO -* MCM Port Object, osm_mcm_port_new -*********/ - -END_C_DECLS -#endif /* _OSM_MCM_PORT_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_mesh.h b/branches/opensm_3/user/include/opensm/osm_mesh.h deleted file mode 100644 index 4be391fd..00000000 --- a/branches/opensm_3/user/include/opensm/osm_mesh.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2008,2009 System Fabric Works, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declarations for mesh analysis - */ - -#ifndef OSM_MESH_H -#define OSM_MESH_H - -struct _lash; -struct _switch; - -/* - * per switch to switch link info - */ -typedef struct _link { - int switch_id; - int link_id; - int next_port; - int num_ports; - int ports[0]; -} link_t; - -/* - * per switch node mesh info - */ -typedef struct _mesh_node { - int *axes; /* used to hold and reorder assigned axes */ - int *coord; /* mesh coordinates of switch */ - int **matrix; /* distances between adjacant switches */ - int *poly; /* characteristic polynomial of matrix */ - /* used as an invariant classification */ - int dimension; /* apparent dimension of mesh around node */ - int temp; /* temporary holder for distance info */ - int type; /* index of node type in mesh_info array */ - unsigned int num_links; /* number of 'links' to adjacent switches */ - link_t *links[0]; /* per link information */ -} mesh_node_t; - -void osm_mesh_node_delete(struct _lash *p_lash, struct _switch *sw); -int osm_mesh_node_create(struct _lash *p_lash, struct _switch *sw); -int osm_do_mesh_analysis(struct _lash *p_lash); - -#endif diff --git a/branches/opensm_3/user/include/opensm/osm_msgdef.h b/branches/opensm_3/user/include/opensm/osm_msgdef.h deleted file mode 100644 index 6d4c34f6..00000000 --- a/branches/opensm_3/user/include/opensm/osm_msgdef.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of Dispatcher message values. - */ - -#ifndef _OSM_MSGDEF_H_ -#define _OSM_MSGDEF_H_ - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Dispatcher Messages -* NAME -* Dispatcher Messages -* -* DESCRIPTION -* These constants define the messages sent between OpenSM controllers -* attached to the Dispatcher. -* -* Each message description contains the following information: -* Sent by: which controller(s) send this message -* Received by: which controller receives this message -* Delivery notice: Indicates if the sender requires confirmation -* that the message has been delivered. Typically a "yes" here -* means that some resources associated with sending the -* message must be freed. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Dispatcher Messages/OSM_MSG_MAD_NODE_INFO -* NAME -* OSM_MSG_MAD_NODE_INFO -* -* DESCRIPTION -* Message for received NodeInfo MADs. -* -* NOTES -* Sent by: osm_mad_ctrl_t -* Received by: osm_ni_rcv_ctrl_t -* Delivery notice: yes -* -* -***********/ -/****s* OpenSM: Dispatcher Messages/OSM_MSG_MAD_PORT_INFO -* NAME -* OSM_MSG_MAD_PORT_INFO -* -* DESCRIPTION -* Message for received PortInfo MADs. -* -* NOTES -* Sent by: osm_mad_ctrl_t -* Received by: osm_pi_rcv_ctrl_t -* Delivery notice: yes -* -* -***********/ -/****s* OpenSM: Dispatcher Messages/OSM_MSG_MAD_SWITCH_INFO -* NAME -* OSM_MSG_MAD_SWITCH_INFO -* -* DESCRIPTION -* Message for received SwitchInfo MADs. -* -* NOTES -* Sent by: osm_mad_ctrl_t -* Received by: osm_si_rcv_ctrl_t -* Delivery notice: yes -* -***********/ -/****s* OpenSM: Dispatcher Messages/OSM_MSG_MAD_NODE_DESC -* NAME -* OSM_MSG_MAD_NODE_DESC -* -* DESCRIPTION -* Message for received NodeDescription MADs. -* -* NOTES -* Sent by: osm_mad_ctrl_t -* Received by: osm_nd_rcv_ctrl_t -* Delivery notice: yes -* -* SOURCE -***********/ -enum { - OSM_MSG_NONE = 0, - OSM_MSG_MAD_NODE_INFO, - OSM_MSG_MAD_PORT_INFO, - OSM_MSG_MAD_SWITCH_INFO, - OSM_MSG_MAD_NODE_DESC, - OSM_MSG_MAD_NODE_RECORD, - OSM_MSG_MAD_PORTINFO_RECORD, - OSM_MSG_MAD_SERVICE_RECORD, - OSM_MSG_MAD_PATH_RECORD, - OSM_MSG_MAD_MCMEMBER_RECORD, - OSM_MSG_MAD_LINK_RECORD, - OSM_MSG_MAD_SMINFO_RECORD, - OSM_MSG_MAD_CLASS_PORT_INFO, - OSM_MSG_MAD_INFORM_INFO, - OSM_MSG_MAD_LFT_RECORD, - OSM_MSG_MAD_LFT, - OSM_MSG_MAD_SM_INFO, - OSM_MSG_MAD_NOTICE, - OSM_MSG_LIGHT_SWEEP_FAIL, - OSM_MSG_MAD_MFT, - OSM_MSG_MAD_PKEY_TBL_RECORD, - OSM_MSG_MAD_VL_ARB_RECORD, - OSM_MSG_MAD_SLVL_TBL_RECORD, - OSM_MSG_MAD_PKEY, - OSM_MSG_MAD_VL_ARB, - OSM_MSG_MAD_SLVL, - OSM_MSG_MAD_GUIDINFO_RECORD, - OSM_MSG_MAD_INFORM_INFO_RECORD, - OSM_MSG_MAD_SWITCH_INFO_RECORD, - OSM_MSG_MAD_MFT_RECORD, -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - OSM_MSG_MAD_MULTIPATH_RECORD, -#endif - OSM_MSG_MAD_PORT_COUNTERS, - OSM_MSG_MAX -}; - -END_C_DECLS -#endif /* _OSM_MSGDEF_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_mtree.h b/branches/opensm_3/user/include/opensm/osm_mtree.h deleted file mode 100644 index 43db7f83..00000000 --- a/branches/opensm_3/user/include/opensm/osm_mtree.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_mtree_t. - * This object represents multicast spanning tree. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_MTREE_H_ -#define _OSM_MTREE_H_ - -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -#define OSM_MTREE_LEAF ((void*)-1) -/****h* OpenSM/Multicast Tree -* NAME -* Multicast Tree -* -* DESCRIPTION -* The Multicast Tree object encapsulates the information needed by the -* OpenSM to manage multicast fabric routes. It is a tree structure -* in which each node in the tree represents a switch, and may have a -* varying number of children. -* -* Multicast trees do not contain loops. -* -* The Multicast Tree is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Multicast Tree/osm_mtree_node_t -* NAME -* osm_mtree_node_t -* -* DESCRIPTION -* The MTree Node object encapsulates the information needed by the -* OpenSM for a particular switch in the multicast tree. -* -* The MTree Node object is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_mtree_node { - cl_map_item_t map_item; - const osm_switch_t *p_sw; - uint8_t max_children; - struct osm_mtree_node *p_up; - struct osm_mtree_node *child_array[1]; -} osm_mtree_node_t; -/* -* FIELDS -* map_item -* Linkage for quick map. MUST BE FIRST ELEMENT!!! -* -* p_sw -* Pointer to the switch represented by this tree node. -* -* max_children -* Maximum number of child nodes of this node. Equal to the -* the number of ports on the switch if the switch supports -* multicast. Equal to 1 (default route) if the switch does -* not support multicast. -* -* p_up -* Pointer to the parent of this node. If this pointer is -* NULL, the node is at the root of the tree. -* -* child_array -* Array (indexed by port number) of pointers to the -* child osm_mtree_node_t objects of this tree node, if any. -* -* SEE ALSO -*********/ - -/****f* OpenSM: Multicast Tree/osm_mtree_node_new -* NAME -* osm_mtree_node_new -* -* DESCRIPTION -* Returns an initialized a Multicast Tree object for use. -* -* SYNOPSIS -*/ -osm_mtree_node_t *osm_mtree_node_new(IN const osm_switch_t * p_sw); -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch represented by this node. -* -* RETURN VALUES -* Pointer to an initialized tree node. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Multicast Tree/osm_mtree_destroy -* NAME -* osm_mtree_destroy -* -* DESCRIPTION -* Destroys a Multicast Tree object given by the p_mtn -* -* SYNOPSIS -*/ -void osm_mtree_destroy(IN osm_mtree_node_t * p_mtn); -/* -* PARAMETERS -* p_mtn -* [in] Pointer to an osm_mtree_node_t object to destroy. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Multicast Tree/osm_mtree_node_get_max_children -* NAME -* osm_mtree_node_get_max_children -* -* DESCRIPTION -* Returns the number maximum number of children of this node. -* The return value is 1 greater than the highest valid port -* number on the switch. -* -* -* SYNOPSIS -*/ -static inline uint8_t -osm_mtree_node_get_max_children(IN const osm_mtree_node_t * p_mtn) -{ - return (p_mtn->max_children); -} -/* -* PARAMETERS -* p_mtn -* [in] Pointer to the multicast tree node. -* -* RETURN VALUES -* See description. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Multicast Tree/osm_mtree_node_get_child -* NAME -* osm_mtree_node_get_child -* -* DESCRIPTION -* Returns the specified child node of this node. -* -* SYNOPSIS -*/ -static inline osm_mtree_node_t *osm_mtree_node_get_child(IN const - osm_mtree_node_t * - p_mtn, - IN uint8_t child) -{ - CL_ASSERT(child < p_mtn->max_children); - return (p_mtn->child_array[child]); -} -/* -* PARAMETERS -* p_mtn -* [in] Pointer to the multicast tree node. -* -* child -* [in] Index of the child to retrieve. -* -* RETURN VALUES -* Returns the specified child node of this node. -* -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Multicast Tree/osm_mtree_node_get_switch_ptr -* NAME -* osm_mtree_node_get_switch_ptr -* -* DESCRIPTION -* Returns a pointer to the switch object represented by this tree node. -* -* SYNOPSIS -*/ -static inline const osm_switch_t *osm_mtree_node_get_switch_ptr(IN const - osm_mtree_node_t * - p_mtn) -{ - return p_mtn->p_sw; -} -/* -* PARAMETERS -* p_mtn -* [in] Pointer to the multicast tree node. -* -* child -* [in] Index of the child to retrieve. -* -* RETURN VALUES -* Returns a pointer to the switch object represented by this tree node. -* -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_MTREE_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_multicast.h b/branches/opensm_3/user/include/opensm/osm_multicast.h deleted file mode 100644 index c869342b..00000000 --- a/branches/opensm_3/user/include/opensm/osm_multicast.h +++ /dev/null @@ -1,389 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_mgrp_t. - * This object represents an IBA Multicast Group. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_MULTICAST_H_ -#define _OSM_MULTICAST_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Multicast Group -* NAME -* Multicast Group -* -* DESCRIPTION -* The Multicast Group encapsulates the information needed by the -* OpenSM to manage Multicast Groups. The OpenSM allocates one -* Multicast Group object per Multicast Group in the IBA subnet. -* -* The Multicast Group is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ - -/****s* OpenSM: Multicast Group/osm_mgrp_t -* NAME -* osm_mgrp_t -* -* DESCRIPTION -* Multicast Group structure. -* -* The osm_mgrp_t object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_mgrp { - cl_fmap_item_t map_item; - cl_list_item_t list_item; - ib_net16_t mlid; - cl_qmap_t mcm_port_tbl; - ib_member_rec_t mcmember_rec; - boolean_t well_known; - unsigned full_members; -} osm_mgrp_t; -/* -* FIELDS -* map_item -* Map Item for fmap linkage. Must be first element!! -* -* list_item -* List item for linkage in osm_mgrp_box's mgrp_list qlist. -* -* mlid -* The network ordered LID of this Multicast Group (must be -* >= 0xC000). -* -* mcm_port_tbl -* Table (sorted by port GUID) of osm_mcm_port_t objects -* representing the member ports of this multicast group. -* -* mcmember_rec -* Holds the parameters of the Multicast Group. -* -* well_known -* Indicates that this is the wellknown multicast group which -* is created during the initialization of SM/SA and will be -* present even if there are no ports for this group -* -* SEE ALSO -*********/ - -/****s* OpenSM: Multicast Group/osm_mgrp_box_t -* NAME -* osm_mgrp_box_t -* -* DESCRIPTION -* Multicast structure which holds all multicast groups with same MLID. -* -* SYNOPSIS -*/ -typedef struct osm_mgrp_box { - uint16_t mlid; - cl_qlist_t mgrp_list; - osm_mtree_node_t *root; -} osm_mgrp_box_t; -/* -* FIELDS -* mlid -* The host ordered LID of this Multicast Group (must be -* >= 0xC000). -* -* p_root -* Pointer to the root "tree node" in the single spanning tree -* for this multicast group. The nodes of the tree represent -* switches. Member ports are not represented in the tree. -* -* mgrp_list -* List of multicast groups (mpgr object) having same MLID value. -* -* SEE ALSO -*********/ - -/****f* OpenSM: Multicast Group/osm_mgrp_new -* NAME -* osm_mgrp_new -* -* DESCRIPTION -* Allocates and initializes a Multicast Group for use. -* -* SYNOPSIS -*/ -osm_mgrp_t *osm_mgrp_new(IN osm_subn_t * subn, IN ib_net16_t mlid, - IN ib_member_rec_t * mcmr); -/* -* PARAMETERS -* subn -* [in] Pointer to osm_subn_t object. -* mlid -* [in] Multicast LID for this multicast group. -* -* mcmr -* [in] MCMember Record for this multicast group. -* -* RETURN VALUES -* IB_SUCCESS if initialization was successful. -* -* NOTES -* Allows calling other Multicast Group methods. -* -* SEE ALSO -* Multicast Group, osm_mgrp_delete -*********/ - -/****f* OpenSM: Multicast Group/osm_mgrp_is_guid -* NAME -* osm_mgrp_is_guid -* -* DESCRIPTION -* Indicates if the specified port GUID is a member of the Multicast Group. -* -* SYNOPSIS -*/ -static inline boolean_t osm_mgrp_is_guid(IN const osm_mgrp_t * p_mgrp, - IN ib_net64_t port_guid) -{ - return (cl_qmap_get(&p_mgrp->mcm_port_tbl, port_guid) != - cl_qmap_end(&p_mgrp->mcm_port_tbl)); -} - -/* -* PARAMETERS -* p_mgrp -* [in] Pointer to an osm_mgrp_t object. -* -* port_guid -* [in] Port GUID. -* -* RETURN VALUES -* TRUE if the port GUID is a member of the group, -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* Multicast Group -*********/ - -/****f* OpenSM: Multicast Group/osm_mgrp_is_empty -* NAME -* osm_mgrp_is_empty -* -* DESCRIPTION -* Indicates if the multicast group has any member ports. -* -* SYNOPSIS -*/ -static inline boolean_t osm_mgrp_is_empty(IN const osm_mgrp_t * p_mgrp) -{ - return (cl_qmap_count(&p_mgrp->mcm_port_tbl) == 0); -} - -/* -* PARAMETERS -* p_mgrp -* [in] Pointer to an osm_mgrp_t object. -* -* RETURN VALUES -* TRUE if there are no ports in the multicast group. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* Multicast Group -*********/ - -/****f* OpenSM: Multicast Group/osm_mgrp_get_mlid -* NAME -* osm_mgrp_get_mlid -* -* DESCRIPTION -* The osm_mgrp_get_mlid function returns the multicast LID of this group. -* -* SYNOPSIS -*/ -static inline ib_net16_t osm_mgrp_get_mlid(IN const osm_mgrp_t * p_mgrp) -{ - return p_mgrp->mlid; -} - -/* -* PARAMETERS -* p_mgrp -* [in] Pointer to an osm_mgrp_t object. -* -* RETURN VALUES -* MLID of the Multicast Group. -* -* NOTES -* -* SEE ALSO -* Multicast Group -*********/ - -/****f* OpenSM: Multicast Group/osm_mgrp_add_port -* NAME -* osm_mgrp_add_port -* -* DESCRIPTION -* Adds a port to the multicast group. -* -* SYNOPSIS -*/ -osm_mcm_port_t *osm_mgrp_add_port(osm_subn_t *subn, osm_log_t *log, - IN osm_mgrp_t * mgrp, IN osm_port_t *port, - IN ib_member_rec_t *mcmr, IN boolean_t proxy); -/* -* PARAMETERS -* mgrp -* [in] Pointer to an osm_mgrp_t object to initialize. -* -* port -* [in] Pointer to an osm_port_t object -* -* mcmr -* [in] Pointer to MCMember record received for the join -* -* proxy -* [in] The proxy join state for this port in the group. -* -* RETURN VALUES -* IB_SUCCESS -* IB_INSUFFICIENT_MEMORY -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Multicast Group/osm_mgrp_get_mcm_port -* NAME -* osm_mgrp_get_mcm_port -* -* DESCRIPTION -* finds a port in the multicast group. -* -* SYNOPSIS -*/ -osm_mcm_port_t *osm_mgrp_get_mcm_port(IN const osm_mgrp_t * p_mgrp, - IN ib_net64_t port_guid); -/* -* PARAMETERS -* p_mgrp -* [in] Pointer to an osm_mgrp_t object. -* -* port_guid -* [in] Port guid of the departing port. -* -* RETURN VALUES -* Pointer to the mcm port object when present or NULL otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Multicast Group/osm_mgrp_remove_port -* NAME -* osm_mgrp_remove_port -* -* DESCRIPTION -* Removes a port from the multicast group. -* -* SYNOPSIS -*/ -void osm_mgrp_delete_port(IN osm_subn_t * subn, IN osm_log_t * log, - IN osm_mgrp_t * mgrp, IN ib_net64_t port_guid); -/* -* PARAMETERS -* -* subn -* [in] Pointer to the subnet object -* -* log -* [in] The log object pointer -* -* mgrp -* [in] Pointer to an osm_mgrp_t object. -* -* port_guid -* [in] Port guid of the departing port. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -void osm_mgrp_remove_port(osm_subn_t * subn, osm_log_t * log, osm_mgrp_t * mgrp, - osm_mcm_port_t * mcm_port, ib_member_rec_t * mcmr); -void osm_mgrp_cleanup(osm_subn_t * subn, osm_mgrp_t * mpgr); -void osm_mgrp_box_delete(osm_mgrp_box_t *mbox); - -END_C_DECLS -#endif /* _OSM_MULTICAST_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_node.h b/branches/opensm_3/user/include/opensm/osm_node.h deleted file mode 100644 index 797fe37e..00000000 --- a/branches/opensm_3/user/include/opensm/osm_node.h +++ /dev/null @@ -1,668 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_node_t. - * This object represents an IBA node. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_NODE_H_ -#define _OSM_NODE_H_ - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS - -struct osm_switch; - -/****h* OpenSM/Node -* NAME -* Node -* -* DESCRIPTION -* The Node object encapsulates the information needed by the -* OpenSM to manage nodes. The OpenSM allocates one Node object -* per node in the IBA subnet. -* -* The Node object is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ - -/****s* OpenSM: Node/osm_node_t -* NAME -* osm_node_t -* -* DESCRIPTION -* Node structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_node { - cl_map_item_t map_item; - struct osm_switch *sw; - ib_node_info_t node_info; - ib_node_desc_t node_desc; - uint32_t discovery_count; - uint32_t physp_tbl_size; - char *print_desc; - osm_physp_t physp_table[1]; -} osm_node_t; -/* -* FIELDS -* map_item -* Linkage structure for cl_qmap. MUST BE FIRST MEMBER! -* -* sw -* For switch node contains pointer to appropriate osm_switch -* structure. NULL for non-switch nodes. Can be used for fast -* access to switch object and for simple node type detection -* -* node_info -* The IBA defined NodeInfo data for this node. -* -* node_desc -* The IBA defined NodeDescription data for this node. -* -* discovery_count -* The number of times this node has been discovered -* during the current fabric sweep. This number is reset -* to zero at the start of a sweep. -* -* phsyp_tbl_size -* The size of the physp_table array. This value is one greater -* than the number of ports in the node, since port numbers -* start with 1 for some bizzare reason. -* -* print_desc -* A printable version of the node description. -* -* phsyp_table -* Array of physical port objects belonging to this node. -* Index is contiguous by local port number. -* For switches, port 0 is the always the management port (14.2.5.6). -* MUST BE LAST MEMBER! - Since it grows !!!! -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_delete -* NAME -* osm_node_delete -* -* DESCRIPTION -* The osm_node_delete function destroys a node, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_node_delete(IN OUT osm_node_t ** p_node); -/* -* PARAMETERS -* p_node -* [in][out] Pointer to a Pointer a Node object to destroy. -* On return, the pointer to set to NULL. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified Node object. -* This function should only be called after a call to osm_node_new. -* -* SEE ALSO -* Node object, osm_node_new -*********/ - -/****f* OpenSM: Node/osm_node_new -* NAME -* osm_node_new -* -* DESCRIPTION -* The osm_node_new function initializes a Node object for use. -* -* SYNOPSIS -*/ -osm_node_t *osm_node_new(IN const osm_madw_t * p_madw); -/* -* PARAMETERS -* p_madw -* [in] Pointer to a osm_madw_t object containing a mad with -* the node's NodeInfo attribute. The caller may discard the -* osm_madw_t structure after calling osm_node_new. -* -* RETURN VALUES -* On success, a pointer to the new initialized osm_node_t structure. -* NULL otherwise. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_get_physp_ptr -* NAME -* osm_node_get_physp_ptr -* -* DESCRIPTION -* Returns a pointer to the physical port object at the -* specified local port number. -* -* SYNOPSIS -*/ -static inline osm_physp_t *osm_node_get_physp_ptr(IN osm_node_t * p_node, - IN uint32_t port_num) -{ - - CL_ASSERT(port_num < p_node->physp_tbl_size); - return osm_physp_is_valid(&p_node->physp_table[port_num]) ? - &p_node->physp_table[port_num] : NULL; -} - -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Local port number. -* -* RETURN VALUES -* Returns a pointer to the physical port object at the -* specified local port number. -* A return value of zero means the port number was out of range. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_get_type -* NAME -* osm_node_get_type -* -* DESCRIPTION -* Returns the type of this node. -* -* SYNOPSIS -*/ -static inline uint8_t osm_node_get_type(IN const osm_node_t * p_node) -{ - return p_node->node_info.node_type; -} - -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* RETURN VALUES -* Returns the IBA defined type of this node. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_get_num_physp -* NAME -* osm_node_get_num_physp -* -* DESCRIPTION -* Returns the number of osm_physp ports allocated for this node. -* For switches, it is the number of external physical ports plus -* port 0. For CAs and routers, it is the number of external physical -* ports plus 1. -* -* SYNOPSIS -*/ -static inline uint8_t osm_node_get_num_physp(IN const osm_node_t * p_node) -{ - return (uint8_t) p_node->physp_tbl_size; -} - -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* RETURN VALUES -* Returns the IBA defined type of this node. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_get_remote_node -* NAME -* osm_node_get_remote_node -* -* DESCRIPTION -* Returns a pointer to the node on the other end of the -* specified port. -* Returns NULL if no remote node exists. -* -* SYNOPSIS -*/ -osm_node_t *osm_node_get_remote_node(IN osm_node_t * p_node, - IN uint8_t port_num, - OUT uint8_t * p_remote_port_num); -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Port number in p_node through which to get the remote node. -* -* p_remote_port_num -* [out] Port number in the remote's node through which this -* link exists. The caller may specify NULL for this pointer -* if the port number isn't needed. -* -* RETURN VALUES -* Returns a pointer to the node on the other end of the -* specified port. -* Returns NULL if no remote node exists. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_get_base_lid -* NAME -* osm_node_get_base_lid -* -* DESCRIPTION -* Returns the LID value of the specified port on this node. -* -* SYNOPSIS -*/ -static inline ib_net16_t osm_node_get_base_lid(IN const osm_node_t * p_node, - IN uint32_t port_num) -{ - CL_ASSERT(port_num < p_node->physp_tbl_size); - return osm_physp_get_base_lid(&p_node->physp_table[port_num]); -} - -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Local port number. -* -* RETURN VALUES -* Returns a pointer to the physical port object at the -* specified local port number. -* A return value of zero means the port number was out of range. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_get_remote_base_lid -* NAME -* osm_node_get_remote_base_lid -* -* DESCRIPTION -* Returns the base LID value of the port on the other side -* of the wire from the specified port on this node. -* -* SYNOPSIS -*/ -ib_net16_t osm_node_get_remote_base_lid(IN osm_node_t * p_node, - IN uint32_t port_num); -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Local port number. -* -* RETURN VALUES -* Returns a pointer to the physical port object at the -* specified local port number. -* A return value of zero means the port number was out of range. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_get_lmc -* NAME -* osm_node_get_lmc -* -* DESCRIPTION -* Returns the LMC value of the specified port on this node. -* -* SYNOPSIS -*/ -static inline uint8_t osm_node_get_lmc(IN const osm_node_t * p_node, - IN uint32_t port_num) -{ - CL_ASSERT(port_num < p_node->physp_tbl_size); - return osm_physp_get_lmc(&p_node->physp_table[port_num]); -} - -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Local port number. -* -* RETURN VALUES -* Returns the LMC value of the specified port on this node. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_init_physp -* NAME -* osm_node_init_physp -* -* DESCRIPTION -* Initializes a physical port for the given node. -* -* SYNOPSIS -*/ -void osm_node_init_physp(IN osm_node_t * p_node, uint8_t port_num, - IN const osm_madw_t * p_madw); -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* p_madw -* [in] Pointer to a osm_madw_t object containing a mad with -* the node's NodeInfo attribute as discovered through the -* Physical Port to add to the node. The caller may discard the -* osm_madw_t structure after calling osm_node_new. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -* Node object, Physical Port object. -*********/ - -/****f* OpenSM: Node/osm_node_get_node_guid -* NAME -* osm_node_get_node_guid -* -* DESCRIPTION -* Returns the node GUID of this node. -* -* SYNOPSIS -*/ -static inline ib_net64_t osm_node_get_node_guid(IN const osm_node_t * p_node) -{ - return p_node->node_info.node_guid; -} - -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* RETURN VALUES -* Returns the node GUID of this node. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_link -* NAME -* osm_node_link -* -* DESCRIPTION -* Logically connects a node to another node through the specified port. -* -* SYNOPSIS -*/ -void osm_node_link(IN osm_node_t * p_node, IN uint8_t port_num, - IN osm_node_t * p_remote_node, IN uint8_t remote_port_num); -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Port number in p_node through which to create the link. -* -* p_remote_node -* [in] Pointer to the remote port object. -* -* remote_port_num -* [in] Port number in the remote's node through which to -* create this link. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_unlink -* NAME -* osm_node_unlink -* -* DESCRIPTION -* Logically disconnects a node from another node through -* the specified port. -* -* SYNOPSIS -*/ -void osm_node_unlink(IN osm_node_t * p_node, IN uint8_t port_num, - IN osm_node_t * p_remote_node, IN uint8_t remote_port_num); -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Port number in p_node through which to unlink. -* -* p_remote_node -* [in] Pointer to the remote port object. -* -* remote_port_num -* [in] Port number in the remote's node through which to unlink. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_link_exists -* NAME -* osm_node_link_exists -* -* DESCRIPTION -* Return TRUE if a link exists between the specified nodes on -* the specified ports. -* Returns FALSE otherwise. -* -* SYNOPSIS -*/ -boolean_t osm_node_link_exists(IN osm_node_t * p_node, IN uint8_t port_num, - IN osm_node_t * p_remote_node, - IN uint8_t remote_port_num); -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Port number in p_node through which to check the link. -* -* p_remote_node -* [in] Pointer to the remote port object. -* -* remote_port_num -* [in] Port number in the remote's node through which to -* check this link. -* -* RETURN VALUES -* Return TRUE if a link exists between the specified nodes on -* the specified ports. -* Returns FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_has_any_link -* NAME -* osm_node_has_any_link -* -* DESCRIPTION -* Return TRUE if a any link exists from the specified nodes on -* the specified port. -* Returns FALSE otherwise. -* -* SYNOPSIS -*/ -boolean_t osm_node_has_any_link(IN osm_node_t * p_node, IN uint8_t port_num); -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Port number in p_node through which to check the link. -* -* RETURN VALUES -* Return TRUE if a any link exists from the specified nodes on -* the specified port. -* Returns FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -/****f* OpenSM: Node/osm_node_link_has_valid_ports -* NAME -* osm_node_link_has_valid_ports -* -* DESCRIPTION -* Return TRUE if both ports in the link are valid (initialized). -* Returns FALSE otherwise. -* -* SYNOPSIS -*/ -boolean_t osm_node_link_has_valid_ports(IN osm_node_t * p_node, - IN uint8_t port_num, - IN osm_node_t * p_remote_node, - IN uint8_t remote_port_num); -/* -* PARAMETERS -* p_node -* [in] Pointer to an osm_node_t object. -* -* port_num -* [in] Port number in p_node through which to check the link. -* -* RETURN VALUES -* Return TRUE if both ports in the link are valid (initialized). -* Returns FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* Node object -*********/ - -END_C_DECLS -#endif /* _OSM_NODE_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_opensm.h b/branches/opensm_3/user/include/opensm/osm_opensm.h deleted file mode 100644 index 7049088d..00000000 --- a/branches/opensm_3/user/include/opensm/osm_opensm.h +++ /dev/null @@ -1,523 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_opensm_t. - * This object represents the OpenSM super object. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_OPENSM_H_ -#define _OSM_OPENSM_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/OpenSM -* NAME -* OpenSM -* -* DESCRIPTION -* The OpenSM object encapsulates the information needed by the -* OpenSM to govern itself. The OpenSM is one OpenSM object. -* -* The OpenSM object is thread safe. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****d* OpenSM: OpenSM/osm_routing_engine_type_t -* NAME -* osm_routing_engine_type_t -* -* DESCRIPTION -* Enumerates the possible routing engines that -* could be used to route a subnet. -* -* SYNOPSIS -*/ -typedef enum _osm_routing_engine_type { - OSM_ROUTING_ENGINE_TYPE_NONE = 0, - OSM_ROUTING_ENGINE_TYPE_MINHOP, - OSM_ROUTING_ENGINE_TYPE_UPDN, - OSM_ROUTING_ENGINE_TYPE_FILE, - OSM_ROUTING_ENGINE_TYPE_FTREE, - OSM_ROUTING_ENGINE_TYPE_LASH, - OSM_ROUTING_ENGINE_TYPE_DOR, - OSM_ROUTING_ENGINE_TYPE_UNKNOWN -} osm_routing_engine_type_t; -/***********/ - -/****s* OpenSM: OpenSM/osm_routing_engine -* NAME -* struct osm_routing_engine -* -* DESCRIPTION -* OpenSM routing engine module definition. -* NOTES -* routing engine structure - multicast callbacks may be -* added later. -*/ -struct osm_routing_engine { - const char *name; - void *context; - int (*build_lid_matrices) (void *context); - int (*ucast_build_fwd_tables) (void *context); - void (*ucast_dump_tables) (void *context); - void (*delete) (void *context); - struct osm_routing_engine *next; -}; -/* -* FIELDS -* name -* The routing engine name (will be used in logs). -* -* context -* The routing engine context. Will be passed as parameter -* to the callback functions. -* -* build_lid_matrices -* The callback for lid matrices generation. -* -* ucast_build_fwd_tables -* The callback for unicast forwarding table generation. -* -* ucast_dump_tables -* The callback for dumping unicast routing tables. -* -* delete -* The delete method, may be used for routing engine -* internals cleanup. -* -* next -* Pointer to next routing engine in the list. -*/ - -/****s* OpenSM: OpenSM/osm_opensm_t -* NAME -* osm_opensm_t -* -* DESCRIPTION -* OpenSM structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_opensm { - const char *osm_version; - osm_subn_t subn; - osm_sm_t sm; - osm_sa_t sa; -#ifdef ENABLE_OSM_PERF_MGR - osm_perfmgr_t perfmgr; -#endif /* ENABLE_OSM_PERF_MGR */ - cl_qlist_t plugin_list; - osm_db_t db; - osm_mad_pool_t mad_pool; - osm_vendor_t *p_vendor; - osm_vl15_t vl15; - osm_log_t log; - cl_dispatcher_t disp; - cl_plock_t lock; - struct osm_routing_engine *routing_engine_list; - osm_routing_engine_type_t routing_engine_used; - osm_stats_t stats; - osm_console_t console; - nn_map_t *node_name_map; -} osm_opensm_t; -/* -* FIELDS -* osm_version -* OpenSM version (as generated in osm_version.h) -* -* subn -* Subnet object for this subnet. -* -* sm -* The Subnet Manager (SM) object for this subnet. -* -* sa -* The Subnet Administration (SA) object for this subnet. -* -* db -* Persistant storage of some data required between sessions. -* -* mad_pool -* Pool of Management Datagram (MAD) objects. -* -* p_vendor -* Pointer to the Vendor specific adapter for various -* transport interfaces, such as UMADT, AL, etc. The -* particular interface is set at compile time. -* -* vl15 -* The VL15 interface. -* -* log -* Log facility used by all OpenSM components. -* -* disp -* Central dispatcher containing the OpenSM worker threads. -* -* lock -* Shared lock guarding most OpenSM structures. -* -* routing_engine_list -* List of routing engines that should be tried for use. -* -* routing_engine_used -* Indicates which routing engine was used to route a subnet. -* -* stats -* Open SM statistics block -* -* SEE ALSO -*********/ - -/****f* OpenSM: OpenSM/osm_opensm_construct -* NAME -* osm_opensm_construct -* -* DESCRIPTION -* This function constructs an OpenSM object. -* -* SYNOPSIS -*/ -void osm_opensm_construct(IN osm_opensm_t * p_osm); -/* -* PARAMETERS -* p_osm -* [in] Pointer to a OpenSM object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_opensm_init, osm_opensm_destroy -* -* Calling osm_opensm_construct is a prerequisite to calling any other -* method except osm_opensm_init. -* -* SEE ALSO -* SM object, osm_opensm_init, osm_opensm_destroy -*********/ - -/****f* OpenSM: OpenSM/osm_opensm_destroy -* NAME -* osm_opensm_destroy -* -* DESCRIPTION -* The osm_opensm_destroy function destroys an SM, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_opensm_destroy(IN osm_opensm_t * p_osm); -/* -* PARAMETERS -* p_osm -* [in] Pointer to a OpenSM object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified OpenSM object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to osm_opensm_construct or -* osm_opensm_init. -* -* SEE ALSO -* SM object, osm_opensm_construct, osm_opensm_init -*********/ - -/****f* OpenSM: OpenSM/osm_opensm_init -* NAME -* osm_opensm_init -* -* DESCRIPTION -* The osm_opensm_init function initializes a OpenSM object for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_opensm_init(IN osm_opensm_t * p_osm, - IN const osm_subn_opt_t * p_opt); -/* -* PARAMETERS -* p_osm -* [in] Pointer to an osm_opensm_t object to initialize. -* -* p_opt -* [in] Pointer to the subnet options structure. -* -* RETURN VALUES -* IB_SUCCESS if the OpenSM object was initialized successfully. -* -* NOTES -* Allows calling other OpenSM methods. -* -* SEE ALSO -* SM object, osm_opensm_construct, osm_opensm_destroy -*********/ - -/****f* OpenSM: OpenSM/osm_opensm_sweep -* NAME -* osm_opensm_sweep -* -* DESCRIPTION -* Initiates a subnet sweep. -* -* SYNOPSIS -*/ -static inline void osm_opensm_sweep(IN osm_opensm_t * p_osm) -{ - osm_sm_sweep(&p_osm->sm); -} - -/* -* PARAMETERS -* p_osm -* [in] Pointer to an osm_opensm_t object on which to -* initiate a sweep. -* -* RETURN VALUES -* None -* -* NOTES -* If the OpenSM object is not bound to a port, this function -* does nothing. -* -* SEE ALSO -*********/ - -/****f* OpenSM: OpenSM/osm_opensm_set_log_flags -* NAME -* osm_opensm_set_log_flags -* -* DESCRIPTION -* Sets the log level. -* -* SYNOPSIS -*/ -static inline void osm_opensm_set_log_flags(IN osm_opensm_t * p_osm, - IN osm_log_level_t log_flags) -{ - osm_log_set_level(&p_osm->log, log_flags); -} - -/* -* PARAMETERS -* p_osm -* [in] Pointer to an osm_opensm_t object. -* -* log_flags -* [in] Log level flags to set. -* -* RETURN VALUES -* None -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: OpenSM/osm_opensm_bind -* NAME -* osm_opensm_bind -* -* DESCRIPTION -* Binds the opensm object to a port guid. -* -* SYNOPSIS -*/ -ib_api_status_t osm_opensm_bind(IN osm_opensm_t * p_osm, IN ib_net64_t guid); -/* -* PARAMETERS -* p_osm -* [in] Pointer to an osm_opensm_t object to bind. -* -* guid -* [in] Local port GUID with which to bind. -* -* RETURN VALUES -* None -* -* NOTES -* A given opensm object can only be bound to one port at a time. -* -* SEE ALSO -*********/ - -/****f* OpenSM: OpenSM/osm_opensm_wait_for_subnet_up -* NAME -* osm_opensm_wait_for_subnet_up -* -* DESCRIPTION -* Blocks the calling thread until the subnet is up. -* -* SYNOPSIS -*/ -static inline cl_status_t -osm_opensm_wait_for_subnet_up(IN osm_opensm_t * p_osm, IN uint32_t wait_us, - IN boolean_t interruptible) -{ - return osm_sm_wait_for_subnet_up(&p_osm->sm, wait_us, interruptible); -} - -/* -* PARAMETERS -* p_osm -* [in] Pointer to an osm_opensm_t object. -* -* wait_us -* [in] Number of microseconds to wait. -* -* interruptible -* [in] Indicates whether the wait operation can be interrupted -* by external signals. -* -* RETURN VALUES -* CL_SUCCESS if the wait operation succeeded in response to the event -* being set. -* -* CL_TIMEOUT if the specified time period elapses. -* -* CL_NOT_DONE if the wait was interrupted by an external signal. -* -* CL_ERROR if the wait operation failed. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: OpenSM/osm_routing_engine_type_str -* NAME -* osm_routing_engine_type_str -* -* DESCRIPTION -* Returns a string for the specified routing engine type. -* -* SYNOPSIS -*/ -const char *osm_routing_engine_type_str(IN osm_routing_engine_type_t type); -/* -* PARAMETERS -* type -* [in] routing engine type. -* -* RETURN VALUES -* Pointer to routing engine name. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: OpenSM/osm_routing_engine_type -* NAME -* osm_routing_engine_type -* -* DESCRIPTION -* Returns a routing engine type specified routing engine name string. -* -* SYNOPSIS -*/ -osm_routing_engine_type_t osm_routing_engine_type(IN const char *str); -/* -* PARAMETERS -* str -* [in] routing engine name string. -* -* RETURN VALUES -* Routing engine type. -* -* NOTES -* -* SEE ALSO -*********/ - -void osm_opensm_report_event(osm_opensm_t *osm, osm_epi_event_id_t event_id, - void *event_data); - -/* dump helpers */ -void osm_dump_mcast_routes(osm_opensm_t * osm); -void osm_dump_all(osm_opensm_t * osm); -void osm_dump_qmap_to_file(osm_opensm_t * p_osm, const char *file_name, - cl_qmap_t * map, - void (*func) (cl_map_item_t *, FILE *, void *), - void *cxt); - -/****v* OpenSM/osm_exit_flag -*/ -extern volatile unsigned int osm_exit_flag; -/* -* DESCRIPTION -* Set to one to cause all threads to leave -*********/ - -END_C_DECLS -#endif /* _OSM_OPENSM_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_partition.h b/branches/opensm_3/user/include/opensm/osm_partition.h deleted file mode 100644 index 201802b9..00000000 --- a/branches/opensm_3/user/include/opensm/osm_partition.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_prtn_t. - * This object represents an IBA Partition. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_PARTITION_H_ -#define _OSM_PARTITION_H_ - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Partition -* NAME -* Partition -* -* DESCRIPTION -* The Partition object encapsulates the information needed by the -* OpenSM to manage Partitions. The OpenSM allocates one Partition -* object per Partition in the IBA subnet. -* -* The Partition is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Partition/osm_prtn_t -* NAME -* osm_prtn_t -* -* DESCRIPTION -* Partition structure. -* -* The osm_prtn_t object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_prtn { - cl_map_item_t map_item; - ib_net16_t pkey; - uint8_t sl; - osm_mgrp_t *mgrp; - cl_map_t full_guid_tbl; - cl_map_t part_guid_tbl; - char name[32]; -} osm_prtn_t; -/* -* FIELDS -* map_item -* Linkage structure for cl_qmap. MUST BE FIRST MEMBER! -* -* pkey -* The IBA defined P_KEY of this Partition. -* -* sl -* The Service Level (SL) associated with this Partiton. -* -* mgrp -* The pointer to the well known Multicast Group -* that was created for this partition (when configured). -* -* full_guid_tbl -* Container of pointers to all Port objects in the Partition -* with full membership, indexed by port GUID. -* -* part_guid_tbl -* Container of pointers to all Port objects in the Partition -* with limited membership, indexed by port GUID. -* -* name -* Name of the Partition as specified in partition -* configuration. -* -* SEE ALSO -* Partition -*********/ - -/****f* OpenSM: Partition/osm_prtn_delete -* NAME -* osm_prtn_delete -* -* DESCRIPTION -* This function destroys and deallocates a Partition object. -* -* SYNOPSIS -*/ -void osm_prtn_delete(IN OUT osm_prtn_t ** pp_prtn); -/* -* PARAMETERS -* pp_prtn -* [in][out] Pointer to a pointer to a Partition object to -* delete. On return, this pointer is NULL. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified Partition object. -* -* SEE ALSO -* Partition, osm_prtn_new -*********/ - -/****f* OpenSM: Partition/osm_prtn_new -* NAME -* osm_prtn_new -* -* DESCRIPTION -* This function allocates and initializes a Partition object. -* -* SYNOPSIS -*/ -osm_prtn_t *osm_prtn_new(IN const char *name, IN uint16_t pkey); -/* -* PARAMETERS -* name -* [in] Partition name string -* -* pkey -* [in] Partition P_Key value -* -* RETURN VALUE -* Pointer to the initialize Partition object. -* -* NOTES -* Allows calling other partition methods. -* -* SEE ALSO -* Partition -*********/ - -/****f* OpenSM: Partition/osm_prtn_is_guid -* NAME -* osm_prtn_is_guid -* -* DESCRIPTION -* Indicates if a port is a member of the partition. -* -* SYNOPSIS -*/ -static inline boolean_t osm_prtn_is_guid(IN const osm_prtn_t * p_prtn, - IN ib_net64_t guid) -{ - return (cl_map_get(&p_prtn->full_guid_tbl, guid) != NULL) || - (cl_map_get(&p_prtn->part_guid_tbl, guid) != NULL); -} - -/* -* PARAMETERS -* p_prtn -* [in] Pointer to an osm_prtn_t object. -* -* guid -* [in] Port GUID. -* -* RETURN VALUES -* TRUE if the specified port GUID is a member of the partition, -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Partition/osm_prtn_make_partitions -* NAME -* osm_prtn_make_partitions -* -* DESCRIPTION -* Makes all partitions in subnet. -* -* SYNOPSIS -*/ -ib_api_status_t osm_prtn_make_partitions(IN osm_log_t * p_log, - IN osm_subn_t * p_subn); -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_subn -* [in] Pointer to subnet object. -* -* RETURN VALUES -* IB_SUCCESS value on success. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Partition/osm_prtn_find_by_name -* NAME -* osm_prtn_find_by_name -* -* DESCRIPTION -* Fides partition by name. -* -* SYNOPSIS -*/ -osm_prtn_t *osm_prtn_find_by_name(IN osm_subn_t * p_subn, IN const char *name); -/* -* PARAMETERS -* p_subn -* [in] Pointer to a subnet object. -* -* name -* [in] Required partition name. -* -* RETURN VALUES -* Pointer to the partition object on success. -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_PARTITION_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_path.h b/branches/opensm_3/user/include/opensm/osm_path.h deleted file mode 100644 index 85847e70..00000000 --- a/branches/opensm_3/user/include/opensm/osm_path.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_PATH_H_ -#define _OSM_PATH_H_ - -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* - * Abstract: - * Declaration of path related objects. - * These objects are part of the OpenSM family of objects. - */ -/****h* OpenSM/DR Path -* NAME -* DR Path -* -* DESCRIPTION -* The DR Path structure encapsulates a directed route through the subnet. -* -* This structure allows direct access to member variables. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: DR Path/osm_dr_path_t -* NAME -* osm_dr_path_t -* -* DESCRIPTION -* Directed Route structure. -* -* This structure allows direct access to member variables. -* -* SYNOPSIS -*/ -typedef struct osm_dr_path { - osm_bind_handle_t h_bind; - uint8_t hop_count; - uint8_t path[IB_SUBNET_PATH_HOPS_MAX]; -} osm_dr_path_t; -/* -* FIELDS -* h_bind -* Bind handle for port to which this path applies. -* -* hop_count -* The number of hops in this path. -* -* path -* The array of port numbers that comprise this path. -* -* SEE ALSO -* DR Path structure -*********/ -/****f* OpenSM: DR Path/osm_dr_path_construct -* NAME -* osm_dr_path_construct -* -* DESCRIPTION -* This function constructs a directed route path object. -* -* SYNOPSIS -*/ -static inline void osm_dr_path_construct(IN osm_dr_path_t * p_path) -{ - /* The first location in the path array is reserved. */ - memset(p_path, 0, sizeof(*p_path)); - p_path->h_bind = OSM_BIND_INVALID_HANDLE; -} - -/* -* PARAMETERS -* p_path -* [in] Pointer to a directed route path object to initialize. -* -* h_bind -* [in] Bind handle for the port on which this path applies. -* -* hop_count -* [in] Hop count needed to reach this node. -* -* path -* [in] Directed route path to reach this node. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: DR Path/osm_dr_path_init -* NAME -* osm_dr_path_init -* -* DESCRIPTION -* This function initializes a directed route path object. -* -* SYNOPSIS -*/ -static inline void -osm_dr_path_init(IN osm_dr_path_t * p_path, IN osm_bind_handle_t h_bind, - IN uint8_t hop_count, - IN const uint8_t path[IB_SUBNET_PATH_HOPS_MAX]) -{ - /* The first location in the path array is reserved. */ - CL_ASSERT(path[0] == 0); - CL_ASSERT(hop_count < IB_SUBNET_PATH_HOPS_MAX); - p_path->h_bind = h_bind; - p_path->hop_count = hop_count; - memcpy(p_path->path, path, hop_count + 1); -} - -/* -* PARAMETERS -* p_path -* [in] Pointer to a directed route path object to initialize. -* -* h_bind -* [in] Bind handle for the port on which this path applies. -* -* hop_count -* [in] Hop count needed to reach this node. -* -* path -* [in] Directed route path to reach this node. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ -/****f* OpenSM: DR Path/osm_dr_path_extend -* NAME -* osm_dr_path_extend -* -* DESCRIPTION -* Adds a new hop to a path. -* -* SYNOPSIS -*/ -static inline int osm_dr_path_extend(IN osm_dr_path_t * p_path, - IN uint8_t port_num) -{ - p_path->hop_count++; - - if (p_path->hop_count >= IB_SUBNET_PATH_HOPS_MAX) - return -1; - /* - Location 0 in the path array is reserved per IB spec. - */ - p_path->path[p_path->hop_count] = port_num; - return 0; -} - -/* -* PARAMETERS -* p_path -* [in] Pointer to a directed route path object to initialize. -* -* port_num -* [in] Additional port to add to the DR path. -* -* RETURN VALUES -* 0 indicates path was extended. -* Other than 0 indicates path was not extended. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: DR Path/osm_dr_path_get_bind_handle -* NAME -* osm_dr_path_get_bind_handle -* -* DESCRIPTION -* Gets the bind handle from a path. -* -* SYNOPSIS -*/ -static inline osm_bind_handle_t -osm_dr_path_get_bind_handle(IN const osm_dr_path_t * p_path) -{ - return p_path->h_bind; -} - -/* -* PARAMETERS -* p_path -* [in] Pointer to a directed route path object to initialize. -* -* port_num -* [in] Additional port to add to the DR path. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_PATH_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_perfmgr.h b/branches/opensm_3/user/include/opensm/osm_perfmgr.h deleted file mode 100644 index a99c4b30..00000000 --- a/branches/opensm_3/user/include/opensm/osm_perfmgr.h +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2007 The Regents of the University of California. - * Copyright (c) 2007-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_PERFMGR_H_ -#define _OSM_PERFMGR_H_ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#ifdef ENABLE_OSM_PERF_MGR - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/****h* OpenSM/PerfMgr -* NAME -* PerfMgr -* -* DESCRIPTION -* Performance manager thread which takes care of polling the fabric for -* Port counters values. -* -* The PerfMgr object is thread safe. -* -* AUTHOR -* Ira Weiny, LLNL -* -*********/ - -#define OSM_PERFMGR_DEFAULT_SWEEP_TIME_S 180 -#define OSM_PERFMGR_DEFAULT_DUMP_FILE "opensm_port_counters.log" -#define OSM_PERFMGR_DEFAULT_MAX_OUTSTANDING_QUERIES 500 - -/****s* OpenSM: PerfMgr/osm_perfmgr_state_t */ -typedef enum { - PERFMGR_STATE_DISABLE, - PERFMGR_STATE_ENABLED, - PERFMGR_STATE_NO_DB -} osm_perfmgr_state_t; - -/****s* OpenSM: PerfMgr/osm_perfmgr_sweep_state_t */ -typedef enum { - PERFMGR_SWEEP_SLEEP, - PERFMGR_SWEEP_ACTIVE, - PERFMGR_SWEEP_SUSPENDED -} osm_perfmgr_sweep_state_t; - -/* Redirection information */ -typedef struct redir { - ib_net16_t redir_lid; - ib_net32_t redir_qp; -} redir_t; - -/* Node to store information about nodes being monitored */ -typedef struct monitored_node { - cl_map_item_t map_item; - struct monitored_node *next; - uint64_t guid; - boolean_t esp0; - char *name; - uint32_t num_ports; - redir_t redir_port[1]; /* redirection on a per port basis */ -} monitored_node_t; - -struct osm_opensm; - -/****s* OpenSM: PerfMgr/osm_perfmgr_t -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -*/ -typedef struct osm_perfmgr { - cl_event_t sig_sweep; - cl_timer_t sweep_timer; - struct osm_opensm *osm; - osm_subn_t *subn; - osm_sm_t *sm; - cl_plock_t *lock; - osm_log_t *log; - osm_mad_pool_t *mad_pool; - atomic32_t trans_id; - osm_vendor_t *vendor; - osm_bind_handle_t bind_handle; - cl_disp_reg_handle_t pc_disp_h; - osm_perfmgr_state_t state; - osm_perfmgr_sweep_state_t sweep_state; - uint16_t sweep_time_s; - perfmgr_db_t *db; - atomic32_t outstanding_queries; /* this along with sig_query */ - cl_event_t sig_query; /* will throttle our queries */ - uint32_t max_outstanding_queries; - cl_qmap_t monitored_map; /* map the nodes being tracked */ - monitored_node_t *remove_list; -} osm_perfmgr_t; -/* -* FIELDS -* subn -* Subnet object for this subnet. -* -* log -* Pointer to the log object. -* -* mad_pool -* Pointer to the MAD pool. -* -* mad_ctrl -* Mad Controller -*********/ - -/****f* OpenSM: Creation Functions */ -void osm_perfmgr_shutdown(osm_perfmgr_t * p_perfmgr); -void osm_perfmgr_destroy(osm_perfmgr_t * p_perfmgr); - -/****f* OpenSM: Inline accessor functions */ -inline static void osm_perfmgr_set_state(osm_perfmgr_t * p_perfmgr, - osm_perfmgr_state_t state) -{ - p_perfmgr->state = state; - if (state == PERFMGR_STATE_ENABLED) - osm_sm_signal(p_perfmgr->sm, OSM_SIGNAL_PERFMGR_SWEEP); -} - -inline static osm_perfmgr_state_t osm_perfmgr_get_state(osm_perfmgr_t * perfmgr) -{ - return perfmgr->state; -} - -inline static char *osm_perfmgr_get_state_str(osm_perfmgr_t * p_perfmgr) -{ - switch (p_perfmgr->state) { - case PERFMGR_STATE_DISABLE: - return "Disabled"; - break; - case PERFMGR_STATE_ENABLED: - return "Enabled"; - break; - case PERFMGR_STATE_NO_DB: - return "No Database"; - break; - } - return "UNKNOWN"; -} - -inline static char *osm_perfmgr_get_sweep_state_str(osm_perfmgr_t * perfmgr) -{ - switch (perfmgr->sweep_state) { - case PERFMGR_SWEEP_SLEEP: - return "Sleeping"; - break; - case PERFMGR_SWEEP_ACTIVE: - return "Active"; - break; - case PERFMGR_SWEEP_SUSPENDED: - return "Suspended"; - break; - } - return "UNKNOWN"; -} - -inline static void osm_perfmgr_set_sweep_time_s(osm_perfmgr_t * p_perfmgr, - uint16_t time_s) -{ - p_perfmgr->sweep_time_s = time_s; - osm_sm_signal(p_perfmgr->sm, OSM_SIGNAL_PERFMGR_SWEEP); -} - -inline static uint16_t osm_perfmgr_get_sweep_time_s(osm_perfmgr_t * p_perfmgr) -{ - return p_perfmgr->sweep_time_s; -} - -void osm_perfmgr_clear_counters(osm_perfmgr_t * p_perfmgr); -void osm_perfmgr_dump_counters(osm_perfmgr_t * p_perfmgr, - perfmgr_db_dump_t dump_type); -void osm_perfmgr_print_counters(osm_perfmgr_t *pm, char *nodename, FILE *fp); - -ib_api_status_t osm_perfmgr_bind(osm_perfmgr_t * p_perfmgr, - ib_net64_t port_guid); - -void osm_perfmgr_process(osm_perfmgr_t * pm); - -/****f* OpenSM: PerfMgr/osm_perfmgr_init */ -ib_api_status_t osm_perfmgr_init(osm_perfmgr_t * perfmgr, - struct osm_opensm *osm, - const osm_subn_opt_t * p_opt); -/* -* PARAMETERS -* perfmgr -* [in] Pointer to an osm_perfmgr_t object to initialize. -* -* osm -* [in] Pointer to the OpenSM object. -* -* p_opt -* [in] Pointer to the subnet options structure. -* -* RETURN VALUES -* IB_SUCCESS if the PerfMgr object was initialized successfully. -*********/ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* ENABLE_OSM_PERF_MGR */ - -#endif /* _OSM_PERFMGR_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_perfmgr_db.h b/branches/opensm_3/user/include/opensm/osm_perfmgr_db.h deleted file mode 100644 index 58267f72..00000000 --- a/branches/opensm_3/user/include/opensm/osm_perfmgr_db.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (c) 2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2007 The Regents of the University of California. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _PERFMGR_EVENT_DB_H_ -#define _PERFMGR_EVENT_DB_H_ - -#ifdef ENABLE_OSM_PERF_MGR - -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS - -struct osm_perfmgr; -/****h* OpenSM/PerfMgr Event Database -* DESCRIPTION -* Database interface to record subnet events -* -* Implementations of this object _MUST_ be thread safe. -* -* AUTHOR -* Ira Weiny, LLNL -* -*********/ -typedef enum { - PERFMGR_EVENT_DB_SUCCESS = 0, - PERFMGR_EVENT_DB_FAIL, - PERFMGR_EVENT_DB_NOMEM, - PERFMGR_EVENT_DB_GUIDNOTFOUND, - PERFMGR_EVENT_DB_PORTNOTFOUND, - PERFMGR_EVENT_DB_NOT_IMPL -} perfmgr_db_err_t; - -/** ========================================================================= - * Port error reading - */ -typedef struct { - uint64_t symbol_err_cnt; - uint64_t link_err_recover; - uint64_t link_downed; - uint64_t rcv_err; - uint64_t rcv_rem_phys_err; - uint64_t rcv_switch_relay_err; - uint64_t xmit_discards; - uint64_t xmit_constraint_err; - uint64_t rcv_constraint_err; - uint64_t link_integrity; - uint64_t buffer_overrun; - uint64_t vl15_dropped; - time_t time; -} perfmgr_db_err_reading_t; - -/** ========================================================================= - * Port data count reading - */ -typedef struct { - uint64_t xmit_data; /* can be used for std or extended */ - uint64_t rcv_data; /* can be used for std or extended */ - uint64_t xmit_pkts; /* can be used for std or extended */ - uint64_t rcv_pkts; /* can be used for std or extended */ - uint64_t unicast_xmit_pkts; - uint64_t unicast_rcv_pkts; - uint64_t multicast_xmit_pkts; - uint64_t multicast_rcv_pkts; - time_t time; -} perfmgr_db_data_cnt_reading_t; - -/** ========================================================================= - * Dump output options - */ -typedef enum { - PERFMGR_EVENT_DB_DUMP_HR = 0, /* Human readable */ - PERFMGR_EVENT_DB_DUMP_MR /* Machine readable */ -} perfmgr_db_dump_t; - -/** ========================================================================= - * Port counter object. - * Store all the port counters for a single port. - */ -typedef struct db_port { - perfmgr_db_err_reading_t err_total; - perfmgr_db_err_reading_t err_previous; - perfmgr_db_data_cnt_reading_t dc_total; - perfmgr_db_data_cnt_reading_t dc_previous; - time_t last_reset; -} db_port_t; - -/** ========================================================================= - * group port counters for ports into the nodes - */ -#define NODE_NAME_SIZE (IB_NODE_DESCRIPTION_SIZE + 1) -typedef struct db_node { - cl_map_item_t map_item; /* must be first */ - uint64_t node_guid; - boolean_t esp0; - db_port_t *ports; - uint8_t num_ports; - char node_name[NODE_NAME_SIZE]; -} db_node_t; - -/** ========================================================================= - * all nodes in the subnet. - */ -typedef struct perfmgr_db { - cl_qmap_t pc_data; /* stores type (db_node_t *) */ - cl_plock_t lock; - struct osm_perfmgr *perfmgr; -} perfmgr_db_t; - -/** - * functions - */ -perfmgr_db_t *perfmgr_db_construct(struct osm_perfmgr *perfmgr); -void perfmgr_db_destroy(perfmgr_db_t * db); - -perfmgr_db_err_t perfmgr_db_create_entry(perfmgr_db_t * db, uint64_t guid, - boolean_t esp0, uint8_t num_ports, - char *node_name); - -perfmgr_db_err_t perfmgr_db_add_err_reading(perfmgr_db_t * db, uint64_t guid, - uint8_t port, - perfmgr_db_err_reading_t * reading); -perfmgr_db_err_t perfmgr_db_get_prev_err(perfmgr_db_t * db, uint64_t guid, - uint8_t port, - perfmgr_db_err_reading_t * reading); -perfmgr_db_err_t perfmgr_db_clear_prev_err(perfmgr_db_t * db, uint64_t guid, - uint8_t port); - -perfmgr_db_err_t perfmgr_db_add_dc_reading(perfmgr_db_t * db, uint64_t guid, - uint8_t port, - perfmgr_db_data_cnt_reading_t * - reading); -perfmgr_db_err_t perfmgr_db_get_prev_dc(perfmgr_db_t * db, uint64_t guid, - uint8_t port, - perfmgr_db_data_cnt_reading_t * - reading); -perfmgr_db_err_t perfmgr_db_clear_prev_dc(perfmgr_db_t * db, uint64_t guid, - uint8_t port); - -void perfmgr_db_clear_counters(perfmgr_db_t * db); -perfmgr_db_err_t perfmgr_db_dump(perfmgr_db_t * db, char *file, - perfmgr_db_dump_t dump_type); -void perfmgr_db_print_by_name(perfmgr_db_t * db, char *nodename, FILE *fp); -void perfmgr_db_print_by_guid(perfmgr_db_t * db, uint64_t guid, FILE *fp); - -/** ========================================================================= - * helper functions to fill in the various db objects from wire objects - */ - -void perfmgr_db_fill_err_read(ib_port_counters_t * wire_read, - perfmgr_db_err_reading_t * reading); -void perfmgr_db_fill_data_cnt_read_pc(ib_port_counters_t * wire_read, - perfmgr_db_data_cnt_reading_t * reading); -void perfmgr_db_fill_data_cnt_read_epc(ib_port_counters_ext_t * wire_read, - perfmgr_db_data_cnt_reading_t * reading); - -END_C_DECLS - -#endif /* ENABLE_OSM_PERF_MGR */ - -#endif /* _PERFMGR_PM_DB_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_pkey.h b/branches/opensm_3/user/include/opensm/osm_pkey.h deleted file mode 100644 index 28d4fa8d..00000000 --- a/branches/opensm_3/user/include/opensm/osm_pkey.h +++ /dev/null @@ -1,634 +0,0 @@ -/* - * Copyright (c) 2010 Sun Microsystems, Inc. All rights reserved. - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_PKEY_H_ -#define _OSM_PKEY_H_ - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* - Forward references. -*/ -struct osm_physp; -struct osm_port; -struct osm_subn; -struct osm_node; -struct osm_physp; - -/* - * Abstract: - * Declaration of pkey manipulation functions. - */ - -/****s* OpenSM: osm_pkey_tbl_t -* NAME -* osm_pkey_tbl_t -* -* DESCRIPTION -* This object represents a pkey table. The need for a special object -* is required to optimize search performance of a PKey in the IB standard -* non sorted table. -* -* The osm_pkey_tbl_t object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_pkeybl { - cl_ptr_vector_t blocks; - cl_ptr_vector_t new_blocks; - cl_map_t keys; - cl_qlist_t pending; - uint16_t used_blocks; - uint16_t max_blocks; -} osm_pkey_tbl_t; -/* -* FIELDS -* blocks -* The IBA defined blocks of pkey values, updated from the subnet -* -* new_blocks -* The blocks of pkey values, will be used for updates by SM -* -* keys -* A set holding all keys -* -* pending -* A list of osm_pending_pkey structs that is temporarily set by -* the pkey mgr and used during pkey mgr algorithm only -* -* used_blocks -* Tracks the number of blocks having non-zero pkeys -* -* max_blocks -* The maximal number of blocks this partition table might hold -* this value is based on node_info (for port 0 or CA) or -* switch_info updated on receiving the node_info or switch_info -* GetResp -* -* NOTES -* 'blocks' vector should be used to store pkey values obtained from -* the port and SM pkey manager should not change it directly, for this -* purpose 'new_blocks' should be used. -* -* The only pkey values stored in 'blocks' vector will be mapped with -* 'keys' map -* -*********/ - -/****s* OpenSM: osm_pending_pkey_t -* NAME -* osm_pending_pkey_t -* -* DESCRIPTION -* This objects stores temporary information on pkeys, their target block, -* and index during the pkey manager operation -* -* SYNOPSIS -*/ -typedef struct osm_pending_pkey { - cl_list_item_t list_item; - uint16_t pkey; - uint16_t block; - uint8_t index; - boolean_t is_new; -} osm_pending_pkey_t; -/* -* FIELDS -* pkey -* The actual P_Key -* -* block -* The block index based on the previous table extracted from the -* device -* -* index -* The index of the pkey within the block -* -* is_new -* TRUE for new P_Keys such that the block and index are invalid -* in that case -* -*********/ - -/****f* OpenSM: osm_pkey_tbl_construct -* NAME -* osm_pkey_tbl_construct -* -* DESCRIPTION -* Constructs the PKey table object -* -* SYNOPSIS -*/ -void osm_pkey_tbl_construct(IN osm_pkey_tbl_t * p_pkey_tbl); -/* -* p_pkey_tbl -* [in] Pointer to osm_pkey_tbl_t object. -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_pkey_tbl_init -* NAME -* osm_pkey_tbl_init -* -* DESCRIPTION -* Inits the PKey table object -* -* SYNOPSIS -*/ -ib_api_status_t osm_pkey_tbl_init(IN osm_pkey_tbl_t * p_pkey_tbl); -/* -* p_pkey_tbl -* [in] Pointer to osm_pkey_tbl_t object. -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_pkey_tbl_destroy -* NAME -* osm_pkey_tbl_destroy -* -* DESCRIPTION -* Destroys the PKey table object -* -* SYNOPSIS -*/ -void osm_pkey_tbl_destroy(IN osm_pkey_tbl_t * p_pkey_tbl); -/* -* p_pkey_tbl -* [in] Pointer to osm_pkey_tbl_t object. -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_pkey_tbl_get_num_blocks -* NAME -* osm_pkey_tbl_get_num_blocks -* -* DESCRIPTION -* Obtain the number of blocks in IB PKey table -* -* SYNOPSIS -*/ -static inline uint16_t -osm_pkey_tbl_get_num_blocks(IN const osm_pkey_tbl_t * p_pkey_tbl) -{ - return ((uint16_t) (cl_ptr_vector_get_size(&p_pkey_tbl->blocks))); -} - -/* -* p_pkey_tbl -* [in] Pointer to osm_pkey_tbl_t object. -* -* RETURN VALUES -* The IB pkey table of that pkey table element -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_pkey_tbl_block_get -* NAME -* osm_pkey_tbl_block_get -* -* DESCRIPTION -* Obtain the pointer to the IB PKey table block stored in the object -* -* SYNOPSIS -*/ -static inline ib_pkey_table_t *osm_pkey_tbl_block_get(const osm_pkey_tbl_t * - p_pkey_tbl, - uint16_t block) -{ - return ((block < cl_ptr_vector_get_size(&p_pkey_tbl->blocks)) ? - cl_ptr_vector_get(&p_pkey_tbl->blocks, block) : NULL); -}; - -/* -* p_pkey_tbl -* [in] Pointer to osm_pkey_tbl_t object. -* -* block -* [in] The block number to get -* -* RETURN VALUES -* The IB pkey table of that pkey table element -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_pkey_tbl_new_block_get -* NAME -* osm_pkey_tbl_new_block_get -* -* DESCRIPTION -* The same as above but for new block -* -* SYNOPSIS -*/ -static inline ib_pkey_table_t *osm_pkey_tbl_new_block_get(const osm_pkey_tbl_t * - p_pkey_tbl, - uint16_t block) -{ - return (block < cl_ptr_vector_get_size(&p_pkey_tbl->new_blocks)) ? - cl_ptr_vector_get(&p_pkey_tbl->new_blocks, block) : NULL; -}; - -/****f* OpenSM: osm_pkey_tbl_set_new_entry -* NAME -* osm_pkey_tbl_set_new_entry -* -* DESCRIPTION -* Stores the given pkey in the "new" blocks array and update -* the "map" to show that on the "old" blocks -* -* SYNOPSIS -*/ -ib_api_status_t -osm_pkey_tbl_set_new_entry(IN osm_pkey_tbl_t * p_pkey_tbl, - IN uint16_t block_idx, - IN uint8_t pkey_idx, IN uint16_t pkey); -/* -* p_pkey_tbl -* [in] Pointer to the PKey table -* -* block_idx -* [in] The block index to use -* -* pkey_idx -* [in] The index within the block -* -* pkey -* [in] PKey to store -* -* RETURN VALUES -* IB_SUCCESS if OK -* IB_ERROR if failed -* -*********/ - -/****f* OpenSM: osm_pkey_find_next_free_entry -* NAME -* osm_pkey_find_next_free_entry -* -* DESCRIPTION -* Find the next free entry in the PKey table starting at the given -* index and block number. The user should increment pkey_idx before -* next call -* Inspect the "new" blocks array for empty space. -* -* SYNOPSIS -*/ -boolean_t -osm_pkey_find_next_free_entry(IN osm_pkey_tbl_t * p_pkey_tbl, - OUT uint16_t * p_block_idx, - OUT uint8_t * p_pkey_idx); -/* -* p_pkey_tbl -* [in] Pointer to the PKey table -* -* p_block_idx -* [out] The block index to use -* -* p_pkey_idx -* [out] The index within the block to use -* -* RETURN VALUES -* TRUE if found -* FALSE if did not find -* -*********/ - -/****f* OpenSM: osm_pkey_tbl_init_new_blocks -* NAME -* osm_pkey_tbl_init_new_blocks -* -* DESCRIPTION -* Initializes new_blocks vector content (allocate and clear) -* -* SYNOPSIS -*/ -void osm_pkey_tbl_init_new_blocks(const osm_pkey_tbl_t * p_pkey_tbl); -/* -* p_pkey_tbl -* [in] Pointer to osm_pkey_tbl_t object. -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_pkey_tbl_get_block_and_idx -* NAME -* osm_pkey_tbl_get_block_and_idx -* -* DESCRIPTION -* Set the block index and pkey index the given -* pkey is found in. Return IB_NOT_FOUND if could -* not find it, IB_SUCCESS if OK -* -* SYNOPSIS -*/ -ib_api_status_t -osm_pkey_tbl_get_block_and_idx(IN osm_pkey_tbl_t * p_pkey_tbl, - IN uint16_t * p_pkey, - OUT uint16_t * block_idx, - OUT uint8_t * pkey_index); -/* -* p_pkey_tbl -* [in] Pointer to osm_pkey_tbl_t object. -* -* p_pkey -* [in] Pointer to the P_Key entry searched -* -* p_block_idx -* [out] Pointer to the block index to be updated -* -* p_pkey_idx -* [out] Pointer to the pkey index (in the block) to be updated -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_pkey_tbl_set -* NAME -* osm_pkey_tbl_set -* -* DESCRIPTION -* Set the PKey table block provided in the PKey object. -* -* SYNOPSIS -*/ -ib_api_status_t -osm_pkey_tbl_set(IN osm_pkey_tbl_t * p_pkey_tbl, - IN uint16_t block, IN ib_pkey_table_t * p_tbl); -/* -* p_pkey_tbl -* [in] Pointer to osm_pkey_tbl_t object. -* -* block -* [in] The block number to set -* -* p_tbl -* [in] The IB PKey block to copy to the object -* -* RETURN VALUES -* IB_SUCCESS or IB_ERROR -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_physp_share_this_pkey -* NAME -* osm_physp_share_this_pkey -* -* DESCRIPTION -* Checks if the given physical ports share the specified pkey. -* -* SYNOPSIS -*/ -boolean_t osm_physp_share_this_pkey(IN const struct osm_physp * p_physp1, - IN const struct osm_physp * p_physp2, - IN ib_net16_t pkey); -/* -* PARAMETERS -* -* p_physp1 -* [in] Pointer to an osm_physp_t object. -* -* p_physp2 -* [in] Pointer to an osm_physp_t object. -* -* pkey -* [in] value of P_Key to check. -* -* RETURN VALUES -* Returns TRUE if the two ports are matching. -* FALSE otherwise. -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_physp_find_common_pkey -* NAME -* osm_physp_find_common_pkey -* -* DESCRIPTION -* Returns first matching P_Key values for specified physical ports. -* -* SYNOPSIS -*/ -ib_net16_t osm_physp_find_common_pkey(IN const struct osm_physp *p_physp1, - IN const struct osm_physp *p_physp2); -/* -* PARAMETERS -* -* p_physp1 -* [in] Pointer to an osm_physp_t object. -* -* p_physp2 -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns value of first shared P_Key or INVALID P_Key (0x0) if not -* found. -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_physp_share_pkey -* NAME -* osm_physp_share_pkey -* -* DESCRIPTION -* Checks if the given physical ports share a pkey. -* The meaning P_Key matching: -* 10.9.3 : -* In the following, let M_P_Key(Message P_Key) be the P_Key in the incoming -* packet and E_P_Key(Endnode P_Key) be the P_Key it is being compared against -* in the packet's destination endnode. -* -* If: -* * neither M_P_Key nor E_P_Key are the invalid P_Key -* * and the low-order 15 bits of the M_P_Key match the low order 15 -* bits of the E_P_Key -* * and the high order bit(membership type) of both the M_P_Key and -* E_P_Key are not both 0 (i.e., both are not Limited members of -* the partition) -* -* then the P_Keys are said to match. -* -* SYNOPSIS -*/ -boolean_t osm_physp_share_pkey(IN osm_log_t * p_log, - IN const struct osm_physp * p_physp_1, - IN const struct osm_physp * p_physp_2); - -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_physp_1 -* [in] Pointer to an osm_physp_t object. -* -* p_physp_2 -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns TRUE if the 2 physical ports are matching. -* FALSE otherwise. -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_port_share_pkey -* NAME -* osm_port_share_pkey -* -* DESCRIPTION -* Checks if the given ports (on their default physical port) share a pkey. -* The meaning P_Key matching: -* 10.9.3 : -* In the following, let M_P_Key(Message P_Key) be the P_Key in the incoming -* packet and E_P_Key(Endnode P_Key) be the P_Key it is being compared against -* in the packet's destination endnode. -* -* If: -* * neither M_P_Key nor E_P_Key are the invalid P_Key -* * and the low-order 15 bits of the M_P_Key match the low order 15 -* bits of the E_P_Key -* * and the high order bit(membership type) of both the M_P_Key and -* E_P_Key are not both 0 (i.e., both are not Limited members of -* the partition) -* -* then the P_Keys are said to match. -* -* SYNOPSIS -*/ -boolean_t osm_port_share_pkey(IN osm_log_t * p_log, - IN const struct osm_port * p_port_1, - IN const struct osm_port * p_port_2); - -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_port_1 -* [in] Pointer to an osm_port_t object. -* -* p_port_2 -* [in] Pointer to an osm_port_t object. -* -* RETURN VALUES -* Returns TRUE if the 2 ports are matching. -* FALSE otherwise. -* -* NOTES -* -*********/ - -/****f* OpenSM: osm_physp_has_pkey -* NAME -* osm_physp_has_pkey -* -* DESCRIPTION -* Checks if the given lids and port_numbers share a pkey. -* The meaning P_Key matching: -* 10.9.3 : -* In the following, let M_P_Key(Message P_Key) be the P_Key in the incoming -* packet and E_P_Key(Endnode P_Key) be the P_Key it is being compared against -* in the packet's destination endnode. -* -* If: -* * neither M_P_Key nor E_P_Key are the invalid P_Key -* * and the low-order 15 bits of the M_P_Key match the low order 15 -* bits of the E_P_Key -* * and the high order bit(membership type) of both the M_P_Key and -* E_P_Key are not both 0 (i.e., both are not Limited members of -* the partition) -* -* then the P_Keys are said to match. -* -* SYNOPSIS -*/ -boolean_t osm_physp_has_pkey(IN osm_log_t * p_log, IN ib_net16_t pkey, - IN const struct osm_physp *p_physp); - -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* pkey -* [in] pkey number to look for. -* -* p_physp -* [in] Pointer to osm_physp_t object. -* -* RETURN VALUES -* Returns TRUE if the p_physp has the pkey given. False otherwise. -* -* NOTES -* -*********/ - -END_C_DECLS -#endif /* _OSM_PKEY_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_port.h b/branches/opensm_3/user/include/opensm/osm_port.h deleted file mode 100644 index b5999586..00000000 --- a/branches/opensm_3/user/include/opensm/osm_port.h +++ /dev/null @@ -1,1460 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of port related objects. - * These objects comprise an IBA port. - * These objects are part of the OpenSM family of objects. - */ - -#ifndef _OSM_PORT_H_ -#define _OSM_PORT_H_ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* - Forward references. -*/ -struct osm_port; -struct osm_node; -struct osm_mgrp; - -/****h* OpenSM/Physical Port -* NAME -* Physical Port -* -* DESCRIPTION -* The Physical Port object encapsulates the information needed by the -* OpenSM to manage physical ports. The OpenSM allocates one Physical Port -* per physical port in the IBA subnet. -* -* In a switch, one multiple Physical Port objects share the same port GUID. -* In an end-point, Physical Ports do not share GUID values. -* -* The Physical Port is not thread safe, thus callers must provide -* serialization. -* -* These objects should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ - -/****s* OpenSM: Physical Port/osm_physp_t -* NAME -* osm_physp_t -* -* DESCRIPTION -* This object represents a physical port on a switch, router or end-point. -* -* The osm_physp_t object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_physp { - ib_port_info_t port_info; - ib_net64_t port_guid; - uint8_t port_num; - struct osm_node *p_node; - struct osm_physp *p_remote_physp; - boolean_t healthy; - uint8_t vl_high_limit; - unsigned need_update; - unsigned is_prof_ignored; - osm_dr_path_t dr_path; - osm_pkey_tbl_t pkeys; - ib_vl_arb_table_t vl_arb[4]; - cl_ptr_vector_t slvl_by_port; - uint8_t hop_wf; -} osm_physp_t; -/* -* FIELDS -* port_info -* The IBA defined PortInfo data for this port. -* -* port_guid -* Port GUID value of this port. For switches, -* all ports share the same GUID value. -* -* port_num -* The port number of this port. The PortInfo also -* contains a port_number, but that number is not -* the port number of this port, but rather the number -* of the port that received the SMP during discovery. -* Therefore, we must keep a separate record for this -* port's port number. -* -* p_node -* Pointer to the parent Node object of this Physical Port. -* -* p_remote_physp -* Pointer to the Physical Port on the other side of the wire. -* If this pointer is NULL no link exists at this port. -* -* healthy -* Tracks the health of the port. Normally should be TRUE but -* might change as a result of incoming traps indicating the port -* healthy is questionable. -* -* vl_high_limit -* PortInfo:VLHighLimit value which installed by QoS manager -* and should be uploaded to port's PortInfo -* -* need_update -* When set indicates that port was probably reset and port -* related tables (PKey, SL2VL, VLArb) require refreshing. -* -* is_prof_ignored -* When set indicates that switch port will be ignored by -* the link load equalization algorithm. -* -* dr_path -* The directed route path to this port. -* -* pkeys -* osm_pkey_tbl_t object holding the port PKeys. -* -* vl_arb[] -* Each Physical Port has 4 sections of VL Arbitration table. -* -* slvl_by_port -* A vector of pointers to the sl2vl tables (ordered by input port). -* Switches have an entry for every other input port (inc SMA=0). -* On CAs only one per port. -* -* hop_wf -* Hop weighting factor to be used in the routing. -* -* SEE ALSO -* Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_construct -* NAME -* osm_physp_construct -* -* DESCRIPTION -* Constructs a Physical Port. -* -* SYNOPSIS -*/ -void osm_physp_construct(IN osm_physp_t * p_physp); -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object to initialize. -* -* RETURN VALUES -* This function does not return a value. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_init -* NAME -* osm_physp_init -* -* DESCRIPTION -* Initializes a Physical Port for use. -* -* SYNOPSIS -*/ -void osm_physp_init(IN osm_physp_t * p_physp, IN ib_net64_t port_guid, - IN uint8_t port_num, IN const struct osm_node *p_node, - IN osm_bind_handle_t h_bind, IN uint8_t hop_count, - IN const uint8_t * p_initial_path); -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object to initialize. -* -* port_guid -* [in] GUID value of this port. Switch ports all share -* the same value. -* Caller should use 0 if the guid is unknown. -* -* port_num -* [in] The port number of this port. -* -* p_node -* [in] Pointer to the parent Node object of this Physical Port. -* -* h_bind -* [in] Bind handle on which this port is accessed. -* Caller should use OSM_INVALID_BIND_HANDLE if the bind -* handle to this port is unknown. -* -* hop_count -* [in] Directed route hop count to reach this port. -* Caller should use 0 if the hop count is unknown. -* -* p_initial_path -* [in] Pointer to the directed route path to reach this node. -* Caller should use NULL if the path is unknown. -* -* RETURN VALUES -* This function does not return a value. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Port/void osm_physp_destroy -* NAME -* osm_physp_destroy -* -* DESCRIPTION -* This function destroys a Port object. -* -* SYNOPSIS -*/ -void osm_physp_destroy(IN osm_physp_t * p_physp); -/* -* PARAMETERS -* p_port -* [in] Pointer to a PhysPort object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified PhysPort object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to osm_physp_construct or -* osm_physp_init. -* -* SEE ALSO -* Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_is_valid -* NAME -* osm_physp_is_valid -* -* DESCRIPTION -* Returns TRUE if the Physical Port has been successfully initialized. -* FALSE otherwise. -* -* SYNOPSIS -*/ -static inline boolean_t osm_physp_is_valid(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(p_physp); - return (p_physp->port_guid != 0); -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns TRUE if the Physical Port has been successfully initialized. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_is_healthy -* NAME -* osm_physp_is_healthy -* -* DESCRIPTION -* Returns TRUE if the Physical Port has been maked as healthy -* FALSE otherwise. -* -* SYNOPSIS -*/ -static inline boolean_t osm_physp_is_healthy(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(p_physp); - return p_physp->healthy; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns TRUE if the Physical Port has been maked as healthy -* FALSE otherwise. -* All physical ports are initialized as "healthy" but may be marked -* otherwise if a received trap claims otherwise. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_link_is_healthy -* NAME -* osm_link_is_healthy -* -* DESCRIPTION -* Returns TRUE if the link given by the physical port is health, -* and FALSE otherwise. Link is healthy if both its physical ports are -* healthy -* -* SYNOPSIS -*/ -boolean_t osm_link_is_healthy(IN const osm_physp_t * p_physp); -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* TRUE if both physical ports on the link are healthy, and FALSE otherwise. -* All physical ports are initialized as "healthy" but may be marked -* otherwise if a received trap claiming otherwise. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_set_health -* NAME -* osm_physp_set_health -* -* DESCRIPTION -* Sets the port health flag. TRUE means the port is healthy and -* should be used for packet routing. FALSE means it should be avoided. -* -* SYNOPSIS -*/ -static inline void osm_physp_set_health(IN osm_physp_t * p_physp, - IN boolean_t is_healthy) -{ - CL_ASSERT(p_physp); - p_physp->healthy = is_healthy; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* is_healthy -* [in] The health value to be assigned to the port. -* TRUE if the Physical Port should been maked as healthy -* FALSE otherwise. -* -* RETURN VALUES -* NONE -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_set_port_info -* NAME -* osm_physp_set_port_info -* -* DESCRIPTION -* Copies the PortInfo attribute into the Physical Port object -* based on the PortState. -* -* SYNOPSIS -*/ -static inline void osm_physp_set_port_info(IN osm_physp_t * p_physp, - IN const ib_port_info_t * p_pi) -{ - CL_ASSERT(p_pi); - CL_ASSERT(osm_physp_is_valid(p_physp)); - - if (ib_port_info_get_port_state(p_pi) == IB_LINK_DOWN) { - /* If PortState is down, only copy PortState */ - /* and PortPhysicalState per C14-24-2.1 */ - ib_port_info_set_port_state(&p_physp->port_info, IB_LINK_DOWN); - ib_port_info_set_port_phys_state - (ib_port_info_get_port_phys_state(p_pi), - &p_physp->port_info); - } else - p_physp->port_info = *p_pi; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* p_pi -* [in] Pointer to the IBA defined PortInfo at this port number. -* -* RETURN VALUES -* This function does not return a value. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_set_pkey_tbl -* NAME -* osm_physp_set_pkey_tbl -* -* DESCRIPTION -* Copies the P_Key table into the Physical Port object. -* -* SYNOPSIS -*/ -void osm_physp_set_pkey_tbl(IN osm_log_t * p_log, IN const osm_subn_t * p_subn, - IN osm_physp_t * p_physp, - IN ib_pkey_table_t * p_pkey_tbl, - IN uint16_t block_num); -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_subn -* [in] Pointer to the subnet data structure. -* -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* p_pkey_tbl -* [in] Pointer to the IBA defined P_Key table for this port -* number. -* -* block_num -* [in] The part of the P_Key table as defined in the IBA -* (valid values 0-2047, and is further limited by the -* partitionCap). -* -* RETURN VALUES -* This function does not return a value. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_pkey_tbl -* NAME -* osm_physp_get_pkey_tbl -* -* DESCRIPTION -* Returns a pointer to the P_Key table object of the Physical Port object. -* -* SYNOPSIS -*/ -static inline const osm_pkey_tbl_t *osm_physp_get_pkey_tbl(IN const osm_physp_t - * p_physp) -{ - CL_ASSERT(osm_physp_is_valid(p_physp)); - /* - (14.2.5.7) - the block number valid values are 0-2047, and are - further limited by the size of the P_Key table specified by the - PartitionCap on the node. - */ - return &p_physp->pkeys; -}; - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* The pointer to the P_Key table object. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_set_slvl_tbl -* NAME -* osm_physp_set_slvl_tbl -* -* DESCRIPTION -* Copies the SLtoVL attribute into the Physical Port object. -* -* SYNOPSIS -*/ -static inline void osm_physp_set_slvl_tbl(IN osm_physp_t * p_physp, - IN ib_slvl_table_t * p_slvl_tbl, - IN uint8_t in_port_num) -{ - ib_slvl_table_t *p_tbl; - - CL_ASSERT(p_slvl_tbl); - CL_ASSERT(osm_physp_is_valid(p_physp)); - p_tbl = cl_ptr_vector_get(&p_physp->slvl_by_port, in_port_num); - *p_tbl = *p_slvl_tbl; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* p_slvl_tbl -* [in] Pointer to the IBA defined SLtoVL map table for this -* port number. -* -* in_port_num -* [in] Input Port Number for this SLtoVL. -* -* RETURN VALUES -* This function does not return a value. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_slvl_tbl -* NAME -* osm_physp_get_slvl_tbl -* -* DESCRIPTION -* Returns a pointer to the SLtoVL attribute of the Physical Port object. -* -* SYNOPSIS -*/ -static inline ib_slvl_table_t *osm_physp_get_slvl_tbl(IN const osm_physp_t * - p_physp, - IN uint8_t in_port_num) -{ - ib_slvl_table_t *p_tbl; - - CL_ASSERT(osm_physp_is_valid(p_physp)); - p_tbl = cl_ptr_vector_get(&p_physp->slvl_by_port, in_port_num); - return p_tbl; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* in_port_num -* [in] Input Port Number for this SLtoVL. -* -* RETURN VALUES -* The pointer to the slvl table -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_set_vla_tbl -* NAME -* osm_physp_set_vla_tbl -* -* DESCRIPTION -* Copies the VL Arbitration attribute into the Physical Port object. -* -* SYNOPSIS -*/ -static inline void osm_physp_set_vla_tbl(IN osm_physp_t * p_physp, - IN ib_vl_arb_table_t * p_vla_tbl, - IN uint8_t block_num) -{ - CL_ASSERT(p_vla_tbl); - CL_ASSERT(osm_physp_is_valid(p_physp)); - CL_ASSERT((1 <= block_num) && (block_num <= 4)); - p_physp->vl_arb[block_num - 1] = *p_vla_tbl; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* p_vla_tbl -* [in] Pointer to the IBA defined VL Arbitration table for this -* port number. -* -* block_num -* [in] The part of the VL arbitration as defined in the IBA -* (valid values 1-4) -* -* RETURN VALUES -* This function does not return a value. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_vla_tbl -* NAME -* osm_physp_get_vla_tbl -* -* DESCRIPTION -* Returns a pointer to the VL Arbitration table of the Physical Port object. -* -* SYNOPSIS -*/ -static inline ib_vl_arb_table_t *osm_physp_get_vla_tbl(IN osm_physp_t * p_physp, - IN uint8_t block_num) -{ - CL_ASSERT(osm_physp_is_valid(p_physp)); - CL_ASSERT((1 <= block_num) && (block_num <= 4)); - return &(p_physp->vl_arb[block_num - 1]); -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* block_num -* [in] The part of the VL arbitration as defined in the IBA -* (valid values 1-4) -* -* RETURN VALUES -* The pointer to the VL Arbitration table -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_remote -* NAME -* osm_physp_get_remote -* -* DESCRIPTION -* Returns a pointer to the Physical Port on the other side the wire. -* -* SYNOPSIS -*/ -static inline osm_physp_t *osm_physp_get_remote(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(osm_physp_is_valid(p_physp)); - return p_physp->p_remote_physp; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns a pointer to the Physical Port on the other side of -* the wire. A return value of NULL means there is no link at this port. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_port_guid -* NAME -* osm_physp_get_port_guid -* -* DESCRIPTION -* Returns the port guid of this physical port. -* -* SYNOPSIS -*/ -static inline ib_net64_t osm_physp_get_port_guid(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(osm_physp_is_valid(p_physp)); - return p_physp->port_guid; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns the port guid of this physical port. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_subnet_prefix -* NAME -* osm_physp_get_subnet_prefix -* -* DESCRIPTION -* Returns the subnet prefix for this physical port. -* -* SYNOPSIS -*/ -static inline ib_net64_t -osm_physp_get_subnet_prefix(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(osm_physp_is_valid(p_physp)); - return p_physp->port_info.subnet_prefix; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns the subnet prefix for this physical port. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_link_exists -* NAME -* osm_physp_link_exists -* -* DESCRIPTION -* Returns TRUE if the Physical Port has a link to the specified port. -* FALSE otherwise. -* -* SYNOPSIS -*/ -static inline boolean_t osm_physp_link_exists(IN const osm_physp_t * p_physp, - IN const osm_physp_t * p_remote_physp) -{ - CL_ASSERT(p_physp); - CL_ASSERT(osm_physp_is_valid(p_physp)); - CL_ASSERT(p_remote_physp); - CL_ASSERT(osm_physp_is_valid(p_remote_physp)); - return ((p_physp->p_remote_physp == p_remote_physp) && - (p_remote_physp->p_remote_physp == p_physp)); -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* p_remote_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns TRUE if the Physical Port has a link to another port. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_link -* NAME -* osm_physp_link -* -* DESCRIPTION -* Sets the pointers to the Physical Ports on the other side the wire. -* -* SYNOPSIS -*/ -static inline void osm_physp_link(IN osm_physp_t * p_physp, - IN osm_physp_t * p_remote_physp) -{ - CL_ASSERT(p_physp); - CL_ASSERT(p_remote_physp); - p_physp->p_remote_physp = p_remote_physp; - p_remote_physp->p_remote_physp = p_physp; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object to link. -* -* p_remote_physp -* [in] Pointer to the adjacent osm_physp_t object to link. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_unlink -* NAME -* osm_physp_unlink -* -* DESCRIPTION -* Clears the pointers to the Physical Port on the other side the wire. -* -* SYNOPSIS -*/ -static inline void osm_physp_unlink(IN osm_physp_t * p_physp, - IN osm_physp_t * p_remote_physp) -{ - CL_ASSERT(p_physp); - CL_ASSERT(p_remote_physp); - CL_ASSERT(osm_physp_link_exists(p_physp, p_remote_physp)); - p_physp->p_remote_physp = NULL; - p_remote_physp->p_remote_physp = NULL; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object to link. -* -* p_remote_physp -* [in] Pointer to the adjacent osm_physp_t object to link. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_has_any_link -* NAME -* osm_physp_has_any_link -* -* DESCRIPTION -* Returns TRUE if the Physical Port has a link to another port. -* FALSE otherwise. -* -* SYNOPSIS -*/ -static inline boolean_t osm_physp_has_any_link(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(p_physp); - if (osm_physp_is_valid(p_physp)) - return (p_physp->p_remote_physp != NULL); - else - return FALSE; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns TRUE if the Physical Port has a link to another port. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* Port, Physical Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_port_num -* NAME -* osm_physp_get_port_num -* -* DESCRIPTION -* Returns the local port number of this Physical Port. -* -* SYNOPSIS -*/ -static inline uint8_t osm_physp_get_port_num(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(p_physp); - CL_ASSERT(osm_physp_is_valid(p_physp)); - return p_physp->port_num; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns the local port number of this Physical Port. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_node_ptr -* NAME -* osm_physp_get_node_ptr -* -* DESCRIPTION -* Returns a pointer to the parent Node object for this port. -* -* SYNOPSIS -*/ -static inline struct osm_node *osm_physp_get_node_ptr(IN const osm_physp_t * - p_physp) -{ - CL_ASSERT(p_physp); - CL_ASSERT(osm_physp_is_valid(p_physp)); - return p_physp->p_node; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns a pointer to the parent Node object for this port. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_port_state -* NAME -* osm_physp_get_port_state -* -* DESCRIPTION -* Returns the port state of this Physical Port. -* -* SYNOPSIS -*/ -static inline uint8_t osm_physp_get_port_state(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(p_physp); - CL_ASSERT(osm_physp_is_valid(p_physp)); - return ib_port_info_get_port_state(&p_physp->port_info); -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns the local port number of this Physical Port. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_base_lid -* NAME -* osm_physp_get_base_lid -* -* DESCRIPTION -* Returns the base lid of this Physical Port. -* -* SYNOPSIS -*/ -static inline ib_net16_t osm_physp_get_base_lid(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(p_physp); - CL_ASSERT(osm_physp_is_valid(p_physp)); - return p_physp->port_info.base_lid; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns the base lid of this Physical Port. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_lmc -* NAME -* osm_physp_get_lmc -* -* DESCRIPTION -* Returns the LMC value of this Physical Port. -* -* SYNOPSIS -*/ -static inline uint8_t osm_physp_get_lmc(IN const osm_physp_t * p_physp) -{ - CL_ASSERT(p_physp); - CL_ASSERT(osm_physp_is_valid(p_physp)); - return ib_port_info_get_lmc(&p_physp->port_info); -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* Returns the LMC value of this Physical Port. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Physical Port/osm_physp_get_dr_path_ptr -* NAME -* osm_physp_get_dr_path_ptr -* -* DESCRIPTION -* Returns a pointer to the directed route path for this port. -* -* SYNOPSIS -*/ -static inline osm_dr_path_t *osm_physp_get_dr_path_ptr(IN const osm_physp_t * - p_physp) -{ - CL_ASSERT(p_physp); - CL_ASSERT(osm_physp_is_valid(p_physp)); - return (osm_dr_path_t *) & p_physp->dr_path; -} - -/* -* PARAMETERS -* p_physp -* [in] Pointer to a Physical Port object. -* -* RETURN VALUES -* Returns a pointer to the directed route path for this port. -* -* NOTES -* -* SEE ALSO -* Physical Port object -*********/ - -/****h* OpenSM/Port -* NAME -* Port -* -* DESCRIPTION -* The Port object encapsulates the information needed by the -* OpenSM to manage ports. The OpenSM allocates one Port object -* per port in the IBA subnet. -* -* Each Port object is associated with a single port GUID. A Port object -* contains 1 or more Physical Port objects. An end point node has -* one Physical Port per Port. A switch node has more than -* one Physical Port per Port. -* -* The Port object is not thread safe, thus callers must provide -* serialization. -* -* These objects should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ - -/****s* OpenSM: Port/osm_port_t -* NAME -* osm_port_t -* -* DESCRIPTION -* This object represents a logical port on a switch, router, or CA. -* -* The osm_port_t object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_port { - cl_map_item_t map_item; - cl_list_item_t list_item; - struct osm_node *p_node; - ib_net64_t guid; - uint32_t discovery_count; - unsigned is_new; - osm_physp_t *p_physp; - cl_qlist_t mcm_list; - int flag; - void *priv; -} osm_port_t; -/* -* FIELDS -* map_item -* Linkage structure for cl_qmap. MUST BE FIRST MEMBER! -* -* list_item -* Linkage structure for cl_qlist. Used by ucast mgr during -* LFT calculation. -* -* p_node -* Points to the Node object that owns this port. -* -* guid -* Manufacturer assigned GUID for this port. -* -* discovery_count -* The number of times this port has been discovered -* during the current fabric sweep. This number is reset -* to zero at the start of a sweep. -* -* p_physp -* The pointer to physical port used when physical -* characteristics contained in the Physical Port are needed. -* -* mcm_list -* Multicast member list -* -* flag -* Utility flag for port management -* -* SEE ALSO -* Port, Physical Port, Physical Port Table -*********/ - -/****f* OpenSM: Port/osm_port_delete -* NAME -* osm_port_delete -* -* DESCRIPTION -* This function destroys and deallocates a Port object. -* -* SYNOPSIS -*/ -void osm_port_delete(IN OUT osm_port_t ** pp_port); -/* -* PARAMETERS -* pp_port -* [in][out] Pointer to a pointer to a Port object to delete. -* On return, this pointer is NULL. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified Port object. -* -* SEE ALSO -* Port -*********/ - -/****f* OpenSM: Port/osm_port_new -* NAME -* osm_port_new -* -* DESCRIPTION -* This function allocates and initializes a Port object. -* -* SYNOPSIS -*/ -osm_port_t *osm_port_new(IN const ib_node_info_t * p_ni, - IN struct osm_node *p_parent_node); -/* -* PARAMETERS -* p_ni -* [in] Pointer to the NodeInfo attribute relavent for this port. -* -* p_parent_node -* [in] Pointer to the initialized parent osm_node_t object -* that owns this port. -* -* RETURN VALUE -* Pointer to the initialize Port object. -* -* NOTES -* Allows calling other port methods. -* -* SEE ALSO -* Port -*********/ - -/****f* OpenSM: Port/osm_port_get_base_lid -* NAME -* osm_port_get_base_lid -* -* DESCRIPTION -* Gets the base LID of a port. -* -* SYNOPSIS -*/ -static inline ib_net16_t osm_port_get_base_lid(IN const osm_port_t * p_port) -{ - CL_ASSERT(p_port->p_physp && osm_physp_is_valid(p_port->p_physp)); - return osm_physp_get_base_lid(p_port->p_physp); -} - -/* -* PARAMETERS -* p_port -* [in] Pointer to a Port object. -* -* RETURN VALUE -* Base LID of the port. -* If the return value is 0, then this port has no assigned LID. -* -* NOTES -* -* SEE ALSO -* Port -*********/ - -/****f* OpenSM: Port/osm_port_get_lmc -* NAME -* osm_port_get_lmc -* -* DESCRIPTION -* Gets the LMC value of a port. -* -* SYNOPSIS -*/ -static inline uint8_t osm_port_get_lmc(IN const osm_port_t * p_port) -{ - CL_ASSERT(p_port->p_physp && osm_physp_is_valid(p_port->p_physp)); - return osm_physp_get_lmc(p_port->p_physp); -} - -/* -* PARAMETERS -* p_port -* [in] Pointer to a Port object. -* -* RETURN VALUE -* Gets the LMC value of a port. -* -* NOTES -* -* SEE ALSO -* Port -*********/ - -/****f* OpenSM: Port/osm_port_get_guid -* NAME -* osm_port_get_guid -* -* DESCRIPTION -* Gets the GUID of a port. -* -* SYNOPSIS -*/ -static inline ib_net64_t osm_port_get_guid(IN const osm_port_t * p_port) -{ - return p_port->guid; -} - -/* -* PARAMETERS -* p_port -* [in] Pointer to a Port object. -* -* RETURN VALUE -* Manufacturer assigned GUID of the port. -* -* NOTES -* -* SEE ALSO -* Port -*********/ - -/****f* OpenSM: Port/osm_port_get_lid_range_ho -* NAME -* osm_port_get_lid_range_ho -* -* DESCRIPTION -* Returns the HOST ORDER lid min and max values for this port, -* based on the lmc value. -* -* SYNOPSIS -*/ -void osm_port_get_lid_range_ho(IN const osm_port_t * p_port, - OUT uint16_t * p_min_lid, - OUT uint16_t * p_max_lid); -/* -* PARAMETERS -* p_port -* [in] Pointer to a Port object. -* -* p_min_lid -* [out] Pointer to the minimum LID value occupied by this port. -* -* p_max_lid -* [out] Pointer to the maximum LID value occupied by this port. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -* Port -*********/ - -/****f* OpenSM: Physical Port/osm_physp_calc_link_mtu -* NAME -* osm_physp_calc_link_mtu -* -* DESCRIPTION -* Calculate the Port MTU based on current and remote -* physical ports MTU CAP values. -* -* SYNOPSIS -*/ -uint8_t osm_physp_calc_link_mtu(IN osm_log_t * p_log, - IN const osm_physp_t * p_physp); -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* The MTU of the link to be used. -* -* NOTES -* -* SEE ALSO -* PhysPort object -*********/ - -/****f* OpenSM: Physical Port/osm_physp_calc_link_op_vls -* NAME -* osm_physp_calc_link_op_vls -* -* DESCRIPTION -* Calculate the Port OP_VLS based on current and remote -* physical ports VL CAP values. Allowing user option for a max limit. -* -* SYNOPSIS -*/ -uint8_t osm_physp_calc_link_op_vls(IN osm_log_t * p_log, - IN const osm_subn_t * p_subn, - IN const osm_physp_t * p_physp); -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_subn -* [in] Pointer to the subnet object for accessing of the options. -* -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* RETURN VALUES -* The OP_VLS of the link to be used. -* -* NOTES -* -* SEE ALSO -* PhysPort object -*********/ - -/****f* OpenSM: Physical Port/osm_physp_replace_dr_path_with_alternate_dr_path -* NAME -* osm_physp_replace_dr_path_with_alternate_dr_path -* -* DESCRIPTION -* Replace the direct route path for the given phys port with an -* alternate path going through forien set of phys port. -* -* SYNOPSIS -*/ -void -osm_physp_replace_dr_path_with_alternate_dr_path(IN osm_log_t * p_log, - IN osm_subn_t const *p_subn, - IN osm_physp_t const *p_physp, - IN osm_bind_handle_t * h_bind); -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_subn -* [in] Pointer to the subnet object for accessing of the options. -* -* p_physp -* [in] Pointer to an osm_physp_t object. -* -* h_bind -* [in] Pointer to osm_bind_handle_t object. -* -* RETURN VALUES -* NONE -* -* NOTES -* -* SEE ALSO -* PhysPort object -*********/ - -END_C_DECLS -#endif /* _OSM_PORT_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_port_profile.h b/branches/opensm_3/user/include/opensm/osm_port_profile.h deleted file mode 100644 index ba08b105..00000000 --- a/branches/opensm_3/user/include/opensm/osm_port_profile.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of Switch/osm_port_profile_t. - * This object represents a port profile for an IBA switch. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_PORT_PROFILE_H_ -#define _OSM_PORT_PROFILE_H_ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Port Profile -* NAME -* Port Profile -* -* DESCRIPTION -* The Port Profile object contains profiling information for -* each Physical Port on a switch. The profile information -* may be used to optimize path selection. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Switch/osm_port_profile_t -* NAME -* osm_port_profile_t -* -* DESCRIPTION -* The Port Profile object contains profiling information for -* each Physical Port on the switch. The profile information -* may be used to optimize path selection. -* -* This object should be treated as opaque and should be -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_port_profile { - uint32_t num_paths; -} osm_port_profile_t; -/* -* FIELDS -* num_paths -* The number of paths using this port. -* -* SEE ALSO -*********/ - -/****s* OpenSM: Switch/osm_port_mask_t -* NAME -* osm_port_mask_t -* -* DESCRIPTION -* The Port Mask object contains a port numbered bit mask -* for whether the port should be ignored by the link load -* equalization algorithm. -* -* SYNOPSIS -*/ -typedef long osm_port_mask_t[32 / sizeof(long)]; -/* -* FIELDS -* osm_port_mask_t -* Bit mask by port number -* -* SEE ALSO -*********/ - -/****f* OpenSM: Port Profile/osm_port_prof_construct -* NAME -* osm_port_prof_construct -* -* DESCRIPTION -* -* -* SYNOPSIS -*/ -static inline void osm_port_prof_construct(IN osm_port_profile_t * p_prof) -{ - CL_ASSERT(p_prof); - memset(p_prof, 0, sizeof(*p_prof)); -} -/* -* PARAMETERS -* p_prof -* [in] Pointer to the Port Profile object to construct. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Port Profile/osm_port_prof_path_count_inc -* NAME -* osm_port_prof_path_count_inc -* -* DESCRIPTION -* Increments the count of the number of paths going through this port. -* -* -* SYNOPSIS -*/ -static inline void osm_port_prof_path_count_inc(IN osm_port_profile_t * p_prof) -{ - CL_ASSERT(p_prof); - p_prof->num_paths++; -} -/* -* PARAMETERS -* p_prof -* [in] Pointer to the Port Profile object. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Port Profile/osm_port_prof_path_count_get -* NAME -* osm_port_prof_path_count_get -* -* DESCRIPTION -* Returns the count of the number of paths going through this port. -* -* SYNOPSIS -*/ -static inline uint32_t -osm_port_prof_path_count_get(IN const osm_port_profile_t * p_prof) -{ - return p_prof->num_paths; -} -/* -* PARAMETERS -* p_prof -* [in] Pointer to the Port Profile object. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_PORT_PROFILE_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_prefix_route.h b/branches/opensm_3/user/include/opensm/osm_prefix_route.h deleted file mode 100644 index b2f354b3..00000000 --- a/branches/opensm_3/user/include/opensm/osm_prefix_route.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_PREFIX_ROUTE_H_ -#define _OSM_PREFIX_ROUTE_H_ - -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS - -typedef struct { - cl_list_item_t list_item; /* must be first */ - ib_net64_t prefix; /* zero means "any" */ - ib_net64_t guid; /* zero means "any" */ -} osm_prefix_route_t; - -#ifdef ROUTER_EXP -#error ROUTER_EXP is deprecated, specify prefix routes at runtime instead (see opensm man page for details) -#endif - -END_C_DECLS -#endif /* _OSM_PREFIX_ROUTE_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_qos_policy.h b/branches/opensm_3/user/include/opensm/osm_qos_policy.h deleted file mode 100644 index 864ed91c..00000000 --- a/branches/opensm_3/user/include/opensm/osm_qos_policy.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of OSM QoS Policy data types and functions. - * - * Author: - * Yevgeny Kliteynik, Mellanox - */ - -#ifndef OSM_QOS_POLICY_H -#define OSM_QOS_POLICY_H - -#include -#include -#include -#include -#include - -#define YYSTYPE char * -#define OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH 128 -#define OSM_QOS_POLICY_DEFAULT_LEVEL_NAME "default" - -#define OSM_QOS_POLICY_ULP_SDP_SERVICE_ID 0x0000000000010000ULL -#define OSM_QOS_POLICY_ULP_RDS_SERVICE_ID 0x0000000001060000ULL -#define OSM_QOS_POLICY_ULP_RDS_PORT 0x48CA -#define OSM_QOS_POLICY_ULP_ISER_SERVICE_ID 0x0000000001060000ULL -#define OSM_QOS_POLICY_ULP_ISER_PORT 0x0CBC - -#define OSM_QOS_POLICY_NODE_TYPE_CA (((uint8_t)1)< -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Remote SM -* NAME -* Remote SM -* -* DESCRIPTION -* The Remote SM object encapsulates the information tracked for -* other SM ports on the subnet. -* -* The Remote SM object is thread safe. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Remote SM/osm_remote_sm_t -* NAME -* osm_remote_sm_t -* -* DESCRIPTION -* Remote Subnet Manager structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_remote_sm { - cl_map_item_t map_item; - const osm_port_t *p_port; - ib_sm_info_t smi; -} osm_remote_sm_t; -/* -* FIELDS -* map_item -* Linkage for the cl_qmap container. MUST BE FIRST ELEMENT!! -* p_port -* Pointer to the port object for this SM. -* -* smi -* The SMInfo attribute for this SM. -* -* SEE ALSO -*********/ - -/****f* OpenSM: SM/osm_remote_sm_construct -* NAME -* osm_remote_sm_construct -* -* DESCRIPTION -* This function constructs an Remote SM object. -* -* SYNOPSIS -*/ -void osm_remote_sm_construct(IN osm_remote_sm_t * p_sm); -/* -* PARAMETERS -* p_sm -* [in] Pointer to an Remote SM object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_remote_sm_init, osm_remote_sm_destroy -* -* Calling osm_remote_sm_construct is a prerequisite to calling any other -* method except osm_remote_sm_init. -* -* SEE ALSO -* SM object, osm_remote_sm_init, osm_remote_sm_destroy -*********/ - -/****f* OpenSM: SM/osm_remote_sm_destroy -* NAME -* osm_remote_sm_destroy -* -* DESCRIPTION -* The osm_remote_sm_destroy function destroys an SM, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_remote_sm_destroy(IN osm_remote_sm_t * p_sm); -/* -* PARAMETERS -* p_sm -* [in] Pointer to an Remote SM object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified Remote SM object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to -* osm_remote_sm_construct or osm_remote_sm_init. -* -* SEE ALSO -* Remote SM object, osm_remote_sm_construct, osm_remote_sm_init -*********/ - -/****f* OpenSM: SM/osm_remote_sm_init -* NAME -* osm_remote_sm_init -* -* DESCRIPTION -* The osm_remote_sm_init function initializes an Remote SM object for use. -* -* SYNOPSIS -*/ -void osm_remote_sm_init(IN osm_remote_sm_t * p_sm, IN const osm_port_t * p_port, - IN const ib_sm_info_t * p_smi); -/* -* PARAMETERS -* p_sm -* [in] Pointer to an osm_remote_sm_t object to initialize. -* -* p_port -* [in] Pointer to the Remote SM's port object. -* -* p_smi -* [in] Pointer to the SMInfo attribute for this SM. -* -* RETURN VALUES -* This function does not return a value. -* -* NOTES -* Allows calling other Remote SM methods. -* -* SEE ALSO -* Remote SM object, osm_remote_sm_construct, osm_remote_sm_destroy -*********/ - -END_C_DECLS -#endif /* _OSM_REMOTE_SM_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_router.h b/branches/opensm_3/user/include/opensm/osm_router.h deleted file mode 100644 index 722e6015..00000000 --- a/branches/opensm_3/user/include/opensm/osm_router.h +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_router_t. - * This object represents an IBA router. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_ROUTER_H_ -#define _OSM_ROUTER_H_ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Router -* NAME -* Router -* -* DESCRIPTION -* The Router object encapsulates the information needed by the -* OpenSM to manage routers. The OpenSM allocates one router object -* per router in the IBA subnet. -* -* The Router object is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Hal Rosenstock, Voltaire -* -*********/ -/****s* OpenSM: Router/osm_router_t -* NAME -* osm_router_t -* -* DESCRIPTION -* Router structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_router { - cl_map_item_t map_item; - osm_port_t *p_port; -} osm_router_t; -/* -* FIELDS -* map_item -* Linkage structure for cl_qmap. MUST BE FIRST MEMBER! -* -* p_port -* Pointer to the Port object for this router. -* -* SEE ALSO -* Router object -*********/ - -/****f* OpenSM: Router/osm_router_delete -* NAME -* osm_router_delete -* -* DESCRIPTION -* Destroys and deallocates the object. -* -* SYNOPSIS -*/ -void osm_router_delete(IN OUT osm_router_t ** pp_rtr); -/* -* PARAMETERS -* p_rtr -* [in] Pointer to the object to destroy. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -* Router object, osm_router_new -*********/ - -/****f* OpenSM: Router/osm_router_new -* NAME -* osm_router_new -* -* DESCRIPTION -* The osm_router_new function initializes a Router object for use. -* -* SYNOPSIS -*/ -osm_router_t *osm_router_new(IN osm_port_t * p_port); -/* -* PARAMETERS -* p_node -* [in] Pointer to the node object of this router -* -* RETURN VALUES -* Pointer to the new initialized router object. -* -* NOTES -* -* SEE ALSO -* Router object, osm_router_new -*********/ - -/****f* OpenSM: Router/osm_router_get_port_ptr -* NAME -* osm_router_get_port_ptr -* -* DESCRIPTION -* Returns a pointer to the Port object for this router. -* -* SYNOPSIS -*/ -static inline osm_port_t *osm_router_get_port_ptr(IN const osm_router_t * p_rtr) -{ - return p_rtr->p_port; -} - -/* -* PARAMETERS -* p_rtr -* [in] Pointer to an osm_router_t object. -* -* RETURN VALUES -* Returns a pointer to the Port object for this router. -* -* NOTES -* -* SEE ALSO -* Router object -*********/ - -/****f* OpenSM: Router/osm_router_get_node_ptr -* NAME -* osm_router_get_node_ptr -* -* DESCRIPTION -* Returns a pointer to the Node object for this router. -* -* SYNOPSIS -*/ -static inline osm_node_t *osm_router_get_node_ptr(IN const osm_router_t * p_rtr) -{ - return p_rtr->p_port->p_node; -} - -/* -* PARAMETERS -* p_rtr -* [in] Pointer to an osm_router_t object. -* -* RETURN VALUES -* Returns a pointer to the Node object for this router. -* -* NOTES -* -* SEE ALSO -* Router object -*********/ - -END_C_DECLS -#endif /* _OSM_ROUTER_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_sa.h b/branches/opensm_3/user/include/opensm/osm_sa.h deleted file mode 100644 index ccaddd24..00000000 --- a/branches/opensm_3/user/include/opensm/osm_sa.h +++ /dev/null @@ -1,495 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_sa_t. - * This object represents an IBA subnet. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_SA_H_ -#define _OSM_SA_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/SA -* NAME -* SA -* -* DESCRIPTION -* The SA object encapsulates the information needed by the -* OpenSM to instantiate a subnet administrator. The OpenSM allocates -* one SA object per subnet manager. -* -* The SA object is thread safe. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* AUTHOR -* Ranjit Pandit, Intel -* Anil Keshavamurthy, Intel -* -*********/ -/****d* OpenSM: SA/osm_sa_state_t -* NAME -* osm_sa_state_t -* -* DESCRIPTION -* Enumerates the possible states of SA object. -* -* SYNOPSIS -*/ -typedef enum _osm_sa_state { - OSM_SA_STATE_INIT = 0, - OSM_SA_STATE_READY -} osm_sa_state_t; -/***********/ - -/****s* OpenSM: SM/osm_sa_t -* NAME -* osm_sa_t -* -* DESCRIPTION -* Subnet Administration structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_sa { - osm_sa_state_t state; - osm_sm_t *sm; - osm_subn_t *p_subn; - osm_vendor_t *p_vendor; - osm_log_t *p_log; - osm_mad_pool_t *p_mad_pool; - cl_dispatcher_t *p_disp; - cl_plock_t *p_lock; - atomic32_t sa_trans_id; - osm_sa_mad_ctrl_t mad_ctrl; - cl_timer_t sr_timer; - boolean_t dirty; - cl_disp_reg_handle_t cpi_disp_h; - cl_disp_reg_handle_t nr_disp_h; - cl_disp_reg_handle_t pir_disp_h; - cl_disp_reg_handle_t gir_disp_h; - cl_disp_reg_handle_t lr_disp_h; - cl_disp_reg_handle_t pr_disp_h; - cl_disp_reg_handle_t smir_disp_h; - cl_disp_reg_handle_t mcmr_disp_h; - cl_disp_reg_handle_t sr_disp_h; -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - cl_disp_reg_handle_t mpr_disp_h; -#endif - cl_disp_reg_handle_t infr_disp_h; - cl_disp_reg_handle_t infir_disp_h; - cl_disp_reg_handle_t vlarb_disp_h; - cl_disp_reg_handle_t slvl_disp_h; - cl_disp_reg_handle_t pkey_disp_h; - cl_disp_reg_handle_t lft_disp_h; - cl_disp_reg_handle_t sir_disp_h; - cl_disp_reg_handle_t mft_disp_h; -} osm_sa_t; -/* -* FIELDS -* state -* State of this SA object -* -* sm -* Pointer to the Subnet Manager object. -* -* p_subn -* Pointer to the Subnet object for this subnet. -* -* p_vendor -* Pointer to the vendor specific interfaces object. -* -* p_log -* Pointer to the log object. -* -* p_mad_pool -* Pointer to the MAD pool. -* -* p_disp -* Pointer to dispatcher -* -* p_lock -* Pointer to Lock for serialization -* -* sa_trans_id -* Transaction ID -* -* mad_ctrl -* Mad Controller -* -* dirty -* A flag that denotes that SA DB is dirty and needs -* to be written to the dump file (if dumping is enabled) -* -* SEE ALSO -* SM object -*********/ - -/****f* OpenSM: SA/osm_sa_construct -* NAME -* osm_sa_construct -* -* DESCRIPTION -* This function constructs an SA object. -* -* SYNOPSIS -*/ -void osm_sa_construct(IN osm_sa_t * p_sa); -/* -* PARAMETERS -* p_sa -* [in] Pointer to a SA object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_sa_destroy. -* -* Calling osm_sa_construct is a prerequisite to calling any other -* method except osm_sa_init. -* -* SEE ALSO -* SA object, osm_sa_init, osm_sa_destroy -*********/ - -/****f* OpenSM: SA/osm_sa_shutdown -* NAME -* osm_sa_shutdown -* -* DESCRIPTION -* The osm_sa_shutdown function shutdowns an SA, unregistering from all -* dispatcher messages and unbinding the QP1 mad service -* -* SYNOPSIS -*/ -void osm_sa_shutdown(IN osm_sa_t * p_sa); -/* -* PARAMETERS -* p_sa -* [in] Pointer to a SA object to shutdown. -* -* RETURN VALUE -* This function does not return a value. -* -* SEE ALSO -* SA object, osm_sa_construct, osm_sa_init -*********/ - -/****f* OpenSM: SA/osm_sa_destroy -* NAME -* osm_sa_destroy -* -* DESCRIPTION -* The osm_sa_destroy function destroys an SA, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_sa_destroy(IN osm_sa_t * p_sa); -/* -* PARAMETERS -* p_sa -* [in] Pointer to a SA object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified SA object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to osm_sa_construct or -* osm_sa_init. -* -* SEE ALSO -* SA object, osm_sa_construct, osm_sa_init -*********/ - -/****f* OpenSM: SA/osm_sa_init -* NAME -* osm_sa_init -* -* DESCRIPTION -* The osm_sa_init function initializes a SA object for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sa_init(IN osm_sm_t * p_sm, IN osm_sa_t * p_sa, - IN osm_subn_t * p_subn, IN osm_vendor_t * p_vendor, - IN osm_mad_pool_t * p_mad_pool, - IN osm_log_t * p_log, IN osm_stats_t * p_stats, - IN cl_dispatcher_t * p_disp, - IN cl_plock_t * p_lock); -/* -* PARAMETERS -* p_sa -* [in] Pointer to an osm_sa_t object to initialize. -* -* p_subn -* [in] Pointer to the Subnet object for this subnet. -* -* p_vendor -* [in] Pointer to the vendor specific interfaces object. -* -* p_mad_pool -* [in] Pointer to the MAD pool. -* -* p_log -* [in] Pointer to the log object. -* -* p_stats -* [in] Pointer to the statistics object. -* -* p_disp -* [in] Pointer to the OpenSM central Dispatcher. -* -* p_lock -* [in] Pointer to the OpenSM serializing lock. -* -* RETURN VALUES -* CL_SUCCESS if the SA object was initialized successfully. -* -* NOTES -* Allows calling other SA methods. -* -* SEE ALSO -* SA object, osm_sa_construct, osm_sa_destroy -*********/ - -/****f* OpenSM: SA/osm_sa_bind -* NAME -* osm_sa_bind -* -* DESCRIPTION -* Binds the SA object to a port guid. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sa_bind(IN osm_sa_t * p_sa, IN ib_net64_t port_guid); -/* -* PARAMETERS -* p_sa -* [in] Pointer to an osm_sa_t object to bind. -* -* port_guid -* [in] Local port GUID with which to bind. -* -* -* RETURN VALUES -* None -* -* NOTES -* A given SA object can only be bound to one port at a time. -* -* SEE ALSO -*********/ - -/****f* OpenSM: SA/osm_sa_send -* NAME -* osm_sa_send -* -* DESCRIPTION -* Sends SA MAD via osm_vendor_send and maintains the QP1 sent statistic -* -* SYNOPSIS -*/ -ib_api_status_t osm_sa_send(osm_sa_t *sa, IN osm_madw_t * p_madw, - IN boolean_t resp_expected); - -/****f* IBA Base: Types/osm_sa_send_error -* NAME -* osm_sa_send_error -* -* DESCRIPTION -* Sends a generic SA response with the specified error status. -* The payload is simply replicated from the request MAD. -* -* SYNOPSIS -*/ -void osm_sa_send_error(IN osm_sa_t * sa, IN const osm_madw_t * p_madw, - IN ib_net16_t sa_status); -/* -* PARAMETERS -* sa -* [in] Pointer to an osm_sa_t object. -* -* p_madw -* [in] Original MAD to which the response must be sent. -* -* sa_status -* [in] Status to send in the response. -* -* RETURN VALUES -* None. -* -* SEE ALSO -* SA object -*********/ - -/****f* OpenSM: SA/osm_sa_respond -* NAME -* osm_sa_respond -* -* DESCRIPTION -* Sends SA MAD response -*/ -void osm_sa_respond(osm_sa_t *sa, osm_madw_t *madw, size_t attr_size, - cl_qlist_t *list); -/* -* PARAMETERS -* sa -* [in] Pointer to an osm_sa_t object. -* -* p_madw -* [in] Original MAD to which the response must be sent. -* -* attr_size -* [in] Size of this SA attribute. -* -* list -* [in] List of attribute to respond - it will be freed after -* sending. -* -* RETURN VALUES -* None. -* -* SEE ALSO -* SA object -*********/ - -struct osm_opensm; -/****f* OpenSM: SA/osm_sa_db_file_dump -* NAME -* osm_sa_db_file_dump -* -* DESCRIPTION -* Dumps the SA DB to the dump file. -* -* SYNOPSIS -*/ -int osm_sa_db_file_dump(struct osm_opensm *p_osm); -/* -* PARAMETERS -* p_osm -* [in] Pointer to an osm_opensm_t object. -* -* RETURN VALUES -* 0 if the SA DB was actually dumped -* >0 if there was no need to dump the SA DB -* <0 if some error occurred. -* -*********/ - -/****f* OpenSM: SA/osm_sa_db_file_load -* NAME -* osm_sa_db_file_load -* -* DESCRIPTION -* Loads SA DB from the file. -* -* SYNOPSIS -*/ -int osm_sa_db_file_load(struct osm_opensm *p_osm); -/* -* PARAMETERS -* p_osm -* [in] Pointer to an osm_opensm_t object. -* -* RETURN VALUES -* 0 on success, other value on failure. -* -*********/ - -/****f* OpenSM: MC Member Record Receiver/osm_mcmr_rcv_find_or_create_new_mgrp -* NAME -* osm_mcmr_rcv_find_or_create_new_mgrp -* -* DESCRIPTION -* Create new Multicast group -* -* SYNOPSIS -*/ - -ib_api_status_t -osm_mcmr_rcv_find_or_create_new_mgrp(IN osm_sa_t * sa, IN ib_net64_t comp_mask, - IN ib_member_rec_t * p_recvd_mcmember_rec, - OUT osm_mgrp_t ** pp_mgrp); -/* -* PARAMETERS -* p_sa -* [in] Pointer to an osm_sa_t object. -* p_recvd_mcmember_rec -* [in] Received Multicast member record -* -* pp_mgrp -* [out] pointer the osm_mgrp_t object -* -* RETURN VALUES -* IB_SUCCESS, IB_ERROR -* -*********/ - -END_C_DECLS -#endif /* _OSM_SA_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_sa_mad_ctrl.h b/branches/opensm_3/user/include/opensm/osm_sa_mad_ctrl.h deleted file mode 100644 index 0d57db27..00000000 --- a/branches/opensm_3/user/include/opensm/osm_sa_mad_ctrl.h +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_sa_mad_ctrl_t. - * This object represents a controller that receives the IBA SA - * attributes from a node. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_SA_MAD_CTRL_H_ -#define _OSM_SA_MAD_CTRL_H_ - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/SA MAD Controller -* NAME -* SA MAD Controller -* -* DESCRIPTION -* The SA MAD Controller object encapsulates -* the information needed to receive MADs from the transport layer. -* -* The SA MAD Controller object is thread safe. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Ranjit Pandit, Intel -* -*********/ - -struct osm_sa; -/****s* OpenSM: SA MAD Controller/osm_sa_mad_ctrl_t -* NAME -* osm_sa_mad_ctrl_t -* -* DESCRIPTION -* SA MAD Controller structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_sa_mad_ctrl { - struct osm_sa *sa; - osm_log_t *p_log; - osm_mad_pool_t *p_mad_pool; - osm_vendor_t *p_vendor; - osm_bind_handle_t h_bind; - cl_dispatcher_t *p_disp; - cl_disp_reg_handle_t h_disp; - osm_stats_t *p_stats; - osm_subn_t *p_subn; -} osm_sa_mad_ctrl_t; -/* -* FIELDS -* sa -* Pointer to the SA object. -* -* p_log -* Pointer to the log object. -* -* p_mad_pool -* Pointer to the MAD pool. -* -* p_vendor -* Pointer to the vendor specific interfaces object. -* -* h_bind -* Bind handle returned by the transport layer. -* -* p_disp -* Pointer to the Dispatcher. -* -* h_disp -* Handle returned from dispatcher registration. -* -* p_stats -* Pointer to the OpenSM statistics block. -* -* SEE ALSO -* SA MAD Controller object -* SA MADr object -*********/ - -/****f* OpenSM: SA MAD Controller/osm_sa_mad_ctrl_construct -* NAME -* osm_sa_mad_ctrl_construct -* -* DESCRIPTION -* This function constructs a SA MAD Controller object. -* -* SYNOPSIS -*/ -void osm_sa_mad_ctrl_construct(IN osm_sa_mad_ctrl_t * p_ctrl); -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to a SA MAD Controller -* object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_sa_mad_ctrl_init, and osm_sa_mad_ctrl_destroy. -* -* Calling osm_sa_mad_ctrl_construct is a prerequisite to calling any other -* method except osm_sa_mad_ctrl_init. -* -* SEE ALSO -* SA MAD Controller object, osm_sa_mad_ctrl_init, -* osm_sa_mad_ctrl_destroy -*********/ - -/****f* OpenSM: SA MAD Controller/osm_sa_mad_ctrl_destroy -* NAME -* osm_sa_mad_ctrl_destroy -* -* DESCRIPTION -* The osm_sa_mad_ctrl_destroy function destroys the object, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_sa_mad_ctrl_destroy(IN osm_sa_mad_ctrl_t * p_ctrl); -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to the object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified -* SA MAD Controller object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to -* osm_sa_mad_ctrl_construct or osm_sa_mad_ctrl_init. -* -* SEE ALSO -* SA MAD Controller object, osm_sa_mad_ctrl_construct, -* osm_sa_mad_ctrl_init -*********/ - -/****f* OpenSM: SA MAD Controller/osm_sa_mad_ctrl_init -* NAME -* osm_sa_mad_ctrl_init -* -* DESCRIPTION -* The osm_sa_mad_ctrl_init function initializes a -* SA MAD Controller object for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sa_mad_ctrl_init(IN osm_sa_mad_ctrl_t * p_ctrl, - IN struct osm_sa * sa, - IN osm_mad_pool_t * p_mad_pool, - IN osm_vendor_t * p_vendor, - IN osm_subn_t * p_subn, - IN osm_log_t * p_log, - IN osm_stats_t * p_stats, - IN cl_dispatcher_t * p_disp); -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to an osm_sa_mad_ctrl_t object to initialize. -* -* sa -* [in] Pointer to the SA object. -* -* p_mad_pool -* [in] Pointer to the MAD pool. -* -* p_vendor -* [in] Pointer to the vendor specific interfaces object. -* -* p_log -* [in] Pointer to the log object. -* -* p_stats -* [in] Pointer to the OpenSM stastics block. -* -* p_disp -* [in] Pointer to the OpenSM central Dispatcher. -* -* RETURN VALUES -* IB_SUCCESS if the SA MAD Controller object was initialized -* successfully. -* -* NOTES -* Allows calling other SA MAD Controller methods. -* -* SEE ALSO -* SA MAD Controller object, osm_sa_mad_ctrl_construct, -* osm_sa_mad_ctrl_destroy -*********/ - -/****f* OpenSM: SA/osm_sa_mad_ctrl_bind -* NAME -* osm_sa_mad_ctrl_bind -* -* DESCRIPTION -* Binds the SA MAD Controller object to a port guid. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sa_mad_ctrl_bind(IN osm_sa_mad_ctrl_t * p_ctrl, - IN ib_net64_t port_guid); -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to an osm_sa_mad_ctrl_t object to initialize. -* -* port_guid -* [in] Local port GUID with which to bind. -* -* -* RETURN VALUES -* None -* -* NOTES -* A given SA MAD Controller object can only be bound to one -* port at a time. -* -* SEE ALSO -*********/ - -/****f* OpenSM: SA/osm_sa_mad_ctrl_unbind -* NAME -* osm_sa_mad_ctrl_unbind -* -* DESCRIPTION -* Un-Binds the SA MAD Controller object from the IB port -* -* SYNOPSIS -*/ -ib_api_status_t osm_sa_mad_ctrl_unbind(IN osm_sa_mad_ctrl_t * p_ctrl); -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to an osm_sa_mad_ctrl_t object to initialize. -* -* RETURN VALUES -* None -* -* NOTES -* A given SA MAD Controller should be previously bound to IB -* port. -* -* SEE ALSO -*********/ - -/****f* OpenSM: SA/osm_sa_mad_ctrl_get_bind_handle -* NAME -* osm_sa_mad_ctrl_get_bind_handle -* -* DESCRIPTION -* Returns the bind handle. -* -* SYNOPSIS -*/ -static inline osm_bind_handle_t -osm_sa_mad_ctrl_get_bind_handle(IN const osm_sa_mad_ctrl_t * p_ctrl) -{ - return p_ctrl->h_bind; -} - -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to an osm_sa_mad_ctrl_t object. -* -* RETURN VALUES -* Returns the bind handle, which may be OSM_BIND_INVALID_HANDLE -* if no port has been bound. -* -* NOTES -* A given SA MAD Controller object can only be bound to one -* port at a time. -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_SA_MAD_CTRL_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_service.h b/branches/opensm_3/user/include/opensm/osm_service.h deleted file mode 100644 index fa8c31dd..00000000 --- a/branches/opensm_3/user/include/opensm/osm_service.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_SVCR_H_ -#define _OSM_SVCR_H_ - -/* - * Abstract: - * Declaration of osm_service_rec_t. - * This object represents an IBA Service Record. - * This object is part of the OpenSM family of objects. - */ - -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Service Record -* NAME -* Service Record -* -* DESCRIPTION -* The service record encapsulates the information needed by the -* SA to manage service registrations. -* -* The service records is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Anil S Keshavamurthy, Intel -* -*********/ -/****s* OpenSM: Service Record/osm_svcr_t -* NAME -* osm_svcr_t -* -* DESCRIPTION -* Service Record structure. -* -* The osm_svcr_t object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_svcr { - cl_list_item_t list_item; - ib_service_record_t service_record; - uint32_t modified_time; - uint32_t lease_period; -} osm_svcr_t; -/* -* FIELDS -* map_item -* Map Item for qmap linkage. Must be first element!! -* -* svc_rec -* IB Service record structure -* -* modified_time -* Last modified time of this record in milliseconds -* -* lease_period -* Remaining lease period for this record -* -* -* SEE ALSO -*********/ - -/****f* OpenSM: Service Record/osm_svcr_new -* NAME -* osm_svcr_new -* -* DESCRIPTION -* Allocates and initializes a Service Record for use. -* -* SYNOPSIS -*/ -osm_svcr_t *osm_svcr_new(IN const ib_service_record_t * p_svc_rec); -/* -* PARAMETERS -* p_svc_rec -* [in] Pointer to IB Service Record -* -* RETURN VALUES -* pointer to osm_svcr_t structure. -* -* NOTES -* Allows calling other service record methods. -* -* SEE ALSO -* Service Record, osm_svcr_delete -*********/ - -/****f* OpenSM: Service Record/osm_svcr_init -* NAME -* osm_svcr_init -* -* DESCRIPTION -* Initializes the osm_svcr_t structure. -* -* SYNOPSIS -*/ -void osm_svcr_init(IN osm_svcr_t * p_svcr, - IN const ib_service_record_t * p_svc_rec); -/* -* PARAMETERS -* p_svc_rec -* [in] Pointer to osm_svcr_t structure -* p_svc_rec -* [in] Pointer to the ib_service_record_t -* -* SEE ALSO -* Service Record -*********/ - -/****f* OpenSM: Service Record/osm_svcr_delete -* NAME -* osm_svcr_delete -* -* DESCRIPTION -* Deallocates the osm_svcr_t structure. -* -* SYNOPSIS -*/ -void osm_svcr_delete(IN osm_svcr_t * p_svcr); -/* -* PARAMETERS -* p_svc_rec -* [in] Pointer to osm_svcr_t structure -* -* SEE ALSO -* Service Record, osm_svcr_new -*********/ - -osm_svcr_t *osm_svcr_get_by_rid(IN osm_subn_t const *p_subn, - IN osm_log_t * p_log, - IN ib_service_record_t * p_svc_rec); - -void osm_svcr_insert_to_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log, - IN osm_svcr_t * p_svcr); -void osm_svcr_remove_from_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log, - IN osm_svcr_t * p_svcr); - -END_C_DECLS -#endif /* _OSM_SVCR_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_sm.h b/branches/opensm_3/user/include/opensm/osm_sm.h deleted file mode 100644 index eeff0d51..00000000 --- a/branches/opensm_3/user/include/opensm/osm_sm.h +++ /dev/null @@ -1,739 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_sm_t. - * This object represents an IBA subnet. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_SM_H_ -#define _OSM_SM_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/SM -* NAME -* SM -* -* DESCRIPTION -* The SM object encapsulates the information needed by the -* OpenSM to instantiate a subnet manager. The OpenSM allocates -* one SM object per subnet manager. -* -* The SM object is thread safe. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: SM/osm_sm_t -* NAME -* osm_sm_t -* -* DESCRIPTION -* Subnet Manager structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_sm { - osm_thread_state_t thread_state; - unsigned signal_mask; - cl_spinlock_t signal_lock; - cl_spinlock_t state_lock; - cl_event_t signal_event; - cl_event_t subnet_up_event; - cl_timer_t sweep_timer; - cl_timer_t polling_timer; - cl_event_wheel_t trap_aging_tracker; - cl_thread_t sweeper; - unsigned master_sm_found; - uint32_t retry_number; - ib_net64_t master_sm_guid; - osm_remote_sm_t *p_polling_sm; - osm_subn_t *p_subn; - osm_db_t *p_db; - osm_vendor_t *p_vendor; - osm_log_t *p_log; - osm_mad_pool_t *p_mad_pool; - osm_vl15_t *p_vl15; - cl_dispatcher_t *p_disp; - cl_plock_t *p_lock; - atomic32_t sm_trans_id; - unsigned mlids_req_max; - uint8_t *mlids_req; - osm_sm_mad_ctrl_t mad_ctrl; - osm_lid_mgr_t lid_mgr; - osm_ucast_mgr_t ucast_mgr; - cl_disp_reg_handle_t sweep_fail_disp_h; - cl_disp_reg_handle_t ni_disp_h; - cl_disp_reg_handle_t pi_disp_h; - cl_disp_reg_handle_t nd_disp_h; - cl_disp_reg_handle_t si_disp_h; - cl_disp_reg_handle_t lft_disp_h; - cl_disp_reg_handle_t mft_disp_h; - cl_disp_reg_handle_t sm_info_disp_h; - cl_disp_reg_handle_t trap_disp_h; - cl_disp_reg_handle_t slvl_disp_h; - cl_disp_reg_handle_t vla_disp_h; - cl_disp_reg_handle_t pkey_disp_h; -} osm_sm_t; -/* -* FIELDS -* p_subn -* Pointer to the Subnet object for this subnet. -* -* p_db -* Pointer to the database (persistency) object -* -* p_vendor -* Pointer to the vendor specific interfaces object. -* -* p_log -* Pointer to the log object. -* -* p_mad_pool -* Pointer to the MAD pool. -* -* p_vl15 -* Pointer to the VL15 interface. -* -* mad_ctrl -* MAD Controller. -* -* p_disp -* Pointer to the Dispatcher. -* -* p_lock -* Pointer to the serializing lock. -* -* SEE ALSO -* SM object -*********/ - -/****f* OpenSM: SM/osm_sm_construct -* NAME -* osm_sm_construct -* -* DESCRIPTION -* This function constructs an SM object. -* -* SYNOPSIS -*/ -void osm_sm_construct(IN osm_sm_t * p_sm); -/* -* PARAMETERS -* p_sm -* [in] Pointer to a SM object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_sm_init, osm_sm_destroy -* -* Calling osm_sm_construct is a prerequisite to calling any other -* method except osm_sm_init. -* -* SEE ALSO -* SM object, osm_sm_init, osm_sm_destroy -*********/ - -/****f* OpenSM: SM/osm_sm_shutdown -* NAME -* osm_sm_shutdown -* -* DESCRIPTION -* The osm_sm_shutdown function shutdowns an SM, stopping the sweeper -* and unregistering all messages from the dispatcher -* -* SYNOPSIS -*/ -void osm_sm_shutdown(IN osm_sm_t * p_sm); -/* -* PARAMETERS -* p_sm -* [in] Pointer to a SM object to shutdown. -* -* RETURN VALUE -* This function does not return a value. -* -* SEE ALSO -* SM object, osm_sm_construct, osm_sm_init -*********/ - -/****f* OpenSM: SM/osm_sm_destroy -* NAME -* osm_sm_destroy -* -* DESCRIPTION -* The osm_sm_destroy function destroys an SM, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_sm_destroy(IN osm_sm_t * p_sm); -/* -* PARAMETERS -* p_sm -* [in] Pointer to a SM object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified SM object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to osm_sm_construct or -* osm_sm_init. -* -* SEE ALSO -* SM object, osm_sm_construct, osm_sm_init -*********/ - -/****f* OpenSM: SM/osm_sm_init -* NAME -* osm_sm_init -* -* DESCRIPTION -* The osm_sm_init function initializes a SM object for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sm_init(IN osm_sm_t * p_sm, IN osm_subn_t * p_subn, - IN osm_db_t * p_db, IN osm_vendor_t * p_vendor, - IN osm_mad_pool_t * p_mad_pool, - IN osm_vl15_t * p_vl15, IN osm_log_t * p_log, - IN osm_stats_t * p_stats, - IN cl_dispatcher_t * p_disp, IN cl_plock_t * p_lock); -/* -* PARAMETERS -* p_sm -* [in] Pointer to an osm_sm_t object to initialize. -* -* p_subn -* [in] Pointer to the Subnet object for this subnet. -* -* p_vendor -* [in] Pointer to the vendor specific interfaces object. -* -* p_mad_pool -* [in] Pointer to the MAD pool. -* -* p_vl15 -* [in] Pointer to the VL15 interface. -* -* p_log -* [in] Pointer to the log object. -* -* p_stats -* [in] Pointer to the statistics object. -* -* p_disp -* [in] Pointer to the OpenSM central Dispatcher. -* -* p_lock -* [in] Pointer to the OpenSM serializing lock. -* -* RETURN VALUES -* IB_SUCCESS if the SM object was initialized successfully. -* -* NOTES -* Allows calling other SM methods. -* -* SEE ALSO -* SM object, osm_sm_construct, osm_sm_destroy -*********/ - -/****f* OpenSM: SM/osm_sm_signal -* NAME -* osm_sm_signal -* -* DESCRIPTION -* Signal event to SM -* -* SYNOPSIS -*/ -void osm_sm_signal(IN osm_sm_t * p_sm, osm_signal_t signal); -/* -* PARAMETERS -* p_sm -* [in] Pointer to an osm_sm_t object. -* -* signal -* [in] sm signal number. -* -* NOTES -* -* SEE ALSO -* SM object -*********/ - -/****f* OpenSM: SM/osm_sm_sweep -* NAME -* osm_sm_sweep -* -* DESCRIPTION -* Initiates a subnet sweep. -* -* SYNOPSIS -*/ -void osm_sm_sweep(IN osm_sm_t * p_sm); -/* -* PARAMETERS -* p_sm -* [in] Pointer to an osm_sm_t object. -* -* RETURN VALUES -* IB_SUCCESS if the sweep completed successfully. -* -* NOTES -* -* SEE ALSO -* SM object -*********/ - -/****f* OpenSM: SM/osm_sm_bind -* NAME -* osm_sm_bind -* -* DESCRIPTION -* Binds the sm object to a port guid. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sm_bind(IN osm_sm_t * p_sm, IN ib_net64_t port_guid); -/* -* PARAMETERS -* p_sm -* [in] Pointer to an osm_sm_t object to bind. -* -* port_guid -* [in] Local port GUID with which to bind. -* -* -* RETURN VALUES -* None -* -* NOTES -* A given SM object can only be bound to one port at a time. -* -* SEE ALSO -*********/ - -/****f* OpenSM: SM/osm_req_get -* NAME -* osm_req_get -* -* DESCRIPTION -* Starts the process to transmit a directed route request for -* the attribute. -* -* SYNOPSIS -*/ -ib_api_status_t osm_req_get(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path, - IN ib_net16_t attr_id, IN ib_net32_t attr_mod, - IN cl_disp_msgid_t err_msg, - IN const osm_madw_context_t * p_context); -/* -* PARAMETERS -* sm -* [in] Pointer to an osm_sm_t object. -* -* p_path -* [in] Pointer to the directed route path to the node -* from which to retrieve the attribute. -* -* attr_id -* [in] Attribute ID to request. -* -* attr_mod -* [in] Attribute modifier for this request. -* -* err_msg -* [in] Message id with which to post this MAD if an error occurs. -* -* p_context -* [in] Mad wrapper context structure to be copied into the wrapper -* context, and thus visible to the recipient of the response. -* -* RETURN VALUES -* IB_SUCCESS if the request was successful. -* -* NOTES -* This function asynchronously requests the specified attribute. -* The response from the node will be routed through the Dispatcher -* to the appropriate receive controller object. -*********/ -/****f* OpenSM: SM/osm_req_set -* NAME -* osm_req_set -* -* DESCRIPTION -* Starts the process to transmit a directed route Set() request. -* -* SYNOPSIS -*/ -ib_api_status_t osm_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path, - IN const uint8_t * p_payload, - IN size_t payload_size, IN ib_net16_t attr_id, - IN ib_net32_t attr_mod, IN cl_disp_msgid_t err_msg, - IN const osm_madw_context_t * p_context); -/* -* PARAMETERS -* sm -* [in] Pointer to an osm_sm_t object. -* -* p_path -* [in] Pointer to the directed route path of the recipient. -* -* p_payload -* [in] Pointer to the SMP payload to send. -* -* payload_size -* [in] The size of the payload to be copied to the SMP data field. -* -* attr_id -* [in] Attribute ID to request. -* -* attr_mod -* [in] Attribute modifier for this request. -* -* err_msg -* [in] Message id with which to post this MAD if an error occurs. -* -* p_context -* [in] Mad wrapper context structure to be copied into the wrapper -* context, and thus visible to the recipient of the response. -* -* RETURN VALUES -* IB_SUCCESS if the request was successful. -* -* NOTES -* This function asynchronously requests the specified attribute. -* The response from the node will be routed through the Dispatcher -* to the appropriate receive controller object. -*********/ -/****f* OpenSM: SM/osm_resp_send -* NAME -* osm_resp_send -* -* DESCRIPTION -* Starts the process to transmit a directed route response. -* -* SYNOPSIS -*/ -ib_api_status_t osm_resp_send(IN osm_sm_t * sm, - IN const osm_madw_t * p_req_madw, - IN ib_net16_t status, - IN const uint8_t * p_payload); -/* -* PARAMETERS -* p_resp -* [in] Pointer to an osm_resp_t object. -* -* p_madw -* [in] Pointer to the MAD Wrapper object for the requesting MAD -* to which this response is generated. -* -* status -* [in] Status for this response. -* -* p_payload -* [in] Pointer to the payload of the response MAD. -* -* RETURN VALUES -* IB_SUCCESS if the response was successful. -* -*********/ - -/****f* OpenSM: SM/osm_sm_reroute_mlid -* NAME -* osm_sm_reroute_mlid -* -* DESCRIPTION -* Requests (schedules) MLID rerouting -* -* SYNOPSIS -*/ -void osm_sm_reroute_mlid(osm_sm_t * sm, ib_net16_t mlid); - -/* -* PARAMETERS -* sm -* [in] Pointer to an osm_sm_t object. -* -* mlid -* [in] MLID value -* -* RETURN VALUES -* None -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: OpenSM/osm_sm_wait_for_subnet_up -* NAME -* osm_sm_wait_for_subnet_up -* -* DESCRIPTION -* Blocks the calling thread until the subnet is up. -* -* SYNOPSIS -*/ -static inline cl_status_t osm_sm_wait_for_subnet_up(IN osm_sm_t * p_sm, - IN uint32_t wait_us, - IN boolean_t interruptible) -{ - return cl_event_wait_on(&p_sm->subnet_up_event, wait_us, interruptible); -} - -/* -* PARAMETERS -* p_sm -* [in] Pointer to an osm_sm_t object. -* -* wait_us -* [in] Number of microseconds to wait. -* -* interruptible -* [in] Indicates whether the wait operation can be interrupted -* by external signals. -* -* RETURN VALUES -* CL_SUCCESS if the wait operation succeeded in response to the event -* being set. -* -* CL_TIMEOUT if the specified time period elapses. -* -* CL_NOT_DONE if the wait was interrupted by an external signal. -* -* CL_ERROR if the wait operation failed. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: State Manager/osm_sm_is_greater_than -* NAME -* osm_sm_is_greater_than -* -* DESCRIPTION -* Compares two SM's (14.4.1.2) -* -* SYNOPSIS -*/ -static inline boolean_t osm_sm_is_greater_than(IN uint8_t l_priority, - IN ib_net64_t l_guid, - IN uint8_t r_priority, - IN ib_net64_t r_guid) -{ - return (l_priority > r_priority - || (l_priority == r_priority - && cl_ntoh64(l_guid) < cl_ntoh64(r_guid))); -} - -/* -* PARAMETERS -* l_priority -* [in] Priority of the SM on the "left" -* -* l_guid -* [in] GUID of the SM on the "left" -* -* r_priority -* [in] Priority of the SM on the "right" -* -* r_guid -* [in] GUID of the SM on the "right" -* -* RETURN VALUES -* Return TRUE if an sm with l_priority and l_guid is higher than an sm -* with r_priority and r_guid, return FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* State Manager -*********/ - -/****f* OpenSM: SM State Manager/osm_sm_state_mgr_process -* NAME -* osm_sm_state_mgr_process -* -* DESCRIPTION -* Processes and maintains the states of the SM. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sm_state_mgr_process(IN osm_sm_t *sm, - IN osm_sm_signal_t signal); -/* -* PARAMETERS -* sm -* [in] Pointer to an osm_sm_t object. -* -* signal -* [in] Signal to the state SM engine. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -* State Manager -*********/ - -/****f* OpenSM: SM State Manager/osm_sm_state_mgr_signal_master_is_alive -* NAME -* osm_sm_state_mgr_signal_master_is_alive -* -* DESCRIPTION -* Signals that the remote Master SM is alive. -* Need to clear the retry_number variable. -* -* SYNOPSIS -*/ -void osm_sm_state_mgr_signal_master_is_alive(IN osm_sm_t *sm); -/* -* PARAMETERS -* sm -* [in] Pointer to an osm_sm_t object. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -* State Manager -*********/ - -/****f* OpenSM: SM State Manager/osm_sm_state_mgr_check_legality -* NAME -* osm_sm_state_mgr_check_legality -* -* DESCRIPTION -* Checks the legality of the signal received, according to the -* current state of the SM state machine. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sm_state_mgr_check_legality(IN osm_sm_t *sm, - IN osm_sm_signal_t signal); -/* -* PARAMETERS -* sm -* [in] Pointer to an osm_sm_t object. -* -* signal -* [in] Signal to the state SM engine. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -* State Manager -*********/ - -void osm_report_sm_state(osm_sm_t *sm); - -/****f* OpenSM: SM State Manager/osm_send_trap144 -* NAME -* osm_send_trap144 -* -* DESCRIPTION -* Send trap 144 to the master SM. -* -* SYNOPSIS -*/ -int osm_send_trap144(osm_sm_t *sm, ib_net16_t local); -/* -* PARAMETERS -* sm -* [in] Pointer to an osm_sm_t object. -* -* local -* [in] OtherLocalChanges mask in network byte order. -* -* RETURN VALUES -* 0 on success, non-zero value otherwise. -* -*********/ - -void osm_set_sm_priority(osm_sm_t *sm, uint8_t priority); - -END_C_DECLS -#endif /* _OSM_SM_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_sm_mad_ctrl.h b/branches/opensm_3/user/include/opensm/osm_sm_mad_ctrl.h deleted file mode 100644 index b15b822c..00000000 --- a/branches/opensm_3/user/include/opensm/osm_sm_mad_ctrl.h +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_sm_mad_ctrl_t. - * This object represents a controller that receives the IBA NodeInfo - * attribute from a node. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_SM_MAD_CTRL_H_ -#define _OSM_SM_MAD_CTRL_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/SM MAD Controller -* NAME -* SM MAD Controller -* -* DESCRIPTION -* The SM MAD Controller object encapsulates -* the information needed to receive MADs from the transport layer. -* -* The SM MAD Controller object is thread safe. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: SM MAD Controller/osm_sm_mad_ctrl_t -* NAME -* osm_sm_mad_ctrl_t -* -* DESCRIPTION -* SM MAD Controller structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_sm_mad_ctrl { - osm_log_t *p_log; - osm_subn_t *p_subn; - osm_mad_pool_t *p_mad_pool; - osm_vl15_t *p_vl15; - osm_vendor_t *p_vendor; - osm_bind_handle_t h_bind; - cl_plock_t *p_lock; - cl_dispatcher_t *p_disp; - cl_disp_reg_handle_t h_disp; - osm_stats_t *p_stats; -} osm_sm_mad_ctrl_t; -/* -* FIELDS -* p_log -* Pointer to the log object. -* -* p_subn -* Pointer to the subnet object. -* -* p_mad_pool -* Pointer to the MAD pool. -* -* p_vendor -* Pointer to the vendor specific interfaces object. -* -* h_bind -* Bind handle returned by the transport layer. -* -* p_lock -* Pointer to the serializing lock. -* -* p_disp -* Pointer to the Dispatcher. -* -* h_disp -* Handle returned from dispatcher registration. -* -* p_stats -* Pointer to the OpenSM statistics block. -* -* SEE ALSO -* SM MAD Controller object -* SM MADr object -*********/ - -/****f* OpenSM: SM MAD Controller/osm_sm_mad_ctrl_construct -* NAME -* osm_sm_mad_ctrl_construct -* -* DESCRIPTION -* This function constructs a SM MAD Controller object. -* -* SYNOPSIS -*/ -void osm_sm_mad_ctrl_construct(IN osm_sm_mad_ctrl_t * p_ctrl); -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to a SM MAD Controller -* object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_sm_mad_ctrl_init, and osm_sm_mad_ctrl_destroy. -* -* Calling osm_sm_mad_ctrl_construct is a prerequisite to calling any other -* method except osm_sm_mad_ctrl_init. -* -* SEE ALSO -* SM MAD Controller object, osm_sm_mad_ctrl_init, -* osm_sm_mad_ctrl_destroy -*********/ - -/****f* OpenSM: SM MAD Controller/osm_sm_mad_ctrl_destroy -* NAME -* osm_sm_mad_ctrl_destroy -* -* DESCRIPTION -* The osm_sm_mad_ctrl_destroy function destroys the object, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_sm_mad_ctrl_destroy(IN osm_sm_mad_ctrl_t * p_ctrl); -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to the object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified -* SM MAD Controller object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to -* osm_sm_mad_ctrl_construct or osm_sm_mad_ctrl_init. -* -* SEE ALSO -* SM MAD Controller object, osm_sm_mad_ctrl_construct, -* osm_sm_mad_ctrl_init -*********/ - -/****f* OpenSM: SM MAD Controller/osm_sm_mad_ctrl_init -* NAME -* osm_sm_mad_ctrl_init -* -* DESCRIPTION -* The osm_sm_mad_ctrl_init function initializes a -* SM MAD Controller object for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sm_mad_ctrl_init(IN osm_sm_mad_ctrl_t * p_ctrl, - IN osm_subn_t * p_subn, - IN osm_mad_pool_t * p_mad_pool, - IN osm_vl15_t * p_vl15, - IN osm_vendor_t * p_vendor, - IN osm_log_t * p_log, - IN osm_stats_t * p_stats, - IN cl_plock_t * p_lock, - IN cl_dispatcher_t * p_disp); -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to an osm_sm_mad_ctrl_t object to initialize. -* -* p_mad_pool -* [in] Pointer to the MAD pool. -* -* p_vl15 -* [in] Pointer to the VL15 interface object. -* -* p_vendor -* [in] Pointer to the vendor specific interfaces object. -* -* p_log -* [in] Pointer to the log object. -* -* p_stats -* [in] Pointer to the OpenSM stastics block. -* -* p_lock -* [in] Pointer to the OpenSM serializing lock. -* -* p_disp -* [in] Pointer to the OpenSM central Dispatcher. -* -* RETURN VALUES -* IB_SUCCESS if the SM MAD Controller object was initialized -* successfully. -* -* NOTES -* Allows calling other SM MAD Controller methods. -* -* SEE ALSO -* SM MAD Controller object, osm_sm_mad_ctrl_construct, -* osm_sm_mad_ctrl_destroy -*********/ - -/****f* OpenSM: SM/osm_sm_mad_ctrl_bind -* NAME -* osm_sm_mad_ctrl_bind -* -* DESCRIPTION -* Binds the SM MAD Controller object to a port guid. -* -* SYNOPSIS -*/ -ib_api_status_t osm_sm_mad_ctrl_bind(IN osm_sm_mad_ctrl_t * p_ctrl, - IN ib_net64_t port_guid); -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to an osm_sm_mad_ctrl_t object to initialize. -* -* port_guid -* [in] Local port GUID with which to bind. -* -* -* RETURN VALUES -* None -* -* NOTES -* A given SM MAD Controller object can only be bound to one -* port at a time. -* -* SEE ALSO -*********/ - -/****f* OpenSM: SM/osm_sm_mad_ctrl_get_bind_handle -* NAME -* osm_sm_mad_ctrl_get_bind_handle -* -* DESCRIPTION -* Returns the bind handle. -* -* SYNOPSIS -*/ -static inline osm_bind_handle_t -osm_sm_mad_ctrl_get_bind_handle(IN const osm_sm_mad_ctrl_t * p_ctrl) -{ - return p_ctrl->h_bind; -} - -/* -* PARAMETERS -* p_ctrl -* [in] Pointer to an osm_sm_mad_ctrl_t object. -* -* RETURN VALUES -* Returns the bind handle, which may be OSM_BIND_INVALID_HANDLE -* if no port has been bound. -* -* NOTES -* A given SM MAD Controller object can only be bound to one -* port at a time. -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_SM_MAD_CTRL_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_stats.h b/branches/opensm_3/user/include/opensm/osm_stats.h deleted file mode 100644 index 37f6811f..00000000 --- a/branches/opensm_3/user/include/opensm/osm_stats.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_stats_t. - * This object represents the OpenSM statistics object. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_STATS_H_ -#define _OSM_STATS_H_ - -#ifdef HAVE_LIBPTHREAD -#include -#else -#include -#endif -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Statistics -* NAME -* OpenSM -* -* DESCRIPTION -* The OpenSM object encapsulates the information needed by the -* OpenSM to track interesting traffic and internal statistics. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Statistics/osm_stats_t -* NAME -* osm_stats_t -* -* DESCRIPTION -* OpenSM statistics block. -* -* SYNOPSIS -*/ -typedef struct osm_stats { - atomic32_t qp0_mads_outstanding; - atomic32_t qp0_mads_outstanding_on_wire; - atomic32_t qp0_mads_rcvd; - atomic32_t qp0_mads_sent; - atomic32_t qp0_unicasts_sent; - atomic32_t qp0_mads_rcvd_unknown; - atomic32_t sa_mads_outstanding; - atomic32_t sa_mads_rcvd; - atomic32_t sa_mads_sent; - atomic32_t sa_mads_rcvd_unknown; - atomic32_t sa_mads_ignored; -#ifdef HAVE_LIBPTHREAD - pthread_mutex_t mutex; - pthread_cond_t cond; -#else - cl_event_t event; -#endif -} osm_stats_t; -/* -* FIELDS -* qp0_mads_outstanding -* Contains the number of MADs outstanding on QP0. -* When this value reaches zero, OpenSM has discovered all -* nodes on the subnet, and finished retrieving attributes. -* At that time, subnet configuration may begin. -* This variable must be manipulated using atomic instructions. -* -* qp0_mads_outstanding_on_wire -* The number of MADs outstanding on the wire at any moment. -* -* qp0_mads_rcvd -* Total number of QP0 MADs received. -* -* qp0_mads_sent -* Total number of QP0 MADs sent. -* -* qp0_unicasts_sent -* Total number of response-less MADs sent on the wire. This count -* includes getresp(), send() and trap() methods. -* -* qp0_mads_rcvd_unknown -* Total number of unknown QP0 MADs received. This includes -* unrecognized attribute IDs and methods. -* -* sa_mads_outstanding -* Contains the number of SA MADs outstanding on QP1. -* -* sa_mads_rcvd -* Total number of SA MADs received. -* -* sa_mads_sent -* Total number of SA MADs sent. -* -* sa_mads_rcvd_unknown -* Total number of unknown SA MADs received. This includes -* unrecognized attribute IDs and methods. -* -* sa_mads_ignored -* Total number of SA MADs received because SM is not -* master or SM is in first time sweep. -* -* SEE ALSO -***************/ - -static inline uint32_t osm_stats_inc_qp0_outstanding(osm_stats_t *stats) -{ - uint32_t outstanding; - -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&stats->mutex); - outstanding = ++stats->qp0_mads_outstanding; - pthread_mutex_unlock(&stats->mutex); -#else - outstanding = cl_atomic_inc(&stats->qp0_mads_outstanding); -#endif - - return outstanding; -} - -static inline uint32_t osm_stats_dec_qp0_outstanding(osm_stats_t *stats) -{ - uint32_t outstanding; - -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&stats->mutex); - outstanding = --stats->qp0_mads_outstanding; - if (!outstanding) - pthread_cond_signal(&stats->cond); - pthread_mutex_unlock(&stats->mutex); -#else - outstanding = cl_atomic_dec(&stats->qp0_mads_outstanding); - if (!outstanding) - cl_event_signal(&stats->event); -#endif - - return outstanding; -} - -END_C_DECLS -#endif /* _OSM_STATS_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_subnet.h b/branches/opensm_3/user/include/opensm/osm_subnet.h deleted file mode 100644 index 94079f1c..00000000 --- a/branches/opensm_3/user/include/opensm/osm_subnet.h +++ /dev/null @@ -1,1185 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * Copyright (c) 2009 System Fabric Works, Inc. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_subn_t. - * This object represents an IBA subnet. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_SUBNET_H_ -#define _OSM_SUBNET_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -#define OSM_SUBNET_VECTOR_MIN_SIZE 0 -#define OSM_SUBNET_VECTOR_GROW_SIZE 1 -#define OSM_SUBNET_VECTOR_CAPACITY 256 -struct osm_opensm; -struct osm_qos_policy; - -/****h* OpenSM/Subnet -* NAME -* Subnet -* -* DESCRIPTION -* The Subnet object encapsulates the information needed by the -* OpenSM to manage a subnet. The OpenSM allocates one Subnet object -* per IBA subnet. -* -* The Subnet object is not thread safe, thus callers must provide -* serialization. -* -* This object is essentially a container for the various components -* of a subnet. Callers may directly access the member variables. -* -* AUTHOR -* Steve King, Intel -* -*********/ - -/****s* OpenSM: Subnet/osm_qos_options_t -* NAME -* osm_qos_options_t -* -* DESCRIPTION -* Subnet QoS options structure. This structure contains the various -* QoS specific configuration parameters for the subnet. -* -* SYNOPSIS -*/ -typedef struct osm_qos_options { - unsigned max_vls; - int high_limit; - char *vlarb_high; - char *vlarb_low; - char *sl2vl; -} osm_qos_options_t; -/* -* FIELDS -* -* max_vls -* The number of maximum VLs on the Subnet (0 == use default) -* -* high_limit -* The limit of High Priority component of VL Arbitration -* table (IBA 7.6.9) (-1 == use default) -* -* vlarb_high -* High priority VL Arbitration table template. (NULL == use default) -* -* vlarb_low -* Low priority VL Arbitration table template. (NULL == use default) -* -* sl2vl -* SL2VL Mapping table (IBA 7.6.6) template. (NULL == use default) -* -*********/ - -/****s* OpenSM: Subnet/osm_subn_opt_t -* NAME -* osm_subn_opt_t -* -* DESCRIPTION -* Subnet options structure. This structure contains the various -* site specific configuration parameters for the subnet. -* -* SYNOPSIS -*/ -typedef struct osm_subn_opt { - char *config_file; - ib_net64_t guid; - ib_net64_t m_key; - ib_net64_t sm_key; - ib_net64_t sa_key; - ib_net64_t subnet_prefix; - ib_net16_t m_key_lease_period; - uint32_t sweep_interval; - uint32_t max_wire_smps; - uint32_t transaction_timeout; - uint32_t transaction_retries; - uint8_t sm_priority; - uint8_t lmc; - boolean_t lmc_esp0; - uint8_t max_op_vls; - uint8_t force_link_speed; - boolean_t reassign_lids; - boolean_t ignore_other_sm; - boolean_t single_thread; - boolean_t disable_multicast; - boolean_t force_log_flush; - uint8_t subnet_timeout; - uint8_t packet_life_time; - uint8_t vl_stall_count; - uint8_t leaf_vl_stall_count; - uint8_t head_of_queue_lifetime; - uint8_t leaf_head_of_queue_lifetime; - uint8_t local_phy_errors_threshold; - uint8_t overrun_errors_threshold; - uint32_t sminfo_polling_timeout; - uint32_t polling_retry_number; - uint32_t max_msg_fifo_timeout; - boolean_t force_heavy_sweep; - uint8_t log_flags; - char *dump_files_dir; - char *log_file; - unsigned long log_max_size; - char *partition_config_file; - boolean_t no_partition_enforcement; - boolean_t qos; - char *qos_policy_file; - boolean_t accum_log_file; - char *console; - uint16_t console_port; - char *port_prof_ignore_file; - char *hop_weights_file; - char *dimn_ports_file; - boolean_t port_profile_switch_nodes; - boolean_t sweep_on_trap; - char *routing_engine_names; - boolean_t use_ucast_cache; - boolean_t connect_roots; - char *lid_matrix_dump_file; - char *lfts_file; - char *root_guid_file; - char *cn_guid_file; - char *io_guid_file; - uint16_t max_reverse_hops; - char *ids_guid_file; - char *guid_routing_order_file; - char *sa_db_file; - boolean_t sa_db_dump; - boolean_t do_mesh_analysis; - boolean_t exit_on_fatal; - boolean_t honor_guid2lid_file; - boolean_t daemon; - boolean_t sm_inactive; - boolean_t babbling_port_policy; - boolean_t use_optimized_slvl; - osm_qos_options_t qos_options; - osm_qos_options_t qos_ca_options; - osm_qos_options_t qos_sw0_options; - osm_qos_options_t qos_swe_options; - osm_qos_options_t qos_rtr_options; - boolean_t enable_quirks; - boolean_t no_clients_rereg; -#ifdef ENABLE_OSM_PERF_MGR - boolean_t perfmgr; - boolean_t perfmgr_redir; - uint16_t perfmgr_sweep_time_s; - uint32_t perfmgr_max_outstanding_queries; - char *event_db_dump_file; -#endif /* ENABLE_OSM_PERF_MGR */ - char *event_plugin_name; - char *event_plugin_options; - char *node_name_map_name; - char *prefix_routes_file; - char *log_prefix; - boolean_t consolidate_ipv6_snm_req; - struct osm_subn_opt *file_opts; /* used for update */ - uint8_t lash_start_vl; /* starting vl to use in lash */ - uint8_t sm_sl; /* which SL to use for SM/SA communication */ -} osm_subn_opt_t; -/* -* FIELDS -* -* config_file -* The name of the config file. -* -* guid -* The port guid that the SM is binding to. -* -* m_key -* M_Key value sent to all ports qualifying all Set(PortInfo). -* -* sm_key -* SM_Key value of the SM used for SM authentication. -* -* sa_key -* SM_Key value to qualify rcv SA queries as "trusted". -* -* subnet_prefix -* Subnet prefix used on this subnet. -* -* m_key_lease_period -* The lease period used for the M_Key on this subnet. -* -* sweep_interval -* The number of seconds between subnet sweeps. A value of 0 -* disables sweeping. -* -* max_wire_smps -* The maximum number of SMPs sent in parallel. Default is 4. -* -* transaction_timeout -* The maximum time in milliseconds allowed for a transaction -* to complete. Default is 200. -* -* transaction_retries -* The number of retries for a transaction. Default is 3. -* -* sm_priority -* The priority of this SM as specified by the user. This -* value is made available in the SMInfo attribute. -* -* lmc -* The LMC value used on this subnet. -* -* lmc_esp0 -* Whether LMC value used on subnet should be used for -* enhanced switch port 0 or not. If TRUE, it is used. -* Otherwise (the default), LMC is set to 0 for ESP0. -* -* max_op_vls -* Limit the maximal operational VLs. default is 1. -* -* reassign_lids -* If TRUE cause all lids to be re-assigend. -* Otherwise (the default), -* OpenSM always tries to preserve as LIDs as much as possible. -* -* ignore_other_sm_option -* This flag is TRUE if other SMs on the subnet should be ignored. -* -* disable_multicast -* This flag is TRUE if OpenSM should disable multicast support. -* -* max_msg_fifo_timeout -* The maximal time a message can stay in the incoming message -* queue. If there is more than one message in the queue and the -* last message stayed in the queue more than this value the SA -* request will be immediately returned with a BUSY status. -* -* subnet_timeout -* The subnet_timeout that will be set for all the ports in the -* design SubnSet(PortInfo.vl_stall_life)) -* -* vl_stall_count -* The number of sequential packets dropped that cause the port -* to enter the VLStalled state. -* -* leaf_vl_stall_count -* The number of sequential packets dropped that cause the port -* to enter the VLStalled state. This is for switch ports driving -* a CA or router port. -* -* head_of_queue_lifetime -* The maximal time a packet can live at the head of a VL queue -* on any port not driving a CA or router port. -* -* leaf_head_of_queue_lifetime -* The maximal time a packet can live at the head of a VL queue -* on switch ports driving a CA or router. -* -* local_phy_errors_threshold -* Threshold of local phy errors for sending Trap 129 -* -* overrun_errors_threshold -* Threshold of credits overrun errors for sending Trap 129 -* -* sminfo_polling_timeout -* Specifies the polling timeout (in milliseconds) - the timeout -* between one poll to another. -* -* packet_life_time -* The maximal time a packet can stay in a switch. -* The value is send to all switches as -* SubnSet(SwitchInfo.life_state) -* -* dump_files_dir -* The directory to be used for opensm-subnet.lst, opensm.fdbs, -* opensm.mcfdbs, and default log file (the latter for Windows, -* not Linux). -* -* log_file -* Name of the log file (or NULL) for stdout. -* -* log_max_size -* This option defines maximal log file size in MB. When -* specified the log file will be truncated upon reaching -* this limit. -* -* qos -* Boolean that specifies whether the OpenSM QoS functionality -* should be off or on. -* -* qos_policy_file -* Name of the QoS policy file. -* -* accum_log_file -* If TRUE (default) - the log file will be accumulated. -* If FALSE - the log file will be erased before starting -* current opensm run. -* -* port_prof_ignore_file -* Name of file with port guids to be ignored by port profiling. -* -* port_profile_switch_nodes -* If TRUE will count the number of switch nodes routed through -* the link. If FALSE - only CA/RT nodes are counted. -* -* sweep_on_trap -* Received traps will initiate a new sweep. -* -* routing_engine_names -* Name of routing engine(s) to use. -* -* connect_roots -* The option which will enforce root to root connectivity with -* up/down and fat-tree routing engines (even if this violates -* "pure" deadlock free up/down or fat-tree algorithm) -* -* use_ucast_cache -* When TRUE enables unicast routing cache. -* -* lid_matrix_dump_file -* Name of the lid matrix dump file from where switch -* lid matrices (min hops tables) will be loaded -* -* lfts_file -* Name of the unicast LFTs routing file from where switch -* forwarding tables will be loaded -* -* root_guid_file -* Name of the file that contains list of root guids that -* will be used by fat-tree or up/dn routing (provided by User) -* -* cn_guid_file -* Name of the file that contains list of compute node guids that -* will be used by fat-tree routing (provided by User) -* -* io_guid_file -* Name of the file that contains list of I/O node guids that -* will be used by fat-tree routing (provided by User) -* -* ids_guid_file -* Name of the file that contains list of ids which should be -* used by Up/Down algorithm instead of node GUIDs -* -* guid_routing_order_file -* Name of the file that contains list of guids for routing order -* that will be used by minhop and up/dn routing (provided by User). -* -* sa_db_file -* Name of the SA database file. -* -* sa_db_dump -* When TRUE causes OpenSM to dump SA DB at the end of every -* light sweep regardless the current verbosity level. -* -* exit_on_fatal -* If TRUE (default) - SM will exit on fatal subnet initialization -* issues. -* If FALSE - SM will not exit. -* Fatal initialization issues: -* a. SM recognizes 2 different nodes with the same guid, or -* 12x link with lane reversal badly configured. -* -* honor_guid2lid_file -* Always honor the guid2lid file if it exists and is valid. This -* means that the file will be honored when SM is coming out of -* STANDBY. By default this is FALSE. -* -* daemon -* OpenSM will run in daemon mode. -* -* sm_inactive -* OpenSM will start with SM in not active state. -* -* babbling_port_policy -* OpenSM will enforce its "babbling" port policy. -* -* use_optimized_slvl -* Use optimized SLtoVLMappingTable programming if -* device indicates it supports this. -* -* perfmgr -* Enable or disable the performance manager -* -* perfmgr_redir -* Enable or disable the saving of redirection by PerfMgr -* -* perfmgr_sweep_time_s -* Define the period (in seconds) of PerfMgr sweeps -* -* event_db_dump_file -* File to dump the event database to -* -* event_plugin_name -* Specify the name(s) of the event plugin(s) -* -* event_plugin_options -* Options string that would be passed to the plugin(s) -* -* qos_options -* Default set of QoS options -* -* qos_ca_options -* QoS options for CA ports -* -* qos_sw0_options -* QoS options for switches' port 0 -* -* qos_swe_options -* QoS options for switches' external ports -* -* qos_rtr_options -* QoS options for router ports -* -* enable_quirks -* Enable high risk new features and not fully qualified -* hardware specific work arounds -* -* no_clients_rereg -* When TRUE disables clients reregistration request. -* -* SEE ALSO -* Subnet object -*********/ - -/****s* OpenSM: Subnet/osm_subn_t -* NAME -* osm_subn_t -* -* DESCRIPTION -* Subnet structure. Callers may directly access member components, -* after grabbing a lock. -* -* TO DO -* This structure should probably be volatile. -* -* SYNOPSIS -*/ -typedef struct osm_subn { - struct osm_opensm *p_osm; - cl_qmap_t sw_guid_tbl; - cl_qmap_t node_guid_tbl; - cl_qmap_t port_guid_tbl; - cl_qmap_t rtr_guid_tbl; - cl_qlist_t prefix_routes_list; - cl_qmap_t prtn_pkey_tbl; - cl_qmap_t sm_guid_tbl; - cl_qlist_t sa_sr_list; - cl_qlist_t sa_infr_list; - cl_ptr_vector_t port_lid_tbl; - ib_net16_t master_sm_base_lid; - ib_net16_t sm_base_lid; - ib_net64_t sm_port_guid; - uint8_t sm_state; - osm_subn_opt_t opt; - struct osm_qos_policy *p_qos_policy; - uint16_t max_ucast_lid_ho; - uint16_t max_mcast_lid_ho; - uint8_t min_ca_mtu; - uint8_t min_ca_rate; - boolean_t ignore_existing_lfts; - boolean_t subnet_initialization_error; - boolean_t force_heavy_sweep; - boolean_t force_reroute; - boolean_t in_sweep_hop_0; - boolean_t first_time_master_sweep; - boolean_t coming_out_of_standby; - unsigned need_update; - cl_fmap_t mgrp_mgid_tbl; - void *mboxes[IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + 1]; -} osm_subn_t; -/* -* FIELDS -* sw_guid_tbl -* Container of pointers to all Switch objects in the subent. -* Indexed by node GUID. -* -* node_guid_tbl -* Container of pointers to all Node objects in the subent. -* Indexed by node GUID. -* -* port_guid_tbl -* Container of pointers to all Port objects in the subent. -* Indexed by port GUID - network order! -* -* rtr_guid_tbl -* Container of pointers to all Router objects in the subent. -* Indexed by node GUID. -* -* prtn_pkey_tbl -* Container of pointers to all Partition objects in the subnet. -* Indexed by P_KEY. -* -* sm_guid_tbl -* Container of pointers to SM objects representing other SMs -* on the subnet. -* -* port_lid_tbl -* Container of pointers to all Port objects in the subent. -* Indexed by port LID. -* -* master_sm_base_lid -* The base LID owned by the subnet's master SM. -* -* sm_base_lid -* The base LID of the local port where the SM is. -* -* sm_port_guid -* This SM's own port GUID. -* -* sm_state -* The high-level state of the SM. This value is made available -* in the SMInfo attribute. -* -* opt -* Subnet options structure contains site specific configuration. -* -* p_qos_policy -* Subnet QoS policy structure. -* -* max_ucast_lid_ho -* The minimal max unicast lid reported by all switches -* -* max_mcast_lid_ho -* The minimal max multicast lid reported by all switches -* -* min_ca_mtu -* The minimal MTU reported by all CAs ports on the subnet -* -* min_ca_rate -* The minimal rate reported by all CA ports on the subnet -* -* ignore_existing_lfts -* This flag is a dynamic flag to instruct the LFT assignment to -* ignore existing legal LFT settings. -* The value will be set according to : -* - Any change to the list of switches will set it to high -* - Coming out of STANDBY it will be cleared (other SM worked) -* - Set to FALSE upon end of all lft assignments. -* -* subnet_initalization_error -* Similar to the force_heavy_sweep flag. If TRUE - means that -* we had errors during initialization (due to SubnSet requests -* that failed). We want to declare the subnet as unhealthy, and -* force another heavy sweep. -* -* force_heavy_sweep -* If TRUE - we want to force a heavy sweep. This can be done -* either due to receiving of trap - meaning there is some change -* on the subnet, or we received a handover from a remote sm. -* In this case we want to sweep and reconfigure the entire -* subnet. This will cause another heavy sweep to occure when -* the current sweep is done. -* -* force_reroute -* If TRUE - we want to force switches in the fabric to be -* rerouted. -* -* in_sweep_hop_0 -* When in_sweep_hop_0 flag is set to TRUE - this means we are -* in sweep_hop_0 - meaning we do not want to continue beyond -* the current node. -* This is relevant for the case of SM on switch, since in the -* switch info we need to signal somehow not to continue -* the sweeping. -* -* first_time_master_sweep -* This flag is used for the PortInfo setting. On the first -* sweep as master (meaning after moving from Standby|Discovering -* state), the SM must send a PortInfoSet to all ports. After -* that - we want to minimize the number of PortInfoSet requests -* sent, and to send only requests that change the value from -* what is updated in the port (or send a first request if this -* is a new port). We will set this flag to TRUE when entering -* the master state, and set it back to FALSE at the end of the -* drop manager. This is done since at the end of the drop manager -* we have updated all the ports that are reachable, and from now -* on these are the only ports we have data of. We don't want -* to send extra set requests to these ports anymore. -* -* coming_out_of_standby -* TRUE on the first sweep after the SM was in standby. -* Used for nulling any cache of LID and Routing. -* The flag is set true if the SM state was standby and now -* changed to MASTER it is reset at the end of the sweep. -* -* need_update -* This flag should be on during first non-master heavy -* (including pre-master discovery stage) -* -* mgrp_mgid_tbl -* Container of pointers to all Multicast group objects in -* the subnet. Indexed by MGID. -* -* mboxes -* Array of pointers to all Multicast MLID box objects in the -* subnet. Indexed by MLID offset from base MLID. -* -* SEE ALSO -* Subnet object -*********/ - -/****f* OpenSM: Subnet/osm_subn_construct -* NAME -* osm_subn_construct -* -* DESCRIPTION -* This function constructs a Subnet object. -* -* SYNOPSIS -*/ -void osm_subn_construct(IN osm_subn_t * p_subn); -/* -* PARAMETERS -* p_subn -* [in] Pointer to a Subnet object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_subn_init, and osm_subn_destroy. -* -* Calling osm_subn_construct is a prerequisite to calling any other -* method except osm_subn_init. -* -* SEE ALSO -* Subnet object, osm_subn_init, osm_subn_destroy -*********/ - -/****f* OpenSM: Subnet/osm_subn_destroy -* NAME -* osm_subn_destroy -* -* DESCRIPTION -* The osm_subn_destroy function destroys a subnet, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_subn_destroy(IN osm_subn_t * p_subn); -/* -* PARAMETERS -* p_subn -* [in] Pointer to a Subnet object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified Subnet object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to osm_subn_construct -* or osm_subn_init. -* -* SEE ALSO -* Subnet object, osm_subn_construct, osm_subn_init -*********/ - -/****f* OpenSM: Subnet/osm_subn_init -* NAME -* osm_subn_init -* -* DESCRIPTION -* The osm_subn_init function initializes a Subnet object for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_subn_init(IN osm_subn_t * p_subn, - IN struct osm_opensm *p_osm, - IN const osm_subn_opt_t * p_opt); -/* -* PARAMETERS -* p_subn -* [in] Pointer to an osm_subn_t object to initialize. -* -* p_opt -* [in] Pointer to the subnet options structure. -* -* RETURN VALUES -* IB_SUCCESS if the Subnet object was initialized successfully. -* -* NOTES -* Allows calling other Subnet methods. -* -* SEE ALSO -* Subnet object, osm_subn_construct, osm_subn_destroy -*********/ - -/* - Forward references. -*/ -struct osm_mad_addr; -struct osm_log; -struct osm_switch; -struct osm_physp; -struct osm_port; -struct osm_mgrp; - -/****f* OpenSM: Helper/osm_get_gid_by_mad_addr -* NAME -* osm_get_gid_by_mad_addr -* -* DESCRIPTION -* Looks for the requester gid in the mad address. -* -* Note: This code is not thread safe. Need to grab the lock before -* calling it. -* -* SYNOPSIS -*/ -ib_api_status_t osm_get_gid_by_mad_addr(IN struct osm_log *p_log, - IN const osm_subn_t * p_subn, - IN struct osm_mad_addr *p_mad_addr, - OUT ib_gid_t * p_gid); -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_subn -* [in] Pointer to subnet object. -* -* p_mad_addr -* [in] Pointer to mad address object. -* -* p_gid -* [out] Pointer to the GID structure to fill in. -* -* RETURN VALUES -* IB_SUCCESS if able to find the GID by address given. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Helper/osm_get_physp_by_mad_addr -* NAME -* osm_get_physp_by_mad_addr -* -* DESCRIPTION -* Looks for the requester physical port in the mad address. -* -* Note: This code is not thread safe. Need to grab the lock before -* calling it. -* -* SYNOPSIS -*/ -struct osm_physp *osm_get_physp_by_mad_addr(IN struct osm_log *p_log, - IN const osm_subn_t * p_subn, - IN struct osm_mad_addr - *p_mad_addr); -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_subn -* [in] Pointer to subnet object. -* -* p_mad_addr -* [in] Pointer to mad address object. -* -* RETURN VALUES -* Pointer to requester physical port object if found. Null otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Helper/osm_get_port_by_mad_addr -* NAME -* osm_get_port_by_mad_addr -* -* DESCRIPTION -* Looks for the requester port in the mad address. -* -* Note: This code is not thread safe. Need to grab the lock before -* calling it. -* -* SYNOPSIS -*/ -struct osm_port *osm_get_port_by_mad_addr(IN struct osm_log *p_log, - IN const osm_subn_t * p_subn, - IN struct osm_mad_addr *p_mad_addr); -/* -* PARAMETERS -* p_log -* [in] Pointer to a log object. -* -* p_subn -* [in] Pointer to subnet object. -* -* p_mad_addr -* [in] Pointer to mad address object. -* -* RETURN VALUES -* Pointer to requester port object if found. Null otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Subnet/osm_get_switch_by_guid -* NAME -* osm_get_switch_by_guid -* -* DESCRIPTION -* Looks for the given switch guid in the subnet table of switches by guid. -* NOTE: this code is not thread safe. Need to grab the lock before -* calling it. -* -* SYNOPSIS -*/ -struct osm_switch *osm_get_switch_by_guid(IN const osm_subn_t * p_subn, - IN uint64_t guid); -/* -* PARAMETERS -* p_subn -* [in] Pointer to an osm_subn_t object -* -* guid -* [in] The node guid in host order -* -* RETURN VALUES -* The switch structure pointer if found. NULL otherwise. -* -* SEE ALSO -* Subnet object, osm_subn_construct, osm_subn_destroy, -* osm_switch_t -*********/ - -/****f* OpenSM: Subnet/osm_get_node_by_guid -* NAME -* osm_get_node_by_guid -* -* DESCRIPTION -* The looks for the given node giud in the subnet table of nodes by guid. -* NOTE: this code is not thread safe. Need to grab the lock before -* calling it. -* -* SYNOPSIS -*/ -struct osm_node *osm_get_node_by_guid(IN osm_subn_t const *p_subn, - IN uint64_t guid); -/* -* PARAMETERS -* p_subn -* [in] Pointer to an osm_subn_t object -* -* guid -* [in] The node guid in host order -* -* RETURN VALUES -* The node structure pointer if found. NULL otherwise. -* -* SEE ALSO -* Subnet object, osm_subn_construct, osm_subn_destroy, -* osm_node_t -*********/ - -/****f* OpenSM: Subnet/osm_get_port_by_guid -* NAME -* osm_get_port_by_guid -* -* DESCRIPTION -* The looks for the given port guid in the subnet table of ports by guid. -* NOTE: this code is not thread safe. Need to grab the lock before -* calling it. -* -* SYNOPSIS -*/ -struct osm_port *osm_get_port_by_guid(IN osm_subn_t const *p_subn, - IN ib_net64_t guid); -/* -* PARAMETERS -* p_subn -* [in] Pointer to an osm_subn_t object -* -* guid -* [in] The port guid in network order -* -* RETURN VALUES -* The port structure pointer if found. NULL otherwise. -* -* SEE ALSO -* Subnet object, osm_subn_construct, osm_subn_destroy, -* osm_port_t -*********/ - -/****f* OpenSM: Port/osm_get_port_by_lid_ho -* NAME -* osm_get_port_by_lid_ho -* -* DESCRIPTION -* Returns a pointer of the port object for given lid value. -* -* SYNOPSIS -*/ -struct osm_port *osm_get_port_by_lid_ho(const osm_subn_t * subn, uint16_t lid); -/* -* PARAMETERS -* subn -* [in] Pointer to the subnet data structure. -* -* lid -* [in] LID requested in hot byte order. -* -* RETURN VALUES -* The port structure pointer if found. NULL otherwise. -* -* SEE ALSO -* Subnet object, osm_port_t -*********/ - -/****f* OpenSM: Port/osm_get_port_by_lid -* NAME -* osm_get_port_by_lid -* -* DESCRIPTION -* Returns a pointer of the port object for given lid value. -* -* SYNOPSIS -*/ -static inline struct osm_port *osm_get_port_by_lid(IN osm_subn_t const * subn, - IN ib_net16_t lid) -{ - return osm_get_port_by_lid_ho(subn, cl_ntoh16(lid)); -} -/* -* PARAMETERS -* subn -* [in] Pointer to the subnet data structure. -* -* lid -* [in] LID requested in network byte order. -* -* RETURN VALUES -* The port structure pointer if found. NULL otherwise. -* -* SEE ALSO -* Subnet object, osm_port_t -*********/ - -/****f* OpenSM: Subnet/osm_get_mgrp_by_mgid -* NAME -* osm_get_mgrp_by_mgid -* -* DESCRIPTION -* The looks for the given multicast group in the subnet table by mgid. -* NOTE: this code is not thread safe. Need to grab the lock before -* calling it. -* -* SYNOPSIS -*/ -struct osm_mgrp *osm_get_mgrp_by_mgid(IN osm_subn_t * subn, IN ib_gid_t * mgid); -/* -* PARAMETERS -* subn -* [in] Pointer to an osm_subn_t object -* -* mgid -* [in] The multicast group MGID value -* -* RETURN VALUES -* The multicast group structure pointer if found. NULL otherwise. -*********/ - -/****f* OpenSM: Subnet/osm_get_mbox_by_mlid -* NAME -* osm_get_mbox_by_mlid -* -* DESCRIPTION -* The looks for the given multicast group in the subnet table by mlid. -* NOTE: this code is not thread safe. Need to grab the lock before -* calling it. -* -* SYNOPSIS -*/ -static inline struct osm_mgrp_box *osm_get_mbox_by_mlid(osm_subn_t const *p_subn, ib_net16_t mlid) -{ - return p_subn->mboxes[cl_ntoh16(mlid) - IB_LID_MCAST_START_HO]; -} -/* -* PARAMETERS -* p_subn -* [in] Pointer to an osm_subn_t object -* -* mlid -* [in] The multicast group mlid in network order -* -* RETURN VALUES -* The multicast group structure pointer if found. NULL otherwise. -*********/ - -/****f* OpenSM: Subnet/osm_subn_set_default_opt -* NAME -* osm_subn_set_default_opt -* -* DESCRIPTION -* The osm_subn_set_default_opt function sets the default options. -* -* SYNOPSIS -*/ -void osm_subn_set_default_opt(IN osm_subn_opt_t * p_opt); -/* -* PARAMETERS -* -* p_opt -* [in] Pointer to the subnet options structure. -* -* RETURN VALUES -* None -* -* NOTES -* -* SEE ALSO -* Subnet object, osm_subn_construct, osm_subn_destroy -*********/ - -/****f* OpenSM: Subnet/osm_subn_parse_conf_file -* NAME -* osm_subn_parse_conf_file -* -* DESCRIPTION -* The osm_subn_parse_conf_file function parses the configuration file -* and sets the defaults accordingly. -* -* SYNOPSIS -*/ -int osm_subn_parse_conf_file(char *conf_file, osm_subn_opt_t * p_opt); -/* -* PARAMETERS -* -* p_opt -* [in] Pointer to the subnet options structure. -* -* RETURN VALUES -* 0 on success, positive value if file doesn't exist, -* negative value otherwise -*********/ - -/****f* OpenSM: Subnet/osm_subn_rescan_conf_files -* NAME -* osm_subn_rescan_conf_files -* -* DESCRIPTION -* The osm_subn_rescan_conf_files function parses the configuration -* files and update selected subnet options -* -* SYNOPSIS -*/ -int osm_subn_rescan_conf_files(IN osm_subn_t * p_subn); -/* -* PARAMETERS -* -* p_subn -* [in] Pointer to the subnet structure. -* -* RETURN VALUES -* 0 on success, positive value if file doesn't exist, -* negative value otherwise -* -*********/ - -/****f* OpenSM: Subnet/osm_subn_output_conf -* NAME -* osm_subn_output_conf -* -* DESCRIPTION -* Output configuration info -* -* SYNOPSIS -*/ -int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opt); -/* -* PARAMETERS -* -* out -* [in] File stream to output to. -* -* p_opt -* [in] Pointer to the subnet options structure. -* -* RETURN VALUES -* 0 on success, negative value otherwise -*********/ - -/****f* OpenSM: Subnet/osm_subn_write_conf_file -* NAME -* osm_subn_write_conf_file -* -* DESCRIPTION -* Write the configuration file into the cache -* -* SYNOPSIS -*/ -int osm_subn_write_conf_file(char *file_name, IN osm_subn_opt_t * p_opt); -/* -* PARAMETERS -* -* p_opt -* [in] Pointer to the subnet options structure. -* -* RETURN VALUES -* 0 on success, negative value otherwise -* -* NOTES -* Assumes the conf file is part of the cache dir which defaults to -* OSM_DEFAULT_CACHE_DIR or OSM_CACHE_DIR the name is opensm.opts -*********/ -int osm_subn_verify_config(osm_subn_opt_t * p_opt); - -END_C_DECLS -#endif /* _OSM_SUBNET_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_switch.h b/branches/opensm_3/user/include/opensm/osm_switch.h deleted file mode 100644 index 7fe11426..00000000 --- a/branches/opensm_3/user/include/opensm/osm_switch.h +++ /dev/null @@ -1,1143 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_switch_t. - * This object represents an IBA switch. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_SWITCH_H_ -#define _OSM_SWITCH_H_ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Switch -* NAME -* Switch -* -* DESCRIPTION -* The Switch object encapsulates the information needed by the -* OpenSM to manage switches. The OpenSM allocates one switch object -* per switch in the IBA subnet. -* -* The Switch object is not thread safe, thus callers must provide -* serialization. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Switch/osm_switch_t -* NAME -* osm_switch_t -* -* DESCRIPTION -* Switch structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_switch { - cl_map_item_t map_item; - osm_node_t *p_node; - ib_switch_info_t switch_info; - uint16_t max_lid_ho; - uint8_t num_ports; - uint16_t num_hops; - uint8_t **hops; - osm_port_profile_t *p_prof; - uint8_t *dimn_ports; - uint8_t *lft; - uint8_t *new_lft; - uint16_t lft_size; - osm_mcast_tbl_t mcast_tbl; - int32_t mft_block_num; - uint32_t mft_position; - unsigned endport_links; - unsigned need_update; - void *priv; - cl_map_item_t mgrp_item; - uint32_t num_of_mcm; - uint8_t is_mc_member; -} osm_switch_t; -/* -* FIELDS -* map_item -* Linkage structure for cl_qmap. MUST BE FIRST MEMBER! -* -* p_node -* Pointer to the Node object for this switch. -* -* switch_info -* IBA defined SwitchInfo structure for this switch. -* -* max_lid_ho -* Max LID that is accessible from this switch. -* -* num_ports -* Number of ports for this switch. -* -* num_hops -* Size of hops table for this switch. -* -* hops -* LID Matrix for this switch containing the hop count -* to every LID from every port. -* -* p_prof -* Pointer to array of Port Profile objects for this switch. -* -* lft -* This switch's linear forwarding table. -* -* new_lft -* This switch's linear forwarding table, as was -* calculated by the last routing engine execution. -* -* mcast_tbl -* Multicast forwarding table for this switch. -* -* need_update -* When set indicates that switch was probably reset, so -* fwd tables and rest cached data should be flushed -* -* mgrp_item -* map item for switch in building mcast tree -* -* num_of_mcm -* number of mcast members(ports) connected to switch -* -* is_mc_member -* whether switch is a mcast member itself -* -* SEE ALSO -* Switch object -*********/ - -/****s* OpenSM: Switch/struct osm_remote_guids_count -* NAME -* struct osm_remote_guids_count -* -* DESCRIPTION -* Stores array of pointers to remote node and the numbers of -* times a switch has forwarded to it. -* -* SYNOPSIS -*/ -struct osm_remote_guids_count { - unsigned count; - struct osm_remote_node { - osm_node_t *node; - unsigned forwarded_to; - uint8_t port; - } guids[0]; -}; -/* -* FIELDS -* count -* A number of used entries in array. -* -* node -* A pointer to node. -* -* forwarded_to -* A count of lids forwarded to this node. -* -* port -* Port number on the node. -*********/ - -/****f* OpenSM: Switch/osm_switch_delete -* NAME -* osm_switch_delete -* -* DESCRIPTION -* Destroys and deallocates the object. -* -* SYNOPSIS -*/ -void osm_switch_delete(IN OUT osm_switch_t ** pp_sw); -/* -* PARAMETERS -* p_sw -* [in] Pointer to the object to destroy. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -* Switch object, osm_switch_new -*********/ - -/****f* OpenSM: Switch/osm_switch_new -* NAME -* osm_switch_new -* -* DESCRIPTION -* The osm_switch_new function initializes a Switch object for use. -* -* SYNOPSIS -*/ -osm_switch_t *osm_switch_new(IN osm_node_t * p_node, - IN const osm_madw_t * p_madw); -/* -* PARAMETERS -* p_node -* [in] Pointer to the node object of this switch -* -* p_madw -* [in] Pointer to the MAD Wrapper containing the switch's -* SwitchInfo attribute. -* -* RETURN VALUES -* Pointer to the new initialized switch object. -* -* NOTES -* -* SEE ALSO -* Switch object, osm_switch_delete -*********/ - -/****f* OpenSM: Switch/osm_switch_get_hop_count -* NAME -* osm_switch_get_hop_count -* -* DESCRIPTION -* Returns the hop count at the specified LID/Port intersection. -* -* SYNOPSIS -*/ -static inline uint8_t osm_switch_get_hop_count(IN const osm_switch_t * p_sw, - IN uint16_t lid_ho, - IN uint8_t port_num) -{ - return (lid_ho > p_sw->max_lid_ho || !p_sw->hops[lid_ho]) ? - OSM_NO_PATH : p_sw->hops[lid_ho][port_num]; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to a Switch object. -* -* lid_ho -* [in] LID value (host order) for which to return the hop count -* -* port_num -* [in] Port number in the switch -* -* RETURN VALUES -* Returns the hop count at the specified LID/Port intersection. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_set_hops -* NAME -* osm_switch_set_hops -* -* DESCRIPTION -* Sets the hop count at the specified LID/Port intersection. -* -* SYNOPSIS -*/ -cl_status_t osm_switch_set_hops(IN osm_switch_t * p_sw, IN uint16_t lid_ho, - IN uint8_t port_num, IN uint8_t num_hops); -/* -* PARAMETERS -* p_sw -* [in] Pointer to a Switch object. -* -* lid_ho -* [in] LID value (host order) for which to set the count. -* -* port_num -* [in] port number for which to set the count. -* -* num_hops -* [in] value to assign to this entry. -* -* RETURN VALUES -* Returns 0 if successfull. -1 if it failed -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_clear_hops -* NAME -* osm_switch_clear_hops -* -* DESCRIPTION -* Cleanup existing hops tables (lid matrix) -* -* SYNOPSIS -*/ -void osm_switch_clear_hops(IN osm_switch_t * p_sw); -/* -* PARAMETERS -* p_sw -* [in] Pointer to a Switch object. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_get_least_hops -* NAME -* osm_switch_get_least_hops -* -* DESCRIPTION -* Returns the number of hops in the short path to this lid from -* any port on the switch. -* -* SYNOPSIS -*/ -static inline uint8_t osm_switch_get_least_hops(IN const osm_switch_t * p_sw, - IN uint16_t lid_ho) -{ - return (lid_ho > p_sw->max_lid_ho || !p_sw->hops[lid_ho]) ? - OSM_NO_PATH : p_sw->hops[lid_ho][0]; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to an osm_switch_t object. -* -* lid_ho -* [in] LID (host order) for which to retrieve the shortest hop count. -* -* RETURN VALUES -* Returns the number of hops in the short path to this lid from -* any port on the switch. -* -* NOTES -* -* SEE ALSO -* Switch object -*********/ - -/****f* OpenSM: Switch/osm_switch_get_port_least_hops -* NAME -* osm_switch_get_port_least_hops -* -* DESCRIPTION -* Returns the number of hops in the short path to this port from -* any port on the switch. -* -* SYNOPSIS -*/ -uint8_t osm_switch_get_port_least_hops(IN const osm_switch_t * p_sw, - IN const osm_port_t * p_port); -/* -* PARAMETERS -* p_sw -* [in] Pointer to an osm_switch_t object. -* -* p_port -* [in] Pointer to an osm_port_t object for which to -* retrieve the shortest hop count. -* -* RETURN VALUES -* Returns the number of hops in the short path to this lid from -* any port on the switch. -* -* NOTES -* -* SEE ALSO -* Switch object -*********/ - -/****f* OpenSM: Switch/osm_switch_get_port_by_lid -* NAME -* osm_switch_get_port_by_lid -* -* DESCRIPTION -* Returns the switch port number on which the specified LID is routed. -* -* SYNOPSIS -*/ -static inline uint8_t osm_switch_get_port_by_lid(IN const osm_switch_t * p_sw, - IN uint16_t lid_ho) -{ - if (lid_ho == 0 || lid_ho > p_sw->max_lid_ho) - return OSM_NO_PATH; - return p_sw->lft[lid_ho]; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to an osm_switch_t object. -* -* lid_ho -* [in] LID (host order) for which to retrieve the shortest hop count. -* -* RETURN VALUES -* Returns the switch port on which the specified LID is routed. -* -* NOTES -* -* SEE ALSO -* Switch object -*********/ - -/****f* OpenSM: Switch/osm_switch_get_route_by_lid -* NAME -* osm_switch_get_route_by_lid -* -* DESCRIPTION -* Gets the physical port object that routes the specified LID. -* -* SYNOPSIS -*/ -static inline osm_physp_t *osm_switch_get_route_by_lid(IN const osm_switch_t * - p_sw, IN ib_net16_t lid) -{ - uint8_t port_num; - - CL_ASSERT(p_sw); - CL_ASSERT(lid); - - port_num = osm_switch_get_port_by_lid(p_sw, cl_ntoh16(lid)); - - /* - In order to avoid holes in the subnet (usually happens when - running UPDN algorithm), i.e. cases where port is - unreachable through a switch (we put an OSM_NO_PATH value at - the port entry, we do not assert on unreachable lid entries - at the fwd table but return NULL - */ - if (port_num != OSM_NO_PATH) - return (osm_node_get_physp_ptr(p_sw->p_node, port_num)); - else - return NULL; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to an osm_switch_t object. -* -* lid -* [in] LID for which to find a route. This must be a unicast -* LID value < 0xC000. -* -* RETURN VALUES -* Returns a pointer to the Physical Port Object object that -* routes the specified LID. A return value of zero means -* there is no route for the lid through this switch. -* The lid value must be a unicast LID. -* -* NOTES -* -* SEE ALSO -* Switch object -*********/ - -/****f* OpenSM: Switch/osm_switch_sp0_is_lmc_capable -* NAME -* osm_switch_sp0_is_lmc_capable -* -* DESCRIPTION -* Returns whether switch port 0 (SP0) can support LMC -* -*/ -static inline unsigned -osm_switch_sp0_is_lmc_capable(IN const osm_switch_t * p_sw, - IN osm_subn_t * p_subn) -{ - return (p_subn->opt.lmc_esp0 && - ib_switch_info_is_enhanced_port0(&p_sw->switch_info)) ? 1 : 0; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to an osm_switch_t object. -* -* p_subn -* [in] Pointer to an osm_subn_t object. -* -* RETURN VALUES -* TRUE if SP0 is enhanced and globally enabled. FALSE otherwise. -* -* NOTES -* This is workaround function, it takes into account user defined -* p_subn->opt.lmc_esp0 parameter. -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_get_max_block_id_in_use -* NAME -* osm_switch_get_max_block_id_in_use -* -* DESCRIPTION -* Returns the maximum block ID (host order) of this switch that -* is used for unicast routing. -* -* SYNOPSIS -*/ -static inline uint16_t -osm_switch_get_max_block_id_in_use(IN const osm_switch_t * p_sw) -{ - return cl_ntoh16(p_sw->switch_info.lin_top) / IB_SMP_DATA_SIZE; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to an osm_switch_t object. -* -* RETURN VALUES -* Returns the maximum block ID (host order) of this switch. -* -* NOTES -* -* SEE ALSO -* Switch object -*********/ - -/****f* OpenSM: Switch/osm_switch_get_lft_block -* NAME -* osm_switch_get_lft_block -* -* DESCRIPTION -* Retrieve a linear forwarding table block. -* -* SYNOPSIS -*/ -boolean_t osm_switch_get_lft_block(IN const osm_switch_t * p_sw, - IN uint16_t block_id, OUT uint8_t * p_block); -/* -* PARAMETERS -* p_sw -* [in] Pointer to an osm_switch_t object. -* -* block_ID -* [in] The block_id to retrieve. -* -* p_block -* [out] Pointer to the 64 byte array to store the -* forwarding table clock specified by block_id. -* -* RETURN VALUES -* Returns true if there are more blocks necessary to -* configure all the LIDs reachable from this switch. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_supports_mcast -* NAME -* osm_switch_supports_mcast -* -* DESCRIPTION -* Indicates if a switch supports multicast. -* -* SYNOPSIS -*/ -static inline boolean_t osm_switch_supports_mcast(IN const osm_switch_t * p_sw) -{ - return (p_sw->switch_info.mcast_cap != 0); -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to an osm_switch_t object. -* -* RETURN VALUES -* Returns TRUE if the switch supports multicast. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_set_switch_info -* NAME -* osm_switch_set_switch_info -* -* DESCRIPTION -* Updates the switch info attribute of this switch. -* -* SYNOPSIS -*/ -static inline void osm_switch_set_switch_info(IN osm_switch_t * p_sw, - IN const ib_switch_info_t * p_si) -{ - CL_ASSERT(p_sw); - CL_ASSERT(p_si); - p_sw->switch_info = *p_si; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to a Switch object. -* -* p_si -* [in] Pointer to the SwitchInfo attribute for this switch. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_count_path -* NAME -* osm_switch_count_path -* -* DESCRIPTION -* Counts this path in port profile. -* -* SYNOPSIS -*/ -static inline void osm_switch_count_path(IN osm_switch_t * p_sw, - IN uint8_t port) -{ - osm_port_prof_path_count_inc(&p_sw->p_prof[port]); -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* port -* [in] Port to count path. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_set_lft_block -* NAME -* osm_switch_set_lft_block -* -* DESCRIPTION -* Copies in the specified block into -* the switch's Linear Forwarding Table. -* -* SYNOPSIS -*/ -static inline ib_api_status_t -osm_switch_set_lft_block(IN osm_switch_t * p_sw, IN const uint8_t * p_block, - IN uint32_t block_num) -{ - uint16_t lid_start = - (uint16_t) (block_num * IB_SMP_DATA_SIZE); - CL_ASSERT(p_sw); - - if (lid_start + IB_SMP_DATA_SIZE > p_sw->lft_size) - return IB_INVALID_PARAMETER; - - memcpy(&p_sw->lft[lid_start], p_block, IB_SMP_DATA_SIZE); - return IB_SUCCESS; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* p_block -* [in] Pointer to the forwarding table block. -* -* block_num -* [in] Block number for this block -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_set_mft_block -* NAME -* osm_switch_set_mft_block -* -* DESCRIPTION -* Sets a block of multicast port masks into the multicast table. -* -* SYNOPSIS -*/ -static inline ib_api_status_t -osm_switch_set_mft_block(IN osm_switch_t * p_sw, IN const ib_net16_t * p_block, - IN uint16_t block_num, IN uint8_t position) -{ - CL_ASSERT(p_sw); - return osm_mcast_tbl_set_block(&p_sw->mcast_tbl, p_block, block_num, - position); -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* p_block -* [in] Pointer to the block of port masks to set. -* -* block_num -* [in] Block number (0-511) to set. -* -* position -* [in] Port mask position (0-15) to set. -* -* RETURN VALUE -* IB_SUCCESS on success. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_get_mft_block -* NAME -* osm_switch_get_mft_block -* -* DESCRIPTION -* Retrieve a block of multicast port masks from the multicast table. -* -* SYNOPSIS -*/ -static inline boolean_t osm_switch_get_mft_block(IN osm_switch_t * p_sw, - IN uint16_t block_num, - IN uint8_t position, - OUT ib_net16_t * p_block) -{ - CL_ASSERT(p_sw); - return osm_mcast_tbl_get_block(&p_sw->mcast_tbl, block_num, position, - p_block); -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* block_num -* [in] Block number (0-511) to set. -* -* position -* [in] Port mask position (0-15) to set. -* -* p_block -* [out] Pointer to the block of port masks stored. -* -* RETURN VALUES -* Returns true if there are more blocks necessary to -* configure all the MLIDs reachable from this switch. -* FALSE otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_get_mft_max_block -* NAME -* osm_switch_get_mft_max_block -* -* DESCRIPTION -* Get the max_block from the associated multicast table. -* -* SYNOPSIS -*/ -static inline uint16_t osm_switch_get_mft_max_block(IN osm_switch_t * p_sw) -{ - CL_ASSERT(p_sw); - return osm_mcast_tbl_get_max_block(&p_sw->mcast_tbl); -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* RETURN VALUE -*/ - -/****f* OpenSM: Switch/osm_switch_get_mft_max_block_in_use -* NAME -* osm_switch_get_mft_max_block_in_use -* -* DESCRIPTION -* Get the max_block_in_use from the associated multicast table. -* -* SYNOPSIS -*/ -static inline int16_t osm_switch_get_mft_max_block_in_use(IN osm_switch_t * p_sw) -{ - CL_ASSERT(p_sw); - return osm_mcast_tbl_get_max_block_in_use(&p_sw->mcast_tbl); -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* RETURN VALUES -* Returns the maximum block ID in use in this switch's mcast table. -* A value of -1 indicates no blocks are in use. -* -* NOTES -* -* SEE ALSO -*/ - -/****f* OpenSM: Switch/osm_switch_get_mft_max_position -* NAME -* osm_switch_get_mft_max_position -* -* DESCRIPTION -* Get the max_position from the associated multicast table. -* -* SYNOPSIS -*/ -static inline uint8_t osm_switch_get_mft_max_position(IN osm_switch_t * p_sw) -{ - CL_ASSERT(p_sw); - return osm_mcast_tbl_get_max_position(&p_sw->mcast_tbl); -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* RETURN VALUE -*/ - -/****f* OpenSM: Switch/osm_switch_get_dimn_port -* NAME -* osm_switch_get_dimn_port -* -* DESCRIPTION -* Get the routing ordered port -* -* SYNOPSIS -*/ -static inline uint8_t osm_switch_get_dimn_port(IN const osm_switch_t * p_sw, - IN uint8_t port_num) -{ - CL_ASSERT(p_sw); - if (p_sw->dimn_ports == NULL) - return port_num; - return p_sw->dimn_ports[port_num]; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* port_num -* [in] Port number in the switch -* -* RETURN VALUES -* Returns the port number ordered for routing purposes. -*/ - -/****f* OpenSM: Switch/osm_switch_recommend_path -* NAME -* osm_switch_recommend_path -* -* DESCRIPTION -* Returns the recommended port on which to route this LID. -* In cases where LMC > 0, the remote side system and node -* used for the routing are tracked in the provided arrays -* (and counts) such that other lid for the same port will -* try and avoid going through the same remote system/node. -* -* SYNOPSIS -*/ -uint8_t osm_switch_recommend_path(IN const osm_switch_t * p_sw, - IN osm_port_t * p_port, IN uint16_t lid_ho, - IN unsigned start_from, - IN boolean_t ignore_existing, - IN boolean_t dor); -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* p_port -* [in] Pointer to the port object for which to get a path -* advisory. -* -* lid_ho -* [in] LID value (host order) for which to get a path advisory. -* -* start_from -* [in] Port number from where to start balance counting. -* -* ignore_existing -* [in] Set to cause the switch to choose the optimal route -* regardless of existing paths. -* If false, the switch will choose an existing route if one -* exists, otherwise will choose the optimal route. -* -* dor -* [in] If TRUE, Dimension Order Routing will be done. -* -* RETURN VALUE -* Returns the recommended port on which to route this LID. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_recommend_mcast_path -* NAME -* osm_switch_recommend_mcast_path -* -* DESCRIPTION -* Returns the recommended port on which to route this LID. -* -* SYNOPSIS -*/ -uint8_t osm_switch_recommend_mcast_path(IN osm_switch_t * p_sw, - IN osm_port_t * p_port, - IN uint16_t mlid_ho, - IN boolean_t ignore_existing); -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch object. -* -* p_port -* [in] Pointer to the port object for which to get -* the multicast path. -* -* mlid_ho -* [in] MLID for the multicast group in question. -* -* ignore_existing -* [in] Set to cause the switch to choose the optimal route -* regardless of existing paths. -* If false, the switch will choose an existing route if one exists, -* otherwise will choose the optimal route. -* -* RETURN VALUE -* Returns the recommended port on which to route this LID. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_get_mcast_fwd_tbl_size -* NAME -* osm_switch_get_mcast_fwd_tbl_size -* -* DESCRIPTION -* Returns the number of entries available in the multicast forwarding table. -* -* SYNOPSIS -*/ -static inline uint16_t -osm_switch_get_mcast_fwd_tbl_size(IN const osm_switch_t * p_sw) -{ - return cl_ntoh16(p_sw->switch_info.mcast_cap); -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch. -* -* RETURN VALUE -* Returns the number of entries available in the multicast forwarding table. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_path_count_get -* NAME -* osm_switch_path_count_get -* -* DESCRIPTION -* Returns the count of the number of paths going through this port. -* -* SYNOPSIS -*/ -static inline uint32_t osm_switch_path_count_get(IN const osm_switch_t * p_sw, - IN uint8_t port_num) -{ - return osm_port_prof_path_count_get(&p_sw->p_prof[port_num]); -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the Switch object. -* -* port_num -* [in] Port number for which to get path count. -* -* RETURN VALUE -* Returns the count of the number of paths going through this port. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_prepare_path_rebuild -* NAME -* osm_switch_prepare_path_rebuild -* -* DESCRIPTION -* Prepares a switch to rebuild pathing information. -* -* SYNOPSIS -*/ -int osm_switch_prepare_path_rebuild(IN osm_switch_t * p_sw, - IN uint16_t max_lids); -/* -* PARAMETERS -* p_sw -* [in] Pointer to the Switch object. -* -* max_lids -* [in] Max number of lids in the subnet. -* -* RETURN VALUE -* Returns zero on success, or negative value if an error occurred. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_get_mcast_tbl_ptr -* NAME -* osm_switch_get_mcast_tbl_ptr -* -* DESCRIPTION -* Returns a pointer to the switch's multicast table. -* -* SYNOPSIS -*/ -static inline osm_mcast_tbl_t *osm_switch_get_mcast_tbl_ptr(IN const - osm_switch_t * p_sw) -{ - return (osm_mcast_tbl_t *) & p_sw->mcast_tbl; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch. -* -* RETURN VALUE -* Returns a pointer to the switch's multicast table. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Switch/osm_switch_is_in_mcast_tree -* NAME -* osm_switch_is_in_mcast_tree -* -* DESCRIPTION -* Returns true if this switch already belongs in the tree for the specified -* multicast group. -* -* SYNOPSIS -*/ -static inline boolean_t -osm_switch_is_in_mcast_tree(IN const osm_switch_t * p_sw, IN uint16_t mlid_ho) -{ - const osm_mcast_tbl_t *p_tbl; - - p_tbl = &p_sw->mcast_tbl; - if (p_tbl) - return osm_mcast_tbl_is_any_port(&p_sw->mcast_tbl, mlid_ho); - else - return FALSE; -} -/* -* PARAMETERS -* p_sw -* [in] Pointer to the switch. -* -* mlid_ho -* [in] MLID (host order) of the multicast tree to check. -* -* RETURN VALUE -* Returns true if this switch already belongs in the tree for the specified -* multicast group. -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_SWITCH_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_ucast_cache.h b/branches/opensm_3/user/include/opensm/osm_ucast_cache.h deleted file mode 100644 index af17bb20..00000000 --- a/branches/opensm_3/user/include/opensm/osm_ucast_cache.h +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2008 Mellanox Technologies LTD. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Header file that describes Unicast Cache functions. - * - * Environment: - * Linux User Mode - * - * $Revision: 1.4 $ - */ - -#ifndef _OSM_UCAST_CACHE_H_ -#define _OSM_UCAST_CACHE_H_ - -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS - -struct osm_ucast_mgr; - -/****h* OpenSM/Unicast Manager/Unicast Cache -* NAME -* Unicast Cache -* -* DESCRIPTION -* The Unicast Cache object encapsulates the information -* needed to cache and write unicast routing of the subnet. -* -* The Unicast Cache object is NOT thread safe. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Yevgeny Kliteynik, Mellanox -* -*********/ - -/****f* OpenSM: Unicast Cache/osm_ucast_cache_invalidate -* NAME -* osm_ucast_cache_invalidate -* -* DESCRIPTION -* The osm_ucast_cache_invalidate function purges the -* unicast cache and marks the cache as invalid. -* -* SYNOPSIS -*/ -void osm_ucast_cache_invalidate(struct osm_ucast_mgr *p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to the ucast mgr object. -* -* RETURN VALUE -* This function does not return any value. -* -* NOTES -* -* SEE ALSO -* Unicast Manager object -*********/ - -/****f* OpenSM: Unicast Cache/osm_ucast_cache_check_new_link -* NAME -* osm_ucast_cache_check_new_link -* -* DESCRIPTION -* The osm_ucast_cache_check_new_link checks whether -* the newly discovered link still allows us to use -* cached unicast routing. -* -* SYNOPSIS -*/ -void osm_ucast_cache_check_new_link(struct osm_ucast_mgr *p_mgr, - osm_node_t * p_node_1, uint8_t port_num_1, - osm_node_t * p_node_2, uint8_t port_num_2); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to the unicast manager object. -* -* physp1 -* [in] Pointer to the first physical port of the link. -* -* physp2 -* [in] Pointer to the second physical port of the link. -* -* RETURN VALUE -* This function does not return any value. -* -* NOTES -* The function checks whether the link was previously -* cached/dropped or is this a completely new link. -* If it decides that the new link makes cached routing -* invalid, the cache is purged and marked as invalid. -* -* SEE ALSO -* Unicast Cache object -*********/ - -/****f* OpenSM: Unicast Cache/osm_ucast_cache_add_link -* NAME -* osm_ucast_cache_add_link -* -* DESCRIPTION -* The osm_ucast_cache_add_link adds link to the cache. -* -* SYNOPSIS -*/ -void osm_ucast_cache_add_link(struct osm_ucast_mgr *p_mgr, - osm_physp_t * physp1, osm_physp_t * physp2); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to the unicast manager object. -* -* physp1 -* [in] Pointer to the first physical port of the link. -* -* physp2 -* [in] Pointer to the second physical port of the link. -* -* RETURN VALUE -* This function does not return any value. -* -* NOTES -* Since the cache operates with ports and not links, -* the function adds two port entries (both sides of the -* link) to the cache. -* If it decides that the dropped link makes cached routing -* invalid, the cache is purged and marked as invalid. -* -* SEE ALSO -* Unicast Manager object -*********/ - -/****f* OpenSM: Unicast Cache/osm_ucast_cache_add_node -* NAME -* osm_ucast_cache_add_node -* -* DESCRIPTION -* The osm_ucast_cache_add_node adds node and all -* its links to the cache. -* -* SYNOPSIS -*/ -void osm_ucast_cache_add_node(struct osm_ucast_mgr *p_mgr, osm_node_t * p_node); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to the unicast manager object. -* -* p_node -* [in] Pointer to the node object that should be cached. -* -* RETURN VALUE -* This function does not return any value. -* -* NOTES -* If the function decides that the dropped node makes cached -* routing invalid, the cache is purged and marked as invalid. -* -* SEE ALSO -* Unicast Manager object -*********/ - -/****f* OpenSM: Unicast Cache/osm_ucast_cache_process -* NAME -* osm_ucast_cache_process -* -* DESCRIPTION -* The osm_ucast_cache_process function writes the -* cached unicast routing on the subnet switches. -* -* SYNOPSIS -*/ -int osm_ucast_cache_process(struct osm_ucast_mgr *p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to the unicast manager object. -* -* RETURN VALUE -* This function returns zero on sucess and non-zero -* value otherwise. -* -* NOTES -* Iterates through all the subnet switches and writes -* the LFTs that were calculated during the last routing -* engine execution to the switches. -* -* SEE ALSO -* Unicast Manager object -*********/ - -END_C_DECLS -#endif /* _OSM_UCAST_CACHE_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_ucast_lash.h b/branches/opensm_3/user/include/opensm/osm_ucast_lash.h deleted file mode 100644 index 3224a75a..00000000 --- a/branches/opensm_3/user/include/opensm/osm_ucast_lash.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2008,2009 System Fabric Works, Inc. All rights reserved. - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2007 Simula Research Laboratory. All rights reserved. - * Copyright (c) 2007 Silicon Graphics Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declarations for LASH algorithm - */ - -#ifndef OSM_UCAST_LASH_H -#define OSM_UCAST_LASH_H - -#include - -enum { - UNQUEUED, - Q_MEMBER, - MST_MEMBER, - MAX_INT = 9999, - NONE = MAX_INT -}; - -typedef struct _cdg_vertex { - int from; - int to; - int seen; - int temp; - int visiting_number; - struct _cdg_vertex *next; - int num_temp_depend; - int num_using_vertex; - int num_deps; - struct vertex_deps { - struct _cdg_vertex *v; - int num_used; - } deps[0]; -} cdg_vertex_t; - -typedef struct _switch { - osm_switch_t *p_sw; - int id; - int used_channels; - int *dij_channels; - int q_state; - mesh_node_t *node; - struct routing_table { - unsigned out_link; - unsigned lane; - } routing_table[0]; -} switch_t; - -typedef struct _lash { - osm_opensm_t *p_osm; - int num_switches; - uint8_t vl_min; - int balance_limit; - switch_t **switches; - cdg_vertex_t ****cdg_vertex_matrix; - int num_mst_in_lane[IB_MAX_NUM_VLS]; - int ***virtual_location; -} lash_t; - -uint8_t osm_get_lash_sl(osm_opensm_t * p_osm, const osm_port_t * p_src_port, - const osm_port_t * p_dst_port); - -#endif diff --git a/branches/opensm_3/user/include/opensm/osm_ucast_mgr.h b/branches/opensm_3/user/include/opensm/osm_ucast_mgr.h deleted file mode 100644 index b4490d68..00000000 --- a/branches/opensm_3/user/include/opensm/osm_ucast_mgr.h +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_ucast_mgr_t. - * This object represents the Unicast Manager object. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_UCAST_MGR_H_ -#define _OSM_UCAST_MGR_H_ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Unicast Manager -* NAME -* Unicast Manager -* -* DESCRIPTION -* The Unicast Manager object encapsulates the information -* needed to control unicast LID forwarding on the subnet. -* -* The Unicast Manager object is thread safe. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -struct osm_sm; -/****s* OpenSM: Unicast Manager/osm_ucast_mgr_t -* NAME -* osm_ucast_mgr_t -* -* DESCRIPTION -* Unicast Manager structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_ucast_mgr { - struct osm_sm *sm; - osm_subn_t *p_subn; - osm_log_t *p_log; - cl_plock_t *p_lock; - uint16_t max_lid; - cl_qlist_t port_order_list; - boolean_t is_dor; - boolean_t some_hop_count_set; - cl_qmap_t cache_sw_tbl; - boolean_t cache_valid; -} osm_ucast_mgr_t; -/* -* FIELDS -* sm -* Pointer to the SM object. -* -* p_subn -* Pointer to the Subnet object for this subnet. -* -* p_log -* Pointer to the log object. -* -* p_lock -* Pointer to the serializing lock. -* -* is_dor -* Dimension Order Routing (DOR) will be done -* -* port_order_list -* List of ports ordered for routing. -* -* some_hop_count_set -* Initialized to FALSE at the beginning of each the min hop -* tables calculation iteration cycle, set to TRUE to indicate -* that some hop count changes were done. -* -* cache_sw_tbl -* Cached switches table. -* -* cache_valid -* TRUE if the unicast cache is valid. -* -* SEE ALSO -* Unicast Manager object -*********/ - -/****f* OpenSM: Unicast Manager/osm_ucast_mgr_construct -* NAME -* osm_ucast_mgr_construct -* -* DESCRIPTION -* This function constructs a Unicast Manager object. -* -* SYNOPSIS -*/ -void osm_ucast_mgr_construct(IN osm_ucast_mgr_t * p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to a Unicast Manager object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows osm_ucast_mgr_destroy -* -* Calling osm_ucast_mgr_construct is a prerequisite to calling any other -* method except osm_ucast_mgr_init. -* -* SEE ALSO -* Unicast Manager object, osm_ucast_mgr_init, -* osm_ucast_mgr_destroy -*********/ - -/****f* OpenSM: Unicast Manager/osm_ucast_mgr_destroy -* NAME -* osm_ucast_mgr_destroy -* -* DESCRIPTION -* The osm_ucast_mgr_destroy function destroys the object, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_ucast_mgr_destroy(IN osm_ucast_mgr_t * p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to the object to destroy. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified -* Unicast Manager object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to -* osm_ucast_mgr_construct or osm_ucast_mgr_init. -* -* SEE ALSO -* Unicast Manager object, osm_ucast_mgr_construct, -* osm_ucast_mgr_init -*********/ - -/****f* OpenSM: Unicast Manager/osm_ucast_mgr_init -* NAME -* osm_ucast_mgr_init -* -* DESCRIPTION -* The osm_ucast_mgr_init function initializes a -* Unicast Manager object for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_ucast_mgr_init(IN osm_ucast_mgr_t * p_mgr, - IN struct osm_sm * sm); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to an osm_ucast_mgr_t object to initialize. -* -* sm -* [in] Pointer to the SM object. -* -* RETURN VALUES -* IB_SUCCESS if the Unicast Manager object was initialized -* successfully. -* -* NOTES -* Allows calling other Unicast Manager methods. -* -* SEE ALSO -* Unicast Manager object, osm_ucast_mgr_construct, -* osm_ucast_mgr_destroy -*********/ - -/****f* OpenSM: Unicast Manager/osm_ucast_mgr_set_fwd_tables -* NAME -* osm_ucast_mgr_set_fwd_tables -* -* DESCRIPTION -* Setup forwarding table for the switch (from prepared new_lft). -* -* SYNOPSIS -*/ -void osm_ucast_mgr_set_fwd_tables(IN osm_ucast_mgr_t * p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to an osm_ucast_mgr_t object. -* -* SEE ALSO -* Unicast Manager -*********/ - -/****f* OpenSM: Unicast Manager/osm_ucast_mgr_build_lid_matrices -* NAME -* osm_ucast_mgr_build_lid_matrices -* -* DESCRIPTION -* Build switches's lid matrices. -* -* SYNOPSIS -*/ -int osm_ucast_mgr_build_lid_matrices(IN osm_ucast_mgr_t * p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to an osm_ucast_mgr_t object. -* -* NOTES -* This function processes the subnet, configuring switches' -* min hops tables (aka lid matrices). -* -* SEE ALSO -* Unicast Manager -*********/ - -/****f* OpenSM: Unicast Manager/osm_ucast_mgr_process -* NAME -* osm_ucast_mgr_process -* -* DESCRIPTION -* Process and configure the subnet's unicast forwarding tables. -* -* SYNOPSIS -*/ -int osm_ucast_mgr_process(IN osm_ucast_mgr_t * p_mgr); -/* -* PARAMETERS -* p_mgr -* [in] Pointer to an osm_ucast_mgr_t object. -* -* RETURN VALUES -* Returns zero on success and negative value on failure. -* -* NOTES -* This function processes the subnet, configuring switch -* unicast forwarding tables. -* -* SEE ALSO -* Unicast Manager, Node Info Response Controller -*********/ -END_C_DECLS -#endif /* _OSM_UCAST_MGR_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_version.h b/branches/opensm_3/user/include/opensm/osm_version.h deleted file mode 100644 index 5f354110..00000000 --- a/branches/opensm_3/user/include/opensm/osm_version.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_VERSION_H_ -#define _OSM_VERSION_H_ - -/****s* OpenSM: Base/OSM_VERSION -* NAME -* OSM_VERSION -* -* DESCRIPTION -* The version string for OpenSM -* -* SYNOPSIS -*/ -#ifdef OSM_VENDOR_INTF_AL -#define OSM_VERSION "OpenSM 3.3.6" " IBAL" -#else -#define OSM_VERSION "OpenSM 3.3.6" " UMAD" -#endif -/********/ - -#endif /* _OSM_VERSION_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_version.h.in b/branches/opensm_3/user/include/opensm/osm_version.h.in deleted file mode 100644 index 9f1f7aaa..00000000 --- a/branches/opensm_3/user/include/opensm/osm_version.h.in +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_VERSION_H_ -#define _OSM_VERSION_H_ - -/****s* OpenSM: Base/OSM_VERSION -* NAME -* OSM_VERSION -* -* DESCRIPTION -* The version string for OpenSM -* -* SYNOPSIS -*/ -#define OSM_VERSION "OpenSM @VERSION@" -/********/ - -#endif /* _OSM_VERSION_H_ */ diff --git a/branches/opensm_3/user/include/opensm/osm_vl15intf.h b/branches/opensm_3/user/include/opensm/osm_vl15intf.h deleted file mode 100644 index a2dfa8f8..00000000 --- a/branches/opensm_3/user/include/opensm/osm_vl15intf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_vl15_t. - * This object represents a VL15 interface object. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_VL15INTF_H_ -#define _OSM_VL15INTF_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/VL15 -* NAME -* VL15 -* -* DESCRIPTION -* The VL15 object encapsulates the information needed by the -* OpenSM to instantiate the VL15 interface. The OpenSM allocates -* one VL15 object per subnet. -* -* The VL15 object transmits MADs to the wire at a throttled rate, -* so as to not overload the VL15 buffering of subnet components. -* OpenSM modules may post VL15 MADs to the VL15 interface as fast -* as possible. -* -* The VL15 object is thread safe. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****d* OpenSM: SM/osm_vl15_state_t -* NAME -* osm_vl15_state_t -* -* DESCRIPTION -* Enumerates the possible states of SM object. -* -* SYNOPSIS -*/ -typedef enum _osm_vl15_state { - OSM_VL15_STATE_INIT = 0, - OSM_VL15_STATE_READY -} osm_vl15_state_t; -/***********/ - -/****s* OpenSM: VL15/osm_vl15_t -* NAME -* osm_vl15_t -* -* DESCRIPTION -* VL15 structure. -* -* This object should be treated as opaque and should -* be manipulated only through the provided functions. -* -* SYNOPSIS -*/ -typedef struct osm_vl15 { - osm_thread_state_t thread_state; - osm_vl15_state_t state; - uint32_t max_wire_smps; - cl_event_t signal; - cl_thread_t poller; - cl_qlist_t rfifo; - cl_qlist_t ufifo; - cl_spinlock_t lock; - osm_vendor_t *p_vend; - osm_log_t *p_log; - osm_stats_t *p_stats; -} osm_vl15_t; -/* -* FIELDS -* thread_state -* Tracks the thread state of the poller thread. -* -* state -* Tracks the state of the VL15 interface itself. -* -* max_wire_smps -* Maximum number of VL15 MADs allowed on the wire at one time. -* -* signal -* Event on which the poller sleeps. -* -* rfifo -* First-in First-out queue for outbound VL15 MADs for which -* a response is expected, aka the "response fifo" -* -* ufifo -* First-in First-out queue for outbound VL15 MADs for which -* no response is expected, aka the "unicast fifo". -* -* poller -* Worker thread pool that services the fifo to transmit VL15 MADs -* -* lock -* Spinlock guarding the FIFO. -* -* p_vend -* Pointer to the vendor transport object. -* -* p_log -* Pointer to the log object. -* -* p_stats -* Pointer to the OpenSM statistics block. -* -* SEE ALSO -* VL15 object -*********/ - -/****f* OpenSM: VL15/osm_vl15_construct -* NAME -* osm_vl15_construct -* -* DESCRIPTION -* This function constructs an VL15 object. -* -* SYNOPSIS -*/ -void osm_vl15_construct(IN osm_vl15_t * p_vl15); -/* -* PARAMETERS -* p_vl15 -* [in] Pointer to a VL15 object to construct. -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Allows calling osm_vl15_destroy. -* -* Calling osm_vl15_construct is a prerequisite to calling any other -* method except osm_vl15_init. -* -* SEE ALSO -* VL15 object, osm_vl15_init, osm_vl15_destroy -*********/ - -/****f* OpenSM: VL15/osm_vl15_destroy -* NAME -* osm_vl15_destroy -* -* DESCRIPTION -* The osm_vl15_destroy function destroys the object, releasing -* all resources. -* -* SYNOPSIS -*/ -void osm_vl15_destroy(IN osm_vl15_t * p_vl15, IN struct osm_mad_pool *p_pool); -/* -* PARAMETERS -* p_vl15 -* [in] Pointer to a VL15 object to destroy. -* -* p_pool -* [in] The pointer to the mad pool to return outstanding mads to -* -* RETURN VALUE -* This function does not return a value. -* -* NOTES -* Performs any necessary cleanup of the specified VL15 object. -* Further operations should not be attempted on the destroyed object. -* This function should only be called after a call to osm_vl15_construct or -* osm_vl15_init. -* -* SEE ALSO -* VL15 object, osm_vl15_construct, osm_vl15_init -*********/ - -/* - Initialization. - Rate specifies the minimum number of microseconds between transmissions - on VL15. -*/ -/****f* OpenSM: VL15/osm_vl15_init -* NAME -* osm_vl15_init -* -* DESCRIPTION -* The osm_vl15_init function initializes a VL15 object for use. -* -* SYNOPSIS -*/ -ib_api_status_t osm_vl15_init(IN osm_vl15_t * p_vl15, IN osm_vendor_t * p_vend, - IN osm_log_t * p_log, IN osm_stats_t * p_stats, - IN int32_t max_wire_smps); -/* -* PARAMETERS -* p_vl15 -* [in] Pointer to an osm_vl15_t object to initialize. -* -* p_vend -* [in] Pointer to the vendor transport object. -* -* p_log -* [in] Pointer to the log object. -* -* p_stats -* [in] Pointer to the OpenSM stastics block. -* -* max_wire_smps -* [in] Maximum number of MADs allowed on the wire at one time. -* -* RETURN VALUES -* IB_SUCCESS if the VL15 object was initialized successfully. -* -* NOTES -* Allows calling other VL15 methods. -* -* SEE ALSO -* VL15 object, osm_vl15_construct, osm_vl15_destroy -*********/ - -/****f* OpenSM: VL15/osm_vl15_post -* NAME -* osm_vl15_post -* -* DESCRIPTION -* Posts a MAD to the VL15 interface for transmission. -* -* SYNOPSIS -*/ -void osm_vl15_post(IN osm_vl15_t * p_vl15, IN osm_madw_t * p_madw); -/* -* PARAMETERS -* p_vl15 -* [in] Pointer to an osm_vl15_t object. -* -* p_madw -* [in] Pointer to a MAD wrapper structure containing the MAD. -* -* RETURN VALUES -* This function does not return a value. -* -* NOTES -* The osm_vl15_construct or osm_vl15_init must be called before using -* this function. -* -* SEE ALSO -* VL15 object, osm_vl15_construct, osm_vl15_init -*********/ - -/****f* OpenSM: VL15/osm_vl15_poll -* NAME -* osm_vl15_poll -* -* DESCRIPTION -* Causes the VL15 Interface to consider sending another QP0 MAD. -* -* SYNOPSIS -*/ -void osm_vl15_poll(IN osm_vl15_t * p_vl); -/* -* PARAMETERS -* p_vl15 -* [in] Pointer to an osm_vl15_t object. -* -* RETURN VALUES -* None. -* -* NOTES -* This function signals the VL15 that it may be possible to send -* a SMP. This function checks three criteria before sending a SMP: -* 1) The VL15 worker is IDLE -* 2) There are no QP0 SMPs currently outstanding -* 3) There is something on the VL15 FIFO to send -* -* SEE ALSO -* VL15 object, osm_vl15_construct, osm_vl15_init -*********/ - -/****f* OpenSM: VL15/osm_vl15_shutdown -* NAME -* osm_vl15_shutdown -* -* DESCRIPTION -* Cleanup all outstanding MADs on both fifo's. -* This is required to return all outstanding MAD resources. -* -* SYNOPSIS -*/ -void osm_vl15_shutdown(IN osm_vl15_t * p_vl, IN osm_mad_pool_t * p_mad_pool); -/* -* PARAMETERS -* p_vl15 -* [in] Pointer to an osm_vl15_t object. -* -* p_mad_pool -* [in] The MAD pool owning the mads. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -* VL15 object, osm_vl15_construct, osm_vl15_init -*********/ - -END_C_DECLS -#endif /* _OSM_VL15INTF_H_ */ diff --git a/branches/opensm_3/user/include/opensm/st.h b/branches/opensm_3/user/include/opensm/st.h deleted file mode 100644 index b6e405d4..00000000 --- a/branches/opensm_3/user/include/opensm/st.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* @(#) st.h 5.1 89/12/14 */ - -#ifndef ST_INCLUDED -#define ST_INCLUDED - -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -#define st_ptr_t uintptr_t -typedef st_ptr_t st_data_t; - -#define ST_DATA_T_DEFINED - -typedef struct st_table st_table; - -struct st_hash_type { - int (*compare) (void *, void *); - st_ptr_t(*hash) (void *); -}; - -struct st_table { - struct st_hash_type *type; - int num_bins; - int num_entries; - struct st_table_entry **bins; -}; - -#define st_is_member(table,key) st_lookup(table,key,(st_data_t *)0) - -enum st_retval { ST_CONTINUE, ST_STOP, ST_DELETE }; - -st_table *st_init_table(struct st_hash_type *); -st_table *st_init_table_with_size(struct st_hash_type *, size_t); -st_table *st_init_numtable(void); -st_table *st_init_numtable_with_size(size_t); -st_table *st_init_strtable(void); -st_table *st_init_strtable_with_size(size_t); -int st_delete(st_table *, st_data_t *, st_data_t *); -int st_delete_safe(st_table *, st_data_t *, st_data_t *, st_data_t); -int st_insert(st_table *, st_data_t, st_data_t); -int st_lookup(st_table *, st_data_t, st_data_t *); -void st_foreach(st_table *, - int (*)(st_data_t key, st_data_t val, st_data_t arg), - st_data_t); -void st_add_direct(st_table *, st_data_t, st_data_t); -void st_free_table(st_table *); -void st_cleanup_safe(st_table *, st_data_t); -st_table *st_copy(st_table *); - -#define ST_NUMCMP ((int (*)()) 0) -#define ST_NUMHASH ((int (*)()) -2) - -#define st_numcmp ST_NUMCMP -#define st_numhash ST_NUMHASH - -/* int st_strhash(void); */ - -END_C_DECLS -#endif /* ST_INCLUDED */ diff --git a/branches/opensm_3/user/include/vendor/osm_mtl_bind.h b/branches/opensm_3/user/include/vendor/osm_mtl_bind.h deleted file mode 100644 index fa0b6f75..00000000 --- a/branches/opensm_3/user/include/vendor/osm_mtl_bind.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_BIND_H_ -#define _OSM_BIND_H_ - -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****s* OpenSM: Vendor/osm_vendor_mgt_bind -* NAME -* osm_vendor_mgt_bind_t -* -* DESCRIPTION -* Tracks the handles returned by IB_MGT to the SMI and GSI -* Nulled on init of the vendor obj. Populated on first bind. -* -* SYNOPSIS -*/ -typedef struct _osm_vendor_mgt_bind { - boolean_t smi_init, gsi_init; - IB_MGT_mad_hndl_t smi_mads_hdl; - IB_MGT_mad_hndl_t gsi_mads_hdl; - struct _osm_mtl_bind_info *smi_p_bind; -} osm_vendor_mgt_bind_t; - -/* -* FIELDS -* smi_mads_hdl -* Handle returned by IB_MGT_get_handle to the IB_MGT_SMI -* -* gsi_mads_hdl -* Handle returned by IB_MGT_get_handle to the IB_MGT_GSI -* -* SEE ALSO -*********/ - -/****s* OpenSM: Vendor osm_mtl_bind_info_t -* NAME -* osm_mtl_bind_info_t -* -* DESCRIPTION -* Handle to the result of binding a class callbacks to IB_MGT. -* -* SYNOPSIS -*/ -typedef struct _osm_mtl_bind_info { - IB_MGT_mad_hndl_t mad_hndl; - osm_vendor_t *p_vend; - void *client_context; - VAPI_hca_hndl_t hca_hndl; - VAPI_hca_id_t hca_id; - uint8_t port_num; - osm_vend_mad_recv_callback_t rcv_callback; - osm_vend_mad_send_err_callback_t send_err_callback; - osm_mad_pool_t *p_osm_pool; -} osm_mtl_bind_info_t; - -/* -* FIELDS -* mad_hndl -* the handle returned from the registration in IB_MGT -* -* p_vend -* Pointer to the vendor object. -* -* client_context -* User's context passed during osm_bind -* -* hca_id -* HCA Id we bind to. -* -* port_num -* Port number (within the HCA) of the bound port. -* -* rcv_callback -* OSM Callback function to be called on receive of MAD. -* -* send_err_callback -* OSM Callback to be called on send error. -* -* p_osm_pool -* Points to the MAD pool used by OSM -* -* -* SEE ALSO -*********/ -ib_api_status_t -osm_mtl_send_mad(IN osm_mtl_bind_info_t * p_bind, IN osm_madw_t * const p_madw); - -END_C_DECLS -#endif // _OSM_BIND_H_ diff --git a/branches/opensm_3/user/include/vendor/osm_pkt_randomizer.h b/branches/opensm_3/user/include/vendor/osm_pkt_randomizer.h deleted file mode 100644 index db32bbc3..00000000 --- a/branches/opensm_3/user/include/vendor/osm_pkt_randomizer.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_subn_t. - * This object represents an IBA subnet. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_PKT_RANDOMIZER_H_ -#define _OSM_PKT_RANDOMIZER_H_ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Packet Randomizer -* NAME -* Packet Randomizer -* -* DESCRIPTION -* The Packet Randomizer object encapsulates the information needed for -* randomly dropping packets for debug. -* -* The Packet Randomizer object is not thread safe, thus callers must -* provide serialization. -* -* AUTHOR -* Yael Kalka, Mellanox -* -*********/ -/****d* OpenSM: Pkt_Randomizer/osm_pkt_randomizer_t -* NAME -* osm_pkt_randomizer_t -* -* DESCRIPTION -* Packet randomizer structure. This structure contains the various -* parameters needed by the packet randomizer. -* -* SYNOPSIS -*/ -typedef struct _osm_pkt_randomizer { - uint8_t osm_pkt_drop_rate; - uint8_t osm_pkt_num_unstable_links; - uint8_t osm_pkt_unstable_link_rate; - osm_dr_path_t *fault_dr_paths; - uint8_t num_paths_initialized; -} osm_pkt_randomizer_t; - -/* -* FIELDS -* -* osm_pkt_drop_rate -* Used by the randomizer whether to drop a packet or not. -* Taken from the global variable OSM_PKT_DROP_RATE. If not given or -* if set to zero, the randomizer will not run. -* -* osm_pkt_num_unstable_links -* The number of unstable links to be drawn. -* Taken from the global variable OSM_PKT_NUM_UNSTABLE_LINKS. default = 1. -* -* osm_pkt_unstable_link_rate -* Used by the randomizer whether to add a packet to the unstable links -* list or not. Taken from the global variable OSM_PKT_UNSTABLE_LINK_RATE. -* default = 20. -* -* fault_dr_path -* Array of osm_dr_path_t objects, that includes all the dr_paths -* that are marked as errored. -* -* num_paths_initialized -* Describes the number of paths from the fault_dr_paths array that -* have already been initialized. -* -* SEE ALSO -* Packet Randomizer object -*********/ - -/****f* OpenSM: Pkt_Randomizer/osm_pkt_randomizer_init -* NAME -* osm_pkt_randomizer_init -* -* DESCRIPTION -* The osm_pkt_randomizer_init function initializes the Packet Randomizer object. -* -* SYNOPSIS -*/ -ib_api_status_t -osm_pkt_randomizer_init(IN OUT osm_pkt_randomizer_t ** pp_pkt_randomizer, - IN osm_log_t * p_log); -/* -* PARAMETERS -* p_pkt_randomizer -* [in] Pointer to the Packet Randomizer object to be initialized. -* -* p_log -* [in] Pointer to the log object. -* -* RETURN VALUE -* None -* -* NOTES -* -* SEE ALSO -* -*********/ - -/****f* OpenSM: Pkt_Randomizer/osm_pkt_randomizer_destroy -* NAME -* osm_pkt_randomizer_destroy -* -* DESCRIPTION -* The osm_pkt_randomizer_destroy function destroys the Packet Randomizer object. -* -* SYNOPSIS -*/ -void -osm_pkt_randomizer_destroy(IN osm_pkt_randomizer_t ** pp_pkt_randomizer, - IN osm_log_t * p_log); -/* -* PARAMETERS -* p_pkt_randomizer -* [in] Pointer to the Packet Randomizer object to be destroyed. -* -* p_log -* [in] Pointer to the log object. -* -* RETURN VALUE -* None -* -* NOTES -* -* SEE ALSO -* -*********/ - -/****f* OpenSM: Pkt_Randomizer/osm_pkt_randomizer_madw_drop -* NAME -* osm_pkt_randomizer_madw_drop -* -* DESCRIPTION -* The osm_pkt_randomizer_madw_drop is base function of the packet -* randomizer. -* It decides according to different random criteria whether or not -* the packet received should be dropped (according to its dr_path). -* This function is relevant both for mads sent by the SM and mads -* received by the SM. -* It returns TRUE if the mad should be dropped, and FALSE otherwise. -* -* SYNOPSIS -*/ -boolean_t -osm_pkt_randomizer_mad_drop(IN osm_log_t * p_log, - IN osm_pkt_randomizer_t * p_pkt_randomizer, - IN const ib_mad_t * p_mad); -/* -* PARAMETERS -* p_subn -* [in] Pointer to the Subnet object for this subnet. -* -* p_log -* [in] Pointer to the log object. -* -* p_mad -* [in] Pointer to the ib_mad_t mad to be checked. -* -* RETURN VALUE -* TRUE if the mad should be dropped. FALSE otherwise. -* -* NOTES -* -* SEE ALSO -* -*********/ - -END_C_DECLS -#endif /* _OSM_PKT_RANDOMIZER_H */ diff --git a/branches/opensm_3/user/include/vendor/osm_ts_useraccess.h b/branches/opensm_3/user/include/vendor/osm_ts_useraccess.h deleted file mode 100644 index d30b8953..00000000 --- a/branches/opensm_3/user/include/vendor/osm_ts_useraccess.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#include "ts_ib_useraccess.h" - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -typedef struct ib_user_mad_filter osm_ts_user_mad_filter; -typedef struct ib_set_port_info_ioctl osm_ts_set_port_info_ioctl; -typedef struct ib_get_port_info_ioctl osm_ts_get_port_info_ioctl; -typedef struct ib_gid_entry_ioctl osm_ts_gid_entry_ioctl; - -END_C_DECLS diff --git a/branches/opensm_3/user/include/vendor/osm_umadt.h b/branches/opensm_3/user/include/vendor/osm_umadt.h deleted file mode 100644 index d4e240f8..00000000 --- a/branches/opensm_3/user/include/vendor/osm_umadt.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_mad_wrapper_t. - * This object represents the context wrapper for OpenSM MAD processing. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_UMADT_h_ -#define _OSM_UMADT_h_ - -#include "iba/ib_types.h" -#include -#include -#include "umadt.h" -#include "ibt.h" - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS - -typedef struct _umadt_obj_t { - void *umadt_handle; - UMADT_INTERFACE uMadtInterface; - IBT_INTERFACE IbtInterface; - boolean init_done; - cl_spinlock_t register_lock; - cl_qlist_t register_list; - osm_log_t *p_log; - uint32_t timeout; - -} umadt_obj_t; -/*********/ - -/****s* OpenSM: Umadt MAD Wrapper/osm_bind_info -* NAME -* osm_bind_info -* -* DESCRIPTION -* Context needed for processing individual MADs -* -* SYNOPSIS -*/ - -typedef struct _mad_bind_info_t { - cl_list_item_t list_item; - umadt_obj_t *p_umadt_obj; - osm_mad_pool_t *p_mad_pool; - osm_vend_mad_recv_callback_t mad_recv_callback; - void *client_context; - cl_thread_t recv_processor_thread; - cl_spinlock_t trans_ctxt_lock; - cl_qlist_t trans_ctxt_list; - cl_timer_t timeout_timer; - cl_spinlock_t timeout_list_lock; - cl_qlist_t timeout_list; - RegisterClassStruct umadt_reg_class; - MADT_HANDLE umadt_handle; /* Umadt type */ - -} mad_bind_info_t; - -typedef struct _trans_context_t { - cl_list_item_t list_item; - uint64_t trans_id; - uint64_t sent_time; /* micro secs */ - void *context; -} trans_context_t; - -/* -* FIELDS -* list_item -* List linkage for pools and lists. MUST BE FIRST MEMBER! -* -* p_mad_pool -* Pointer to the MAD pool to be used by mads with this bind handle. -* -* mad_recv_callback -* Callback function called by the mad receive processor. -* -* client_context -* context to be passed to the receive callback. -* -* recv_processor_thread -* Thread structure for the receive processor thread. -* -* umadt_reg_class -* Umadt register class struct used to register with Umadt. -* -* umadt_handle -* Umadt returns this handle from a registration call. The transport layer -* uses this handle to talk to Umadt. -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /*_OSM_UMADT_h_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor.h b/branches/opensm_3/user/include/vendor/osm_vendor.h deleted file mode 100644 index b7636c46..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Include file used by OpenSM to pull in the correct vendor file. - */ - -/* - this is the generic include file which includes - the proper vendor specific file -*/ -#include - -#if defined( OSM_VENDOR_INTF_TEST ) -#include -#elif defined( OSM_VENDOR_INTF_UMADT ) -#include -#elif defined( OSM_VENDOR_INTF_MTL ) -/* HACK - I do not know how to prevent complib from loading kernel H files */ -#undef __init -#include -#elif defined( OSM_VENDOR_INTF_TS ) -#undef __init -#include -#elif defined( OSM_VENDOR_INTF_ANAFA ) -#undef __init -#include -#elif defined( OSM_VENDOR_INTF_SIM ) -#undef __init -#include -#elif defined( OSM_VENDOR_INTF_OPENIB ) -#include -#elif defined( OSM_VENDOR_INTF_AL ) -#include -#else -#error No MAD Interface selected! -#error Choose an interface in osm_config.h -#endif diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_al.h b/branches/opensm_3/user/include/vendor/osm_vendor_al.h deleted file mode 100644 index 0a942669..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_al.h +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_mad_wrapper_t. - * This object represents the context wrapper for OpenSM MAD processing. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_VENDOR_AL_H_ -#define _OSM_VENDOR_AL_H_ - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Vendor AL -* NAME -* Vendor AL -* -* DESCRIPTION -* -* The Vendor AL object is thread safe. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* Enable various hacks to compensate for bugs in external code... -* -* -* AUTHOR -* -* -*********/ -/****h* OpenSM/Vendor Access Layer (AL) -* NAME -* Vendor AL -* -* DESCRIPTION -* This file is the vendor specific file for the AL Infiniband API. -* -* AUTHOR -* Steve King, Intel -* -*********/ -#define OSM_AL_SQ_SGE 256 -#define OSM_AL_RQ_SGE 256 -#define OSM_DEFAULT_RETRY_COUNT 3 -/* AL supports RMPP */ -#define VENDOR_RMPP_SUPPORT 1 -/****s* OpenSM: Vendor AL/osm_ca_info_t -* NAME -* osm_ca_info_t -* -* DESCRIPTION -* Structure containing information about local Channle Adapters. -* -* SYNOPSIS -*/ -typedef struct _osm_ca_info { - ib_net64_t guid; - size_t attr_size; - ib_ca_attr_t *p_attr; - -} osm_ca_info_t; -/* -* FIELDS -* guid -* Node GUID of the local CA. -* -* attr_size -* Size of the CA attributes for this CA. -* -* p_attr -* Pointer to dynamicly allocated CA Attribute structure. -* -* SEE ALSO -*********/ - -/****f* OpenSM: CA Info/osm_ca_info_get_num_ports -* NAME -* osm_ca_info_get_num_ports -* -* DESCRIPTION -* Returns the number of ports owned by this CA. -* -* SYNOPSIS -*/ -static inline uint8_t -osm_ca_info_get_num_ports(IN const osm_ca_info_t * const p_ca_info) -{ - return (p_ca_info->p_attr->num_ports); -} - -/* -* PARAMETERS -* p_ca_info -* [in] Pointer to a CA Info object. -* -* RETURN VALUE -* Returns the number of ports owned by this CA. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: CA Info/osm_ca_info_get_port_guid -* NAME -* osm_ca_info_get_port_guid -* -* DESCRIPTION -* Returns the port GUID of the specified port owned by this CA. -* -* SYNOPSIS -*/ -static inline ib_net64_t -osm_ca_info_get_port_guid(IN const osm_ca_info_t * const p_ca_info, - IN const uint8_t index) -{ - return (p_ca_info->p_attr->p_port_attr[index].port_guid); -} - -/* -* PARAMETERS -* p_ca_info -* [in] Pointer to a CA Info object. -* -* index -* [in] Port "index" for which to retrieve the port GUID. -* The index is the offset into the ca's internal array -* of port attributes. -* -* RETURN VALUE -* Returns the port GUID of the specified port owned by this CA. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: CA Info/osm_ca_info_get_port_num -* NAME -* osm_ca_info_get_port_num -* -* DESCRIPTION -* Returns the port number of the specified port owned by this CA. -* Port numbers start with 1 for HCA's. -* -* SYNOPSIS -*/ -static inline uint8_t -osm_ca_info_get_port_num(IN const osm_ca_info_t * const p_ca_info, - IN const uint8_t index) -{ - return (p_ca_info->p_attr->p_port_attr[index].port_num); -} - -/* -* PARAMETERS -* p_ca_info -* [in] Pointer to a CA Info object. -* -* index -* [in] Port "index" for which to retrieve the port GUID. -* The index is the offset into the ca's internal array -* of port attributes. -* -* RETURN VALUE -* Returns the port GUID of the specified port owned by this CA. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: CA Info/osm_ca_info_get_ca_guid -* NAME -* osm_ca_info_get_ca_guid -* -* DESCRIPTION -* Returns the GUID of the specified CA. -* -* SYNOPSIS -*/ -static inline ib_net64_t -osm_ca_info_get_ca_guid(IN const osm_ca_info_t * const p_ca_info) -{ - return (p_ca_info->p_attr->ca_guid); -} - -/* -* PARAMETERS -* p_ca_info -* [in] Pointer to a CA Info object. -* -* RETURN VALUE -* Returns the GUID of the specified CA. -* -* NOTES -* -* SEE ALSO -*********/ - -/****s* OpenSM: Vendor AL/osm_bind_handle_t -* NAME -* osm_bind_handle_t -* -* DESCRIPTION -* handle returned by the vendor transport bind call. -* -* SYNOPSIS -*/ -typedef struct _osm_vendor -{ - ib_al_handle_t h_al; - osm_log_t *p_log; - uint32_t ca_count; - osm_ca_info_t *p_ca_info; - uint32_t timeout; - ib_ca_handle_t h_ca; - ib_pd_handle_t h_pd; - -} osm_vendor_t; -/* -* FIELDS -* h_al -* Handle returned by AL open call (ib_open_al). -* -* p_log -* Pointer to the log object. -* -* ca_count -* Number of CA's in the array pointed to by p_ca_info. -* -* p_ca_info -* Pointer to dynamically allocated array of CA info objects. -* -* h_pool -* MAD Pool handle returned by ib_create_mad_pool at init time. -* -* timeout -* Transaction timeout time in milliseconds. -* -* SEE ALSO -*********/ - -#define OSM_BIND_INVALID_HANDLE 0 - -/****s* OpenSM: Vendor AL/osm_bind_handle_t -* NAME -* osm_bind_handle_t -* -* DESCRIPTION -* handle returned by the vendor transport bind call. -* -* SYNOPSIS -*/ -typedef void *osm_bind_handle_t; -/***********/ - -/****s* OpenSM/osm_vend_wrap_t -* NAME -* AL Vendor MAD Wrapper -* -* DESCRIPTION -* AL specific MAD wrapper. AL transport layer uses this for -* housekeeping. -* -* SYNOPSIS -*********/ -typedef struct _osm_vend_wrap_t -{ - uint32_t size; - osm_bind_handle_t h_bind; - ib_mad_element_t *p_elem; - ib_av_handle_t h_av; - void* p_resp_madw; - -} osm_vend_wrap_t; -/* -* FIELDS -* size -* Size of the allocated MAD -* -* h_bind -* Bind handle used on this transaction -* -* p_elem -* Pointer to the mad element structure associated with -* this mad. -* -* h_av -* Address vector handle used for this transaction. -* -* p_resp_madw -* Pointer to the mad wrapper structure used to hold the pending -* reponse to the mad, if any. If a response is expected, the -* wrapper for the reponse is allocated during the send call. -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_VENDOR_AL_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_api.h b/branches/opensm_3/user/include/vendor/osm_vendor_api.h deleted file mode 100644 index 9c6a4106..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_api.h +++ /dev/null @@ -1,487 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Specification of the OpenSM transport API. This API is OpenSM's view - * of the Infiniband transport. - */ - -#ifndef _OSM_VENDOR_API_H_ -#define _OSM_VENDOR_API_H_ - -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****s* OpenSM Vendor API/osm_vend_mad_recv_callback_t -* NAME -* osm_vend_mad_recv_callback_t -* -* DESCRIPTION -* Function prototype for the vendor MAD receive callback. -* The vendor layer calls this function for MAD receives. -* -* SYNOPSIS -*/ -typedef void (*osm_vend_mad_recv_callback_t) (IN osm_madw_t * p_madw, - IN void *bind_context, - IN osm_madw_t * p_req_madw); -/* -* PARAMETERS -* p_madw -* [in] The received MAD wrapper. -* -* bind_context -* [in] User context supplied during the bind call. -* -* p_req_madw -* [in] Pointer to the request mad wrapper that generated this response. -* If the inbound MAD is not a response, this field is NULL. -* -* RETURN VALUES -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****s* OpenSM Vendor API/osm_vend_mad_send_err_callback_t -* NAME -* osm_vend_mad_send_err_callback_t -* -* DESCRIPTION -* Function prototype for the vendor send failure callback. -* The vendor layer calls this function when MADs expecting -* a response are completed in error, most likely due to a -* timeout. -* -* SYNOPSIS -*/ -typedef void (*osm_vend_mad_send_err_callback_t) (IN void *bind_context, - IN osm_madw_t * p_madw); -/* -* PARAMETERS -* bind_context -* [in] User context supplied during the bind call. -* -* p_madw -* [in] Pointer to the request mad that failed. -* -* RETURN VALUES -* None. -* -* NOTES -* The vendor layer does not call this function (or any other) -* for MADs that were not expecting a response. -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_new -* NAME -* osm_vendor_new -* -* DESCRIPTION -* Allocates and initializes a new osm_vendor_t object. -* OpenSM calls this function before any other in the vendor API. -* This object is passed as a parameter to all other vendor functions. -* -* SYNOPSIS -*/ -osm_vendor_t *osm_vendor_new(IN osm_log_t * const p_log, - IN const uint32_t timeout); -/* -* PARAMETERS -* p_log -* [in] Pointer to the log object to use. -* -* timeout -* [in] transaction timeout -* -* RETURN VALUES -* Returns a pointer to the vendor object. -* -* NOTES -* -* SEE ALSO -*********/ - -/****s* OpenSM Vendor API/osm_vendor_delete -* NAME -* osm_vendor_delete -* -* DESCRIPTION -* Dealocate the vendor object. -* -* SYNOPSIS -*/ -void osm_vendor_delete(IN osm_vendor_t ** const pp_vend); -/* -* PARAMETERS -* pp_vend -* [in/out] pointer to pointer to vendor objcet to be deleted -* -* RETURN VALUES -* None -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_get_all_port_attr -* NAME -* osm_vendor_get_all_port_attr -* -* DESCRIPTION -* Returns an array of available port attribute structures. -* -* SYNOPSIS -*/ -ib_api_status_t -osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend, - IN ib_port_attr_t * const p_attr_array, - IN uint32_t * const p_num_ports); -/* -* PARAMETERS -* p_vend -* [in] Pointer to the vendor object to initialize. -* -* p_attr_array -* [in/out] Pointer to pre-allocated array of port attributes. -* If it is NULL - then the command only updates the p_num_ports, -* and return IB_INSUFFICIENT_MEMORY. -* -* p_num_ports -* [in/out] Pointer to a variable to hold the total number of ports -* available on the local machine. -* -* RETURN VALUES -* IB_SUCCESS on success. -* IB_INSUFFICIENT_MEMORY if the attribute array was not large enough. -* The number of attributes needed is returned in num_guids. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_init -* NAME -* osm_vendor_init -* -* DESCRIPTION -* The osm_vendor_init function initializes the vendor transport layer. -* -* SYNOPSIS -*/ -ib_api_status_t -osm_vendor_init(IN osm_vendor_t * const p_vend, IN osm_log_t * const p_log, - IN const uint32_t timeout); -/* -* PARAMETERS -* p_vend -* [in] Pointer to the vendor object to initialize. -* -* p_log -* [in] Pointer to OpenSM's log object. Vendor code may -* use the log object to send messages to OpenSM's log. -* -* timeout -* [in] Transaction timeout value in milliseconds. -* A value of 0 disables timeouts. -* -* RETURN VALUE -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_bind -* NAME -* osm_vendor_bind -* -* DESCRIPTION -* The osm_vendor_bind function registers with the vendor transport layer -* per Mad Class per PortGuid for mad transport capability. -* -* SYNOPSIS -*/ -osm_bind_handle_t -osm_vendor_bind(IN osm_vendor_t * const p_vend, - IN osm_bind_info_t * const p_bind_info, - IN osm_mad_pool_t * const p_mad_pool, - IN osm_vend_mad_recv_callback_t mad_recv_callback, - IN osm_vend_mad_send_err_callback_t send_err_callback, - IN void *context); -/* -* PARAMETERS -* p_vend -* [in] pointer to the vendor object -* -* p_osm_bind_info -* [in] pointer to a struct defining the type of bind to perform. -* -* p_mad_pool -* [in] pointer to a mad wrappers pool to be used for allocating -* mad wrappers on send and receive. -* -* mad_recv_callback -* [in] the callback function to be invoked on mad receive. -* -* send_err_callback -* [in] the callback function to be invoked on mad transaction errors. -* -* context -* [in] the context to be provided to the callbacks as bind_ctx. -* -* RETURN VALUE -* On success, a valid bind handle. -* OSM_BIND_INVALID_HANDLE otherwise. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_unbind -* NAME -* osm_vendor_unbind -* -* DESCRIPTION -* Unbind the given bind handle (obtained by osm_vendor_bind). -* -* SYNOPSIS -*/ -void osm_vendor_unbind(IN osm_bind_handle_t h_bind); -/* -* PARAMETERS -* h_bind -* [in] the bind handle to release. -* -* RETURN VALUE -* NONE. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_get -* NAME -* osm_vendor_get -* -* DESCRIPTION -* Obtain a mad wrapper holding actual mad buffer to be sent via -* the transport. -* -* SYNOPSIS -*/ -ib_mad_t *osm_vendor_get(IN osm_bind_handle_t h_bind, - IN const uint32_t mad_size, - IN osm_vend_wrap_t * const p_vend_wrap); -/* -* PARAMETERS -* h_bind -* [in] the bind handle obtained by calling osm_vendor_bind -* -* mad_size -* [in] the actual mad size required -* -* p_vend_wrap -* [out] the returned mad vendor wrapper -* -* RETURN VALUE -* IB_SUCCESS on succesful completion. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_send -* NAME -* osm_vendor_send -* -* DESCRIPTION -* -* SYNOPSIS -*/ -ib_api_status_t -osm_vendor_send(IN osm_bind_handle_t h_bind, - IN osm_madw_t * const p_madw, IN boolean_t const resp_expected); -/* -* PARAMETERS -* h_bind -* [in] the bind handle obtained by calling osm_vendor_bind -* -* p_madw -* [in] pointer to the Mad Wrapper structure for the MAD to be sent. -* -* resp_expected -* [in] boolean value declaring the mad as a request (expecting a response). -* -* RETURN VALUE -* IB_SUCCESS on succesful completion. -* -* NOTES -* 1. Only mads that expect a response are tracked for transaction competion. -* 2. A mad that does not expect a response is being put back immediately -* after being sent. -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_put -* NAME -* osm_vendor_put -* -* DESCRIPTION -* Return a mad vendor wrapper to the mad pool. It also means that the -* mad buffer is returned to the transport. -* -* SYNOPSIS -*/ -void -osm_vendor_put(IN osm_bind_handle_t h_bind, - IN osm_vend_wrap_t * const p_vend_wrap); -/* -* PARAMETERS -* h_bind -* [in] the bind handle obtained by calling osm_vendor_bind -* -* p_vend_wrap -* [in] pointer to the mad vendor wrapper to put back into the pool. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****i* OpenSM Vendor API/osm_vendor_local_lid_change -* NAME -* osm_vendor_local_lid_change -* -* DESCRIPTION -* Notifies the vendor transport layer that the local address -* has changed. This allows the vendor layer to perform housekeeping -* functions such as address vector updates. -* -* SYNOPSIS -*/ -ib_api_status_t osm_vendor_local_lid_change(IN osm_bind_handle_t h_bind); -/* -* PARAMETERS -* h_bind -* [in] the bind handle obtained by calling osm_vendor_bind -* -* RETURN VALUE -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_set_sm -* NAME -* osm_vendor_set_sm -* -* DESCRIPTION -* Modifies the port info for the bound port to set the "IS_SM" bit -* according to the value given (TRUE or FALSE). -* -* SYNOPSIS -*/ -void osm_vendor_set_sm(IN osm_bind_handle_t h_bind, IN boolean_t is_sm_val); -/* -* PARAMETERS -* h_bind -* [in] bind handle for this port. -* -* is_sm_val -* [in] If TRUE - will set the is_sm to TRUE, if FALSE - will set the -* the is_sm to FALSE. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM Vendor API/osm_vendor_set_debug -* NAME -* osm_vendor_set_debug -* -* DESCRIPTION -* Modifies the vendor specific debug level. -* -* SYNOPSIS -*/ -void osm_vendor_set_debug(IN osm_vendor_t * const p_vend, IN int32_t level); -/* -* PARAMETERS -* p_vend -* [in] vendor handle. -* -* level -* [in] vendor specific debug level. -* -* RETURN VALUE -* None. -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_VENDOR_API_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_ibumad.h b/branches/opensm_3/user/include/vendor/osm_vendor_ibumad.h deleted file mode 100644 index dcf0eeb3..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_ibumad.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_VENDOR_UMAD_H_ -#define _OSM_VENDOR_UMAD_H_ - -#include -#include -#include -#include - -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Vendor Access Layer (UMAD) -* NAME -* Vendor UMAD -* -* DESCRIPTION -* This file is the vendor specific file for the UMAD Infiniband API. -* -* AUTHOR -* -* -*********/ -#define OSM_DEFAULT_RETRY_COUNT 3 -#define OSM_UMAD_MAX_CAS 32 -#define OSM_UMAD_MAX_PORTS_PER_CA 2 -#define OSM_UMAD_MAX_AGENTS 32 - -/****s* OpenSM: Vendor UMAD/osm_ca_info_t -* NAME -* osm_ca_info_t -* -* DESCRIPTION -* Structure containing information about local Channle Adapters. -* -* SYNOPSIS -*/ -typedef struct _osm_ca_info { - ib_net64_t guid; - size_t attr_size; - ib_ca_attr_t *p_attr; -} osm_ca_info_t; -/* -* FIELDS -* guid -* Node GUID of the local CA. -* -* attr_size -* Size of the CA attributes for this CA. -* -* p_attr -* Pointer to dynamicly allocated CA Attribute structure. -* -* SEE ALSO -*********/ - -/****f* OpenSM: CA Info/osm_ca_info_get_num_ports -* NAME -* osm_ca_info_get_num_ports -* -* DESCRIPTION -* Returns the number of ports owned by this CA. -* -* SYNOPSIS -*/ -static inline uint8_t -osm_ca_info_get_num_ports(IN const osm_ca_info_t * const p_ca_info) -{ - return (p_ca_info->p_attr->num_ports); -} - -/* -* PARAMETERS -* p_ca_info -* [in] Pointer to a CA Info object. -* -* RETURN VUMADUE -* Returns the number of ports owned by this CA. -* -* NOTES -* -* SEE ALSO -*********/ - -/****s* OpenSM: Vendor UMAD/osm_bind_handle_t -* NAME -* osm_bind_handle_t -* -* DESCRIPTION -* handle returned by the vendor transport bind call. -* -* SYNOPSIS -*/ -typedef void *osm_bind_handle_t; -/***********/ - -typedef struct _umad_match { - ib_net64_t tid; - void *v; - uint32_t version; -} umad_match_t; - -#define DEFAULT_OSM_UMAD_MAX_PENDING 1000 - -typedef struct vendor_match_tbl { - uint32_t last_version; - int max; - umad_match_t *tbl; -} vendor_match_tbl_t; - -typedef struct _osm_vendor { - osm_log_t *p_log; - uint32_t ca_count; - osm_ca_info_t *p_ca_info; - uint32_t timeout; - int max_retries; - osm_bind_handle_t agents[OSM_UMAD_MAX_AGENTS]; - char ca_names[OSM_UMAD_MAX_CAS][UMAD_CA_NAME_LEN]; - vendor_match_tbl_t mtbl; - umad_port_t umad_port; - pthread_mutex_t cb_mutex; - pthread_mutex_t match_tbl_mutex; - int umad_port_id; - void *receiver; - int issmfd; - char issm_path[256]; -} osm_vendor_t; - -#define OSM_BIND_INVALID_HANDLE 0 - -typedef struct _osm_vend_wrap { - int agent; - int size; - int retries; - void *umad; - osm_bind_handle_t h_bind; -} osm_vend_wrap_t; - -END_C_DECLS -#endif /* _OSM_VENDOR_UMAD_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx.h deleted file mode 100644 index 2b105acd..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007,2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_H_ -#define _OSMV_H_ - -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* - Forward reference -*/ -struct _osm_pkt_randomizer; - -/* The structure behind the OSM Vendor handle */ - -typedef struct _osm_vendor { - - /* for holding common transport info - useful at ibmgt transport */ - void *p_transport_info; - - osm_log_t *p_log; - - /* Uniform timeout for every ACK/single MAD */ - uint32_t resp_timeout; - - /* Uniform timeout for every rmpp transaction */ - uint32_t ttime_timeout; - - /* All the bind handles associated with the vendor */ - cl_qlist_t bind_handles; - - /* run randomizer flag */ - boolean_t run_randomizer; - - /* Packet Randomizer object */ - struct _osm_pkt_randomizer *p_pkt_randomizer; - -} osm_vendor_t; - -/* Repeating the definitions in osm_vendor_api.h */ - -typedef void *osm_bind_handle_t; - -typedef struct _osm_vend_wrap { - ib_mad_t *p_mad; -} osm_vend_wrap_t; - -#ifndef OSM_BIND_INVALID_HANDLE -#define OSM_BIND_INVALID_HANDLE NULL -#endif - -/* The maximum number of retransmissions of the same MAD */ -#define OSM_DEFAULT_RETRY_COUNT 3 - -END_C_DECLS -#endif diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_defs.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_defs.h deleted file mode 100644 index 7bb93432..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_defs.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_DEFS_H_ -#define _OSMV_DEFS_H_ - -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* The maximum number of outstanding MADs an RMPP sender can transmit */ -#define OSMV_RMPP_RECV_WIN 16 -/* Transaction Timeout = OSMV_TXN_TIMEOUT_FACTOR * Response Timeout */ -#define OSMV_TXN_TIMEOUT_FACTOR 128 -/************/ -/****s* OSM Vendor: Types/osmv_bind_obj_t -* NAME -* osmv_bind_obj_t -* -* DESCRIPTION -* The object managing a single bind context. -* The bind handle is a direct pointer to it. -* -* SYNOPSIS -*/ -typedef struct _osmv_bind_obj { - /* Used to signal when the struct is being destroyed */ - struct _osmv_bind_obj *magic_ptr; - - osm_vendor_t /*const */ * p_vendor; - - uint32_t hca_hndl; - uint32_t port_num; - - /* Atomic access protector */ - cl_spinlock_t lock; - - /* is_closing == TRUE --> the handle is being unbound */ - boolean_t is_closing; - - /* Event callbacks */ - osm_vend_mad_recv_callback_t recv_cb; - osm_vend_mad_send_err_callback_t send_err_cb; - /* ... and their context */ - void *cb_context; - - /* A pool to manage MAD wrappers */ - osm_mad_pool_t *p_osm_pool; - - /* each subvendor implements its own transport mgr */ - void *p_transp_mgr; - - /* The transaction DB */ - osmv_txn_mgr_t txn_mgr; - -} osmv_bind_obj_t; - -END_C_DECLS -#endif /* _OSMV_DEFS_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_dispatcher.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_dispatcher.h deleted file mode 100644 index 23a24207..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_dispatcher.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_MAD_DISPATCHER_H_ -#define _OSMV_MAD_DISPATCHER_H_ - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* - * NAME - * osmv_dispatch_mad - * - * DESCRIPTION - * Lower-level MAD dispatcher. - * Implements a switch between the following MAD consumers: - * (1) Non-RMPP consumer (DATA) - * (2) RMPP receiver (DATA/ABORT/STOP) - * (3) RMPP sender (ACK/ABORT/STOP) - * - * PARAMETERS - * h_bind The bind handle - * p_mad_buf The 256 byte buffer of individual MAD - * p_mad_addr The MAD originator's address - */ -ib_api_status_t -osmv_dispatch_mad(IN osm_bind_handle_t h_bind, - IN const void *p_mad_buf, - IN const osm_mad_addr_t * p_mad_addr); - -END_C_DECLS -#endif diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_hca.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_hca.h deleted file mode 100644 index f3477e6f..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_hca.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_HCA_H_ -#define _OSMV_HCA_H_ - -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -#if defined( OSM_VENDOR_INTF_TS_NO_VAPI ) || defined( OSM_VENDOR_INTF_SIM ) -#define VAPI_hca_hndl_t uint32_t -#define VAPI_hca_id_t char* -#endif -ib_api_status_t -osm_vendor_get_guid_ca_and_port(IN osm_vendor_t const *p_vend, - IN ib_net64_t const guid, - OUT uint32_t * p_hca_hndl, - OUT char *p_hca_id, - OUT uint8_t * p_hca_idx, - OUT uint32_t * p_port_num); - -END_C_DECLS -#endif /* _OSMV_HCA_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_inout.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_inout.h deleted file mode 100644 index af06e2f0..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_inout.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_INOUT_H_ -#define _OSMV_INOUT_H_ - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -#ifdef IN -#undef IN -#endif -#ifdef OUT -#undef OUT -#endif -#ifndef OSM_VENDOR_INTF_ANAFA -#ifndef OSM_VENDOR_INTF_TS_NO_VAPI -#ifndef OSM_VENDOR_INTF_SIM -#include -#endif -#endif -#endif -#ifndef IN -#define IN -#endif -#ifndef OUT -#define OUT -#endif -#ifndef OSM_VENDOR_INTF_TS_NO_VAPI -#ifndef OSM_VENDOR_INTF_ANAFA -#ifndef OSM_VENDOR_INTF_SIM -#include -#include -#endif -#endif -#endif -END_C_DECLS -#endif /* _OSMV_INOUT_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_rmpp_ctx.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_rmpp_ctx.h deleted file mode 100644 index dac37492..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_rmpp_ctx.h +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_RMPP_CTX_H -#define _OSMV_RMPP_CTX_H - -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS - -typedef struct _osmv_rmpp_send_ctx { - - uint8_t status; - - uint32_t window_first; - uint32_t window_last; - - uint32_t mad_sz; - boolean_t is_sa_mad; - - cl_event_t event; - - /* Segmentation engine */ - osmv_rmpp_sar_t sar; - osm_log_t *p_log; - -} osmv_rmpp_send_ctx_t; - -typedef struct _osmv_rmpp_recv_ctx { - - boolean_t is_sa_mad; - - uint32_t expected_seg; - - /* Reassembly buffer */ - cl_qlist_t *p_rbuf; - - /* Reassembly engine */ - osmv_rmpp_sar_t sar; - osm_log_t *p_log; - -} osmv_rmpp_recv_ctx_t; - -/* - * NAME - * osmv_rmpp_send_ctx_init - * - * DESCRIPTION - * c'tor for rmpp_send_ctx obj - * - * SEE ALSO - * - */ -ib_api_status_t -osmv_rmpp_send_ctx_init(osmv_rmpp_send_ctx_t * p_ctx, void *arbt_mad, - uint32_t mad_sz, osm_log_t * p_log); - -/* - * NAME - * osmv_rmpp_send_ctx_done - * - * DESCRIPTION - * d'tor for rmpp_send_ctx obj - * - * SEE ALSO - * - */ -void osmv_rmpp_send_ctx_done(IN osmv_rmpp_send_ctx_t * ctx); - -/* - * NAME - * osmv_rmpp_send_ctx_get_wf - * - * DESCRIPTION - * returns number of first segment in current window - * SEE ALSO - * - */ -static inline uint32_t -osmv_rmpp_send_ctx_get_wf(IN const osmv_rmpp_send_ctx_t * p_ctx) -{ - CL_ASSERT(p_ctx); - return p_ctx->window_first; -} - -/* - * NAME - * osmv_rmpp_send_ctx_set_wf - * - * DESCRIPTION - * sets number of first segment in current window - * SEE ALSO - * - */ -static inline void -osmv_rmpp_send_ctx_set_wf(IN osmv_rmpp_send_ctx_t * p_ctx, IN uint32_t val) -{ - CL_ASSERT(p_ctx); - p_ctx->window_first = val; -} - -/* - * NAME - * osmv_rmpp_send_ctx_get_wl - * - * DESCRIPTION - * returns number of last segment in current window - * SEE ALSO - * - */ -static inline uint32_t -osmv_rmpp_send_ctx_get_wl(IN const osmv_rmpp_send_ctx_t * p_send_ctx) -{ - CL_ASSERT(p_send_ctx); - return p_send_ctx->window_last; -} - -/* - * NAME - * osmv_rmpp_send_ctx_set_wl - * - * DESCRIPTION - * sets number of last segment in current window - * SEE ALSO - * - */ -static inline void -osmv_rmpp_send_ctx_set_wl(IN osmv_rmpp_send_ctx_t * p_ctx, IN uint32_t val) -{ - CL_ASSERT(p_ctx); - p_ctx->window_last = val; -} - -/* - * NAME - * osmv_rmpp_send_ctx_get_num_segs - * - * DESCRIPTION - * returns the total number of mad segments to send - * SEE ALSO - * - */ -uint32_t osmv_rmpp_send_ctx_get_num_segs(IN osmv_rmpp_send_ctx_t * p_send_ctx); - -/* - * NAME - * osmv_rmpp_send_ctx_get_seg - * - * DESCRIPTION - * Retrieves the mad segment by seg number (including setting the mad relevant bits & hdrs) - * SEE ALSO - * - */ -ib_api_status_t -osmv_rmpp_send_ctx_get_seg(IN osmv_rmpp_send_ctx_t * p_send_ctx, - IN uint32_t seg_idx, IN uint32_t resp_timeout, - OUT void *p_mad); - -/* - * NAME - * osmv_rmpp_recv_ctx_init - * - * DESCRIPTION - * c'tor for rmpp_recv_ctx obj - * SEE ALSO - * - */ -ib_api_status_t -osmv_rmpp_recv_ctx_init(osmv_rmpp_recv_ctx_t * p_ctx, osm_log_t * p_log); - -/* - * NAME - * osmv_rmpp_recv_ctx_done - * - * DESCRIPTION - * d'tor for rmpp_recv_ctx obj - * SEE ALSO - * - */ -void osmv_rmpp_recv_ctx_done(IN osmv_rmpp_recv_ctx_t * p_ctx); - -/* - * NAME - * osmv_rmpp_recv_ctx_get_es - * - * DESCRIPTION - * retrunes index of expected segement in the curr window - * - */ -static inline uint32_t -osmv_rmpp_recv_ctx_get_es(IN const osmv_rmpp_recv_ctx_t * p_recv_ctx) -{ - CL_ASSERT(p_recv_ctx); - return p_recv_ctx->expected_seg; -} - -/* - * NAME - * osmv_rmpp_recv_ctx_set_es - * - * DESCRIPTION - * sets index of expected segement in the curr window - * - */ -static inline void -osmv_rmpp_recv_ctx_set_es(IN osmv_rmpp_recv_ctx_t * p_recv_ctx, IN uint32_t val) -{ - CL_ASSERT(p_recv_ctx); - p_recv_ctx->expected_seg = val; -} - -/* - * NAME - * osmv_rmpp_recv_ctx_store_madw_seg - * - * DESCRIPTION - * stores rmpp mad in the list - * - */ -ib_api_status_t -osmv_rmpp_recv_ctx_store_mad_seg(IN osmv_rmpp_recv_ctx_t * p_recv_ctx, - IN void *p_mad); - -uint32_t -osmv_rmpp_recv_ctx_get_cur_byte_num(IN osmv_rmpp_recv_ctx_t * p_recv_ctx); - -uint32_t -osmv_rmpp_recv_ctx_get_byte_num_from_first(IN osmv_rmpp_recv_ctx_t * - p_recv_ctx); - -uint32_t -osmv_rmpp_recv_ctx_get_byte_num_from_last(IN osmv_rmpp_recv_ctx_t * p_recv_ctx); - -/* - * NAME - * osmv_rmpp_recv_ctx_reassemble_arbt_mad - * - * DESCRIPTION - * reassembles all rmpp buffs to one big arbitrary mad - */ -ib_api_status_t -osmv_rmpp_recv_ctx_reassemble_arbt_mad(IN osmv_rmpp_recv_ctx_t * p_recv_ctx, - IN uint32_t size, IN void *p_arbt_mad); - -END_C_DECLS -#endif diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_sar.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_sar.h deleted file mode 100644 index 7d82cb4f..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_sar.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_SAR_H_ -#define _OSMV_SAR_H_ - -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS - -typedef struct _osmv_rmpp_sar { - void *p_arbt_mad; - uint32_t data_len; /* total data len in all the mads */ - /* these data members contain only constants */ - uint32_t hdr_sz; - uint32_t data_sz; /*typical data sz for this kind of mad (sa or regular */ - -} osmv_rmpp_sar_t; - -/* - * NAME - * osmv_rmpp_sar_alloc - * - * DESCRIPTION - * c'tor for rmpp_sar object - * - * SEE ALSO - * - */ -ib_api_status_t -osmv_rmpp_sar_init(osmv_rmpp_sar_t * p_sar, void *p_arbt_mad, - uint32_t mad_size, boolean_t is_sa_mad); - -/* - * NAME - * osmv_rmpp_sar_dealloc - * - * DESCRIPTION - * d'tor for rmpp_sar object - * - * SEE ALSO - * - */ -void osmv_rmpp_sar_done(osmv_rmpp_sar_t * p_sar); - -/* - * NAME - * osmv_rmpp_sar_get_mad_seg - * - * DESCRIPTION - * segments the original mad buffer . returnes a mad with the data of the i-th segment - * - * SEE ALSO - * - */ -ib_api_status_t -osmv_rmpp_sar_get_mad_seg(osmv_rmpp_sar_t * p_sar, uint32_t seg_idx, - void *p_buf); - -/* - * NAME - * osmv_rmpp_sar_reassemble_arbt_mad - * - * DESCRIPTION - * gets a qlist of mads and reassmbles to one big mad buffer - * ALSO - deallocates the mad list - * - * SEE ALSO - * - */ -ib_api_status_t -osmv_rmpp_sar_reassemble_arbt_mad(osmv_rmpp_sar_t * p_sar, cl_qlist_t * p_bufs); - -END_C_DECLS -#endif /* _OSMV_SAR_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_sender.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_sender.h deleted file mode 100644 index e8a97d6c..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_sender.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_RMPP_SENDER_H_ -#define _OSMV_RMPP_SENDER_H_ - -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****d* OSM Vendor/osmv_simple_send_madw - * NAME - * osmv_simple_send_madw - * - * DESCRIPTION - * Send a single MAD (256 bytes). - * - * If this MAD requires a response, set the timeout event. - * The function call returns when the MAD's send completion is received. - * - */ -ib_api_status_t -osmv_simple_send_madw(IN osm_bind_handle_t h_bind, - IN osm_madw_t * const p_madw, - IN osmv_txn_ctx_t * p_txn, IN boolean_t is_retry); - -/****d* OSM Vendor/osmv_rmpp_send_madw - * NAME - * osmv_rmpp_send_madw - * - * DESCRIPTION - * Send a single MAD wrapper (of arbitrary length). - * Follow the RMPP semantics - * (segmentation, send window, timeouts etc). - * - * The function call returns either when the whole MAD - * has been acknowledged, or upon error. - */ -ib_api_status_t -osmv_rmpp_send_madw(IN osm_bind_handle_t h_bind, - IN osm_madw_t * const p_madw, - IN osmv_txn_ctx_t * p_txn, IN boolean_t is_rmpp_ds); - -/* - * NAME osmv_rmpp_send_ack - * - * DESCRIPTION - */ - -ib_api_status_t -osmv_rmpp_send_ack(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_req_mad, - IN uint32_t seg_num, - IN uint32_t nwl, IN const osm_mad_addr_t * p_mad_addr); - -/* - * NAME osmv_rmpp_send_nak - * - * DESCRIPTION Send the RMPP ABORT or STOP packet - */ - -ib_api_status_t -osmv_rmpp_send_nak(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_req_mad, - IN const osm_mad_addr_t * p_mad_addr, - IN uint8_t nak_type, IN uint8_t status); - -/* - * NAME osmv_rmpp_snd_error - * - * DESCRIPTION Mark an error status and signal the sender thread to handle it - */ - -static inline void -osmv_rmpp_snd_error(IN osmv_rmpp_send_ctx_t * p_send_ctx, - IN ib_api_status_t status) -{ - p_send_ctx->status = status; - - /* Release the thread waiting on send() - * It will release the transaction's context - */ - cl_event_signal(&p_send_ctx->event); -} - -END_C_DECLS -#endif /* _OSMV_RMPP_SENDER_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_svc.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_svc.h deleted file mode 100644 index ac19294b..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_svc.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_SVC_H_ -#define _OSMV_SVC_H_ - -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -inline static uint8_t osmv_invert_method(IN uint8_t req_method) -{ - switch (req_method) { - case IB_MAD_METHOD_GET_RESP: - /* Not a 1-1 mapping! */ - return IB_MAD_METHOD_GET; - - case IB_MAD_METHOD_GET: - return IB_MAD_METHOD_GET_RESP; - - case IB_MAD_METHOD_SET: - return IB_MAD_METHOD_GET_RESP; - - case IB_MAD_METHOD_GETTABLE_RESP: - return IB_MAD_METHOD_GETTABLE; - - case IB_MAD_METHOD_GETTABLE: - return IB_MAD_METHOD_GETTABLE_RESP; - - case IB_MAD_METHOD_GETMULTI_RESP: - /* Not a 1-1 mapping! */ - return IB_MAD_METHOD_GETMULTI; - - case IB_MAD_METHOD_GETTRACETABLE: - case IB_MAD_METHOD_GETMULTI: - return IB_MAD_METHOD_GETMULTI_RESP; - - case IB_MAD_METHOD_TRAP: - return IB_MAD_METHOD_TRAP_REPRESS; - - case IB_MAD_METHOD_TRAP_REPRESS: - return IB_MAD_METHOD_TRAP; - - case IB_MAD_METHOD_REPORT: - return IB_MAD_METHOD_REPORT_RESP; - - case IB_MAD_METHOD_REPORT_RESP: - return IB_MAD_METHOD_REPORT; - - /* IB_MAD_METHOD_SEND does not have a response */ - case IB_MAD_METHOD_SEND: - return IB_MAD_METHOD_SEND; - - default: - CL_ASSERT(FALSE); - } - - return 0; /* Just make the compiler happy */ -} - -inline static boolean_t osmv_mad_is_rmpp(IN const ib_mad_t * p_mad) -{ - uint8_t rmpp_flags; - CL_ASSERT(NULL != p_mad); - - rmpp_flags = ((ib_rmpp_mad_t *) p_mad)->rmpp_flags; - /* HACK - JUST SA and DevMgt for now - need to add BIS and DevAdm */ - if ((p_mad->mgmt_class != IB_MCLASS_SUBN_ADM) && - (p_mad->mgmt_class != IB_MCLASS_DEV_MGMT)) - return (0); - return (0 != (rmpp_flags & IB_RMPP_FLAG_ACTIVE)); -} - -inline static boolean_t osmv_mad_is_multi_resp(IN const ib_mad_t * p_mad) -{ - CL_ASSERT(NULL != p_mad); - return (IB_MAD_METHOD_GETMULTI == p_mad->method - || IB_MAD_METHOD_GETTRACETABLE == p_mad->method); -} - -inline static boolean_t osmv_mad_is_sa(IN const ib_mad_t * p_mad) -{ - CL_ASSERT(NULL != p_mad); - return (IB_MCLASS_SUBN_ADM == p_mad->mgmt_class); -} - -inline static boolean_t osmv_rmpp_is_abort_stop(IN const ib_mad_t * p_mad) -{ - uint8_t rmpp_type; - CL_ASSERT(p_mad); - - rmpp_type = ((ib_rmpp_mad_t *) p_mad)->rmpp_type; - return (IB_RMPP_TYPE_STOP == rmpp_type - || IB_RMPP_TYPE_ABORT == rmpp_type); -} - -inline static boolean_t osmv_rmpp_is_data(IN const ib_mad_t * p_mad) -{ - CL_ASSERT(p_mad); - return (IB_RMPP_TYPE_DATA == ((ib_rmpp_mad_t *) p_mad)->rmpp_type); -} - -inline static boolean_t osmv_rmpp_is_ack(IN const ib_mad_t * p_mad) -{ - CL_ASSERT(p_mad); - return (IB_RMPP_TYPE_ACK == ((ib_rmpp_mad_t *) p_mad)->rmpp_type); -} - -inline static boolean_t osmv_rmpp_is_first(IN const ib_mad_t * p_mad) -{ - uint8_t rmpp_flags; - CL_ASSERT(NULL != p_mad); - - rmpp_flags = ((ib_rmpp_mad_t *) p_mad)->rmpp_flags; - return (0 != (IB_RMPP_FLAG_FIRST & rmpp_flags)); -} - -inline static boolean_t osmv_rmpp_is_last(IN const ib_mad_t * p_mad) -{ - uint8_t rmpp_flags; - CL_ASSERT(NULL != p_mad); - - rmpp_flags = ((ib_rmpp_mad_t *) p_mad)->rmpp_flags; - return (0 != (IB_RMPP_FLAG_LAST & rmpp_flags)); -} - -inline static uint8_t *osmv_mad_copy(IN const ib_mad_t * p_mad) -{ - uint8_t *p_copy; - - CL_ASSERT(p_mad); - p_copy = malloc(MAD_BLOCK_SIZE); - - if (NULL != p_copy) { - memset(p_copy, 0, MAD_BLOCK_SIZE); - memcpy(p_copy, p_mad, MAD_BLOCK_SIZE); - } - - return p_copy; -} - -/* Should be passed externally from the Makefile */ -/* #define OSMV_RANDOM_DROP 1 */ -#define OSMV_DROP_RATE 0.3 - -inline static boolean_t osmv_random_drop(void) -{ - srand(1); /* Pick a new base */ - return (rand() / (double)RAND_MAX < OSMV_DROP_RATE); -} - -END_C_DECLS -#endif /* _OSMV_SVC_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_transport.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_transport.h deleted file mode 100644 index 94d2a49e..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_transport.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/** - * FILE osmv_transport.h - * AUTHOR Edward Bortnikov - * - * DESCRIPTION - * The lower-level MAD transport interface implementation - * that allows sending a single MAD/receiving a callback - * when a single MAD is received. -*/ - -#ifndef _OSMV_TRANSPORT_H_ -#define _OSMV_TRANSPORT_H_ - -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* - * NAME - * osmv_transport_init - * - * DESCRIPTION - * Setup the MAD transport infrastructure (filters, callbacks etc). - */ -#define VENDOR_HCA_MAXNAMES 32 -ib_api_status_t -osmv_transport_init(IN osm_bind_info_t * p_info, - IN char hca_id[VENDOR_HCA_MAXNAMES], - IN uint8_t hca_idx, IN osmv_bind_obj_t * p_bo); - -/* - * NAME - * osmv_transport_send_mad - * - * DESCRIPTION - * Send a single MAD (256 byte) - */ -ib_api_status_t -osmv_transport_mad_send(IN const osm_bind_handle_t h_bind, - IN void *p_mad, IN const osm_mad_addr_t * p_mad_addr); - -/* - * NAME - * osmv_transport_done - * - * DESCRIPTION - * deallocator of transportation infrastructure - */ -void osmv_transport_done(IN const osm_bind_handle_t h_bind); - -END_C_DECLS -#endif /* _OSMV_TRANSPORT_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_transport_anafa.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_transport_anafa.h deleted file mode 100644 index 891aae41..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_transport_anafa.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/** - * FILE osmv_transport.h - * AUTHOR Edward Bortnikov - * - * DESCRIPTION - * The lower-level MAD transport interface implementation - * that allows sending a single MAD/receiving a callback - * when a single MAD is received. -*/ - -#ifndef _OSMV_TRANSPORT_ANAFA_H_ -#define _OSMV_TRANSPORT_ANAFA_H_ - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -#define OSMV_ANAFA_ID 0 -typedef struct _osmv_TOPSPIN_ANAFA_transport_mgr_ { - int device_fd; - cl_thread_t receiver; -} osmv_TOPSPIN_ANAFA_transport_mgr_t; - -typedef struct _osmv_TOPSPIN_ANAFA_transport_info_ { - int device_fd; -} osmv_TOPSPIN_ANAFA_transport_info_t; - -END_C_DECLS -#endif /* _OSMV_TRANSPORT_ANAFA_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_txn.h b/branches/opensm_3/user/include/vendor/osm_vendor_mlx_txn.h deleted file mode 100644 index 1115dc4f..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mlx_txn.h +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSMV_TXN_H_ -#define _OSMV_TXN_H_ - -#include -#include - -#include -#include -#include - -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS - -typedef enum _osmv_txn_rmpp_state { - - OSMV_TXN_RMPP_NONE = 0, /* Not part of RMPP transaction */ - - OSMV_TXN_RMPP_SENDER, - OSMV_TXN_RMPP_RECEIVER -} osmv_txn_rmpp_state_t; - -typedef struct _osmv_rmpp_txfr { - - osmv_txn_rmpp_state_t rmpp_state; - boolean_t is_rmpp_init_by_peer; - osmv_rmpp_send_ctx_t *p_rmpp_send_ctx; - osmv_rmpp_recv_ctx_t *p_rmpp_recv_ctx; - -} osmv_rmpp_txfr_t; - -typedef struct _osmv_txn_ctx { - - /* The original Transaction ID */ - uint64_t tid; - /* The key by which the Transaction is stored */ - uint64_t key; - - /* RMPP Send/Receive contexts, if applicable */ - osmv_rmpp_txfr_t rmpp_txfr; - - /* A MAD that was sent during the transaction (request or response) */ - osm_madw_t *p_madw; - - /* Reference to a log to enable tracing */ - osm_log_t *p_log; - -} osmv_txn_ctx_t; - -typedef struct _osmv_txn_mgr { - - /* Container of all the transactions */ - cl_qmap_t *p_txn_map; - - /* The timeouts DB */ - cl_event_wheel_t *p_event_wheel; - - /* Reference to a log to enable tracing */ - osm_log_t *p_log; - -} osmv_txn_mgr_t; - -/* * * * * * * osmv_txn_ctx_t functions * * * * * * * * */ - -/* - * NAME - * osmv_txn_init - * - * DESCRIPTION - * allocs & inits the osmv_txn_ctx obj and insert it into the db - * SEE ALSO - * - */ -ib_api_status_t -osmv_txn_init(IN osm_bind_handle_t h_bind, - IN uint64_t tid, IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn); - -/* - * NAME - * osmv_rmpp_txfr_init_sender - * - * DESCRIPTION - * init the rmpp send ctx in the transaction - * - * SEE ALSO - * - */ -ib_api_status_t -osmv_txn_init_rmpp_sender(IN osm_bind_handle_t h_bind, - IN osmv_txn_ctx_t * p_txn, IN osm_madw_t * p_madw); - -/* - * NAME - * osmv_rmpp_txfr_init_receiver - * - * DESCRIPTION - * init the rmpp recv ctx in the transaction - * - * SEE ALSO - * - */ -ib_api_status_t -osmv_txn_init_rmpp_receiver(IN osm_bind_handle_t h_bind, - IN osmv_txn_ctx_t * p_txn, - IN boolean_t is_init_by_peer); - -/* - * NAME - * osmv_txn_done - * - * DESCRIPTION - * destroys txn object and removes it from the db - * - * SEE ALSO - * - */ -void -osmv_txn_done(IN osm_bind_handle_t h_bind, - IN uint64_t key, IN boolean_t is_in_cb); -/* - * NAME - * osmv_txn_get_tid - * - * DESCRIPTION - * returns tid of the transaction - * SEE ALSO - * - */ -static inline uint64_t osmv_txn_get_tid(IN osmv_txn_ctx_t * p_txn) -{ - CL_ASSERT(NULL != p_txn); - return p_txn->tid; -} - -/* - * NAME - * osmv_txn_get_key - * - * DESCRIPTION - * returns key of the transaction - * SEE ALSO - * - */ - -static inline uint64_t osmv_txn_get_key(IN osmv_txn_ctx_t * p_txn) -{ - CL_ASSERT(NULL != p_txn); - return p_txn->key; -} - -/* - * NAME - * osmv_txn_is_rmpp_init_by_peer - * - * DESCRIPTION - * returns whether the rmpp txfr was init by the peer - * - * SEE ALSO - * - */ -static inline boolean_t osmv_txn_is_rmpp_init_by_peer(IN osmv_txn_ctx_t * p_txn) -{ - CL_ASSERT(NULL != p_txn); - return p_txn->rmpp_txfr.is_rmpp_init_by_peer; -} - -/* - * NAME - * osmv_txn_get_rmpp_send_ctx - * - * DESCRIPTION - * returns osmv_rmpp_send_ctx obj - * SEE ALSO - * - */ -static inline osmv_rmpp_send_ctx_t *osmv_txn_get_rmpp_send_ctx(IN osmv_txn_ctx_t - * p_txn) -{ - CL_ASSERT(NULL != p_txn); - return p_txn->rmpp_txfr.p_rmpp_send_ctx; -} - -/* - * NAME - * osmv_txn_get_rmpp_recv_ctx - * - * DESCRIPTION - * returns osmv_rmpp_recv_ctx obj - * SEE ALSO - * - */ -static inline osmv_rmpp_recv_ctx_t *osmv_txn_get_rmpp_recv_ctx(IN osmv_txn_ctx_t - * p_txn) -{ - CL_ASSERT(NULL != p_txn); - return p_txn->rmpp_txfr.p_rmpp_recv_ctx; -} - -/* - * NAME - * osmv_txn_get_rmpp_state - * - * DESCRIPTION - * returns the rmpp role of the transactino ( send/ recv) - * SEE ALSO - * - */ -static inline osmv_txn_rmpp_state_t -osmv_txn_get_rmpp_state(IN osmv_txn_ctx_t * p_txn) -{ - CL_ASSERT(NULL != p_txn); - return p_txn->rmpp_txfr.rmpp_state; -} - -/* - * NAME - * osmv_txn_set_rmpp_state - * - * DESCRIPTION - * sets the rmpp role of the transaction (send/ recv) - * SEE ALSO - * - */ -static inline void -osmv_txn_set_rmpp_state(IN osmv_txn_ctx_t * p_txn, - IN osmv_txn_rmpp_state_t state) -{ - CL_ASSERT(NULL != p_txn); - p_txn->rmpp_txfr.rmpp_state = state; -} - -/* - * NAME - * osmv_txn_get_madw - * - * DESCRIPTION - * returns the requester madw - * SEE ALSO - * - */ -static inline osm_madw_t *osmv_txn_get_madw(IN osmv_txn_ctx_t * p_txn) -{ - CL_ASSERT(NULL != p_txn); - return p_txn->p_madw; -} - -/* - * NAME - * osmv_txn_set_madw - * - * DESCRIPTION - * sets the requester madw - * SEE ALSO - * - */ -static inline void -osmv_txn_set_madw(IN osmv_txn_ctx_t * p_txn, IN osm_madw_t * p_madw) -{ - CL_ASSERT(NULL != p_txn); - p_txn->p_madw = p_madw; -} - -/* - * NAME - * osmv_txn_set_timeout_ev - * - * DESCRIPTION - * - * SEE ALSO - * - */ -ib_api_status_t -osmv_txn_set_timeout_ev(IN osm_bind_handle_t h_bind, - IN uint64_t key, IN uint64_t msec); -/* - * NAME - * osmv_txn_remove_timeout_ev - * - * DESCRIPTION - - * SEE ALSO - * - */ -void osmv_txn_remove_timeout_ev(IN osm_bind_handle_t h_bind, IN uint64_t key); -/* - * NAME - * osmv_txn_lookup - * - * DESCRIPTION - * get a transaction by its key - * - * SEE ALSO - * - */ -ib_api_status_t -osmv_txn_lookup(IN osm_bind_handle_t h_bind, - IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn); - -void osmv_txn_abort_rmpp_txns(IN osm_bind_handle_t h_bind); - -/* * * * * * * * * * * * */ -/* - * NAME - * osmv_txnmgr_init - * - * DESCRIPTION - * c'tor for txn mgr obj - * SEE ALSO - * - */ -ib_api_status_t -osmv_txnmgr_init(IN osmv_txn_mgr_t * p_tx_mgr, - IN osm_log_t * p_log, IN cl_spinlock_t * p_lock); - -/* - * NAME - * osmv_txnmgr_done - * - * DESCRIPTION - * c'tor for txn mgr obj - * SEE ALSO - * - */ -void osmv_txnmgr_done(IN osm_bind_handle_t h_bind); - -void osmv_txn_lock(IN osm_bind_handle_t h_bind); -void osmv_txn_unlock(IN osm_bind_handle_t h_bind); - -inline static uint64_t osmv_txn_uniq_key(IN uint64_t tid) -{ - uint64_t pid = getpid(); - - return ((pid << 32) | (tid & 0xFFFFFFFF)); -} - -END_C_DECLS -#endif /* _OSMV_TXN_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mtl.h b/branches/opensm_3/user/include/vendor/osm_vendor_mtl.h deleted file mode 100644 index 55f5e9e4..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mtl.h +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Definition of interface for the MTL Vendor - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_VENDOR_MTL_H_ -#define _OSM_VENDOR_MTL_H_ - -#undef IN -#undef OUT -#include -#include -#include -#define IN -#define OUT -#include "iba/ib_types.h" -#include "iba/ib_al.h" -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/Vendor MTL -* NAME -* Vendor MTL -* -* DESCRIPTION -* -* The Vendor MTL object is thread safe. -* -* This object should be treated as opaque and should be -* manipulated only through the provided functions. -* -* -* AUTHOR -* -* -*********/ -/****s* OpenSM: Vendor MTL/osm_ca_info_t -* NAME -* osm_ca_info_t -* -* DESCRIPTION -* Structure containing information about local Channle Adapters. -* -* SYNOPSIS -*/ -typedef struct _osm_ca_info { - ib_net64_t guid; - size_t attr_size; - ib_ca_attr_t *p_attr; - -} osm_ca_info_t; - -/* -* FIELDS -* guid -* Node GUID of the local CA. -* -* attr_size -* Size of the CA attributes for this CA. -* -* p_attr -* Pointer to dynamicly allocated CA Attribute structure. -* -* SEE ALSO -*********/ - -#define OSM_DEFAULT_RETRY_COUNT 3 - -/***** OpenSM: Vendor MTL/osm_vendor_t -* NAME -* osm_vendor_t -* -* DESCRIPTION -* The structure defining a vendor -* -* SYNOPSIS -*/ -typedef struct _osm_vendor { - ib_al_handle_t h_al; - osm_log_t *p_log; - uint32_t ca_count; - osm_ca_info_t *p_ca_info; - uint32_t timeout; - struct osm_transaction_mgr_t *p_transaction_mgr; -} osm_vendor_t; - -/* -* FIELDS -* h_al -* Handle returned by MTL open call (ib_open_al). -* -* p_log -* Pointer to the log object. -* -* ca_count -* Number of CA's in the array pointed to by p_ca_info. -* -* p_ca_info -* Pointer to dynamically allocated array of CA info objects. -* -* timeout -* Transaction timeout time in milliseconds. -* -* p_transaction_mgr -* Pointer to Transaction Manager. -* -* SEE ALSO -*********/ - -/****f* OpenSM: Vendor MTL/CA Info/osm_ca_info_get_port_guid -* NAME -* osm_ca_info_get_port_guid -* -* DESCRIPTION -* Returns the port GUID of the specified port owned by this CA. -* -* SYNOPSIS -*/ -static inline ib_net64_t -osm_ca_info_get_port_guid(IN const osm_ca_info_t * const p_ca_info, - IN const uint8_t index) -{ - return (p_ca_info->p_attr->p_port_attr[index].port_guid); -} - -/* -* PARAMETERS -* p_ca_info -* [in] Pointer to a CA Info object. -* -* index -* [in] Port "index" for which to retrieve the port GUID. -* The index is the offset into the ca's internal array -* of port attributes. -* -* RETURN VALUE -* Returns the port GUID of the specified port owned by this CA. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Vendor MTL/CA Info/osm_ca_info_get_num_ports -* NAME -* osm_ca_info_get_num_ports -* -* DESCRIPTION -* Returns the number of ports of the given ca_info -* -* SYNOPSIS -*/ -static inline uint8_t -osm_ca_info_get_num_ports(IN const osm_ca_info_t * const p_ca_info) -{ - return (p_ca_info->p_attr->num_ports); -} - -/* -* PARAMETERS -* p_ca_info -* [in] Pointer to a CA Info object. -* -* RETURN VALUE -* Returns the number of CA ports -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: SM Vendor/osm_vendor_get_guid_ca_and_port - * NAME - * osm_vendor_get_guid_ca_and_port - * - * DESCRIPTION - * Given the vendor obj and a guid - * return the ca id and port number that have that guid - * - * SYNOPSIS - */ -ib_api_status_t -osm_vendor_get_guid_ca_and_port(IN osm_vendor_t * const p_vend, - IN ib_net64_t const guid, - OUT VAPI_hca_hndl_t * p_hca_hndl, - OUT VAPI_hca_id_t * p_hca_id, - OUT uint32_t * p_port_num); - -/* -* PARAMETERS -* p_vend -* [in] Pointer to an osm_vendor_t object. -* -* guid -* [in] The guid to search for. -* -* p_hca_id -* [out] The HCA Id (VAPI_hca_id_t *) that the port is found on. -* -* p_port_num -* [out] Pointer to a port number arg to be filled with the port number with the given guid. -* -* RETURN VALUES -* IB_SUCCESS on SUCCESS -* IB_INVALID_GUID if the guid is notfound on any Local HCA Port -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: Vendor MTL/osm_vendor_get_all_port_attr - * NAME - * osm_vendor_get_all_port_attr - * - * DESCRIPTION - * Fill in the array of port_attr with all available ports on ALL the - * avilable CAs on this machine. - * ALSO - - * UPDATE THE VENDOR OBJECT LIST OF CA_INFO STRUCTS - * - * SYNOPSIS - */ -ib_api_status_t osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend, - IN ib_port_attr_t * - const p_attr_array, - IN uint32_t * const p_num_ports); - -/* -* PARAMETERS -* p_vend -* [in] Pointer to an osm_vendor_t object. -* -* p_attr_array -* [out] Pre-allocated array of port attributes to be filled in -* -* p_num_ports -* [out] The size of the given array. Filled in by the actual numberof ports found. -* -* RETURN VALUES -* IB_SUCCESS if OK -* IB_INSUFFICIENT_MEMORY if not enough place for all ports was provided. -* -* NOTES -* -* SEE ALSO -*********/ - -#define OSM_BIND_INVALID_HANDLE 0 - -/****s* OpenSM: Vendor MTL/osm_bind_handle_t -* NAME -* osm_bind_handle_t -* -* DESCRIPTION -* handle returned by the vendor transport bind call. -* -* SYNOPSIS -*/ -typedef void *osm_bind_handle_t; - -/***********/ - -/****s* OpenSM: Vendor MTL/osm_vend_wrap_t -* NAME -* MTL Vendor MAD Wrapper -* -* DESCRIPTION -* MTL specific MAD wrapper. MTL transport layer uses this for -* housekeeping. -* -* SYNOPSIS -*********/ -typedef struct _osm_vend_wrap_t { - uint32_t size; - osm_bind_handle_t h_bind; - // ib_av_handle_t h_av; - ib_mad_t *mad_buf_p; - void *p_resp_madw; -} osm_vend_wrap_t; - -/* -* FIELDS -* size -* Size of the allocated MAD -* -* h_bind -* Bind handle used on this transaction -* -* h_av -* Address vector handle used for this transaction. -* -* p_resp_madw -* Pointer to the mad wrapper structure used to hold the pending -* reponse to the mad, if any. If a response is expected, the -* wrapper for the reponse is allocated during the send call. -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_VENDOR_MTL_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mtl_hca_guid.h b/branches/opensm_3/user/include/vendor/osm_vendor_mtl_hca_guid.h deleted file mode 100644 index de7c5545..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mtl_hca_guid.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Provides interface over VAPI for obtaining the local ports guids or from guid - * obtaining the HCA and port number. - */ - -#ifndef _OSM_VENDOR_HCA_GUID_H_ -#define _OSM_VENDOR_HCA_GUID_H_ - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****s* OpenSM: Vendor AL/osm_ca_info_t -* NAME -* osm_ca_info_t -* -* DESCRIPTION -* Structure containing information about local Channle Adapters. -* -* SYNOPSIS -*/ -typedef struct _osm_ca_info { - ib_net64_t guid; - size_t attr_size; - ib_ca_attr_t *p_attr; - -} osm_ca_info_t; - -/* -* FIELDS -* guid -* Node GUID of the local CA. -* -* attr_size -* Size of the CA attributes for this CA. -* -* p_attr -* Pointer to dynamicly allocated CA Attribute structure. -* -* SEE ALSO -*********/ - -/****f* OpenSM: CA Info/osm_ca_info_get_port_guid -* NAME -* osm_ca_info_get_port_guid -* -* DESCRIPTION -* Returns the port GUID of the specified port owned by this CA. -* -* SYNOPSIS -*/ -static inline ib_net64_t -osm_ca_info_get_port_guid(IN const osm_ca_info_t * const p_ca_info, - IN const uint8_t index) -{ - return (p_ca_info->p_attr->p_port_attr[index].port_guid); -} - -/* -* PARAMETERS -* p_ca_info -* [in] Pointer to a CA Info object. -* -* index -* [in] Port "index" for which to retrieve the port GUID. -* The index is the offset into the ca's internal array -* of port attributes. -* -* RETURN VALUE -* Returns the port GUID of the specified port owned by this CA. -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: SM Vendor/osm_vendor_get_guid_ca_and_port - * NAME - * osm_vendor_get_guid_ca_and_port - * - * DESCRIPTION - * Given the vendor obj and a guid - * return the ca id and port number that have that guid - * - * SYNOPSIS - */ -ib_api_status_t -osm_vendor_get_guid_ca_and_port(IN osm_vendor_t * const p_vend, - IN ib_net64_t const guid, - OUT VAPI_hca_id_t * p_hca_id, - OUT uint32_t * p_port_num); - -/* -* PARAMETERS -* p_vend -* [in] Pointer to an osm_vendor_t object. -* -* guid -* [in] The guid to search for. -* -* p_hca_id -* [out] The HCA Id (VAPI_hca_id_t *) that the port is found on. -* -* p_port_num -* [out] Pointer to a port number arg to be filled with the port number with the given guid. -* -* RETURN VALUES -* IB_SUCCESS on SUCCESS -* IB_INVALID_GUID if the guid is notfound on any Local HCA Port -* -* NOTES -* -* SEE ALSO -*********/ - -/****f* OpenSM: SM Vendor/osm_vendor_get_all_port_attr - * NAME - * osm_vendor_get_all_port_attr - * - * DESCRIPTION - * Fill in the array of port_attr with all available ports on ALL the - * avilable CAs on this machine. - * ALSO - - * UPDATE THE VENDOR OBJECT LIST OF CA_INFO STRUCTS - * - * SYNOPSIS - */ -ib_api_status_t osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend, - IN ib_port_attr_t * - const p_attr_array, - IN uint32_t * const p_num_ports); - -/* -* PARAMETERS -* p_vend -* [in] Pointer to an osm_vendor_t object. -* -* p_attr_array -* [out] Pre-allocated array of port attributes to be filled in -* -* p_num_ports -* [out] The size of the given array. Filled in by the actual numberof ports found. -* -* RETURN VALUES -* IB_SUCCESS if OK -* IB_INSUFFICIENT_MEMORY if not enough place for all ports was provided. -* -* NOTES -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_VENDOR_HCA_GUID_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_mtl_transaction_mgr.h b/branches/opensm_3/user/include/vendor/osm_vendor_mtl_transaction_mgr.h deleted file mode 100644 index a69be8da..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_mtl_transaction_mgr.h +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Definition of interface for the MTL Vendor - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_TRANSACTION_MGR_H_ -#define _OSM_TRANSACTION_MGR_H_ - - /* - #include - #include - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef OSM_VENDOR_INTF_MTL -#include -#include -#endif - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****s* OpenSM: Transaction Manager/osm_madw_req_t -* NAME -* osm_madw_req_t -* -* DESCRIPTION -* The structure defining each object in the transaction_mgr. -* For every request mad sent, we will save such an object for it. -* -* SYNOPSIS -*/ -typedef struct _osm_madw_req { - cl_list_item_t list_item; - cl_map_item_t map_item; - osm_madw_t *p_madw; - uint64_t waking_time; - uint8_t retry_cnt; - osm_bind_handle_t *p_bind; -} osm_madw_req_t; - -/* -* FIELDS -* list_item -* List item for qlist linkage. Must be first element!! -* -* map_item -* Map item for qmap linkage. -* -* p_madw -* pointer to mad wrapper that is expecting to get a response. -* -* waking_time -* Time stamp (in microseconds) when the p_madw needs to wake up. -* This value is -* cl_get_time_stamp() + timeout during the sending of the mad. -* where timeout should be given in microseconds. -* -* retry_cnt -* The number of outstanding retries to be called. -*********/ - -/****s* OpenSM: Transaction Manager/osm_transaction_mgr_t -* NAME -* osm_transaction_mgr_t -* -* DESCRIPTION -* This structure defines the transaction manager. -* It holds a qlist and a qmap, a lock on the transaction manager, and -* a timer used for the list. -* The manager is responsible for keeping track of every request mad that was -* sent. It is used for finding mads according to their transaction id, and for -* acting as an event wheel - reporting as error each packet was supposed to get -* a response and didn't get one by the timeout time expected. -* -* Both the list and the map hold the osm_madw_req_t objects - one for every madw. -* -* Managing of the list: -* The timer wakes on the timeout of the first madw. If the waking_time is greater than -* the current time - then the mad received a response. If not - the mad didn't get -* its response. -* -* SYNOPSIS -*/ -typedef struct _osm_transaction_mgr { - cl_qmap_t *madw_by_tid_map_p; - cl_qlist_t *madw_reqs_list_p; - cl_spinlock_t transaction_mgr_lock; - cl_timer_t madw_list_timer; -} osm_transaction_mgr_t; - -/* -* FIELDS -* madw_by_tid_map_p -* A qmap with key = transaction id. and value of osm_madw_req_t. -* -* madw_reqs_list_p -* A qlist of all the madw with their waking time. -* -* transaction_mgr_lock -* Lock used on the transaction manager - make sure changes on it are serial. -* -* madw_list_timer -* Timer on the list. -*********/ - -/****f* OpenSM: Transaction Manager/osm_transaction_mgr_init -* NAME -* osm_transaction_mgr_init -* -* DESCRIPTION -* Initialize the transaction manager. -* Will update the p_transaction_mgr in the vendor object with -* the new Transaction Manager created.* -* -* SYNOPSIS -*/ -void osm_transaction_mgr_init(IN osm_vendor_t * const p_vend); - -/* -* PARAMETERS -* p_vend -* [in] Pointer to a Osm Vendor object. -* -*********/ - -/****f* OpenSM: Transaction Manager/osm_transaction_mgr_destroy -* NAME -* osm_transaction_mgr_destroy -* -* DESCRIPTION -* Destroy the transaction manager. -* Will de-allocate all memory allocated by the Transaction -* Manager up to now. -* -* SYNOPSIS -*/ -void osm_transaction_mgr_destroy(IN osm_vendor_t * const p_vend); - -/* -* PARAMETERS -* p_vend -* [in] Pointer to a Osm Vendor object. -* -*********/ - -/****f* OpenSM: Transaction Manager/osm_transaction_mgr_insert_madw -* NAME -* osm_transaction_mgr_insert_madw -* -* DESCRIPTION -* Insert a new madw to the manager. The madw is added with a waking_time, -* Which is equal to the current_time + timeout. This is the maximum time -* that the madw can leave without being handled (e.g - get a response). -* If there are no madw saved in the manager - start the timer for vendor -* timeout period. -* -* SYNOPSIS -*/ -ib_api_status_t -osm_transaction_mgr_insert_madw(IN osm_bind_handle_t * p_bind, - IN osm_madw_t * p_madw); -/* -* PARAMETERS -* p_vend -* [in] Pointer to a mtl bind object. -* -* p_madw -* [in] Pointer to the Mad Wrapper to be added. -* -*********/ - -/****f* OpenSM: Transaction Manager/osm_transaction_mgr_erase_madw -* NAME -* osm_transaction_mgr_erase_madw -* -* DESCRIPTION -* Erase a madw object from the manager. -* The removal is done using the transaction id of the mad - using -* it the madw_p is allocated (in the qmap) and removed from the -* qmap and qlist. -* -* SYNOPSIS -*/ -ib_api_status_t -osm_transaction_mgr_erase_madw(IN osm_vendor_t * const p_vend, - IN ib_mad_t * p_mad); -/* -* PARAMETERS -* p_vend -* [in] Pointer to a Osm Vendor object. -* -* p_mad -* [in] Pointer to the Mad to be removed. -* -*********/ - -/****f* OpenSM: Transaction Manager/osm_transaction_mgr_get_madw_for_tid -* NAME -* osm_transaction_mgr_get_madw_for_tid -* -* DESCRIPTION -* Return the mad wrapper, given the p_mad (and in it the transaction id) -* -* SYNOPSIS -*/ -ib_api_status_t -osm_transaction_mgr_get_madw_for_tid(IN osm_vendor_t * const p_vend, - IN ib_mad_t * const p_mad, - OUT osm_madw_t ** req_madw_p); -/* -* PARAMETERS -* p_vend -* [in] Pointer to a Osm Vendor object. -* -* p_mad -* [in] Pointer to the Mad to be located. -* -* req_madw_p -* [out] Pointer to the mad Wrapper to be found. -* -*********/ - -/****f* OpenSM: Transaction Manager/osm_transaction_mgr_callback -* NAME -* osm_transaction_mgr_callback -* -* DESCRIPTION -* This callback is called on timeout of the timer. -* It checks the time of the head madw in the qlist, and compares it to -* the current time. -* Will send an error callback if the time of the madw is less than the -* current time - this means that the madw wasn't removed in the timeout -* it was supposed to be handled. -* -* SYNOPSIS -*/ -void osm_transaction_mgr_callback(IN void *context); -/* -* PARAMETERS -* context -* [in] void* context -* -*********/ - -END_C_DECLS -#endif /* _OSM_TRANSACTION_MGR_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_sa_api.h b/branches/opensm_3/user/include/vendor/osm_vendor_sa_api.h deleted file mode 100644 index 0451caa7..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_sa_api.h +++ /dev/null @@ -1,866 +0,0 @@ -/* - * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Specification of the OpenSM SA Client API. This API uses the basic osm - * vendor API to provide SA Client interface. - */ - -#ifndef _OSM_VENDOR_SA_API_H_ -#define _OSM_VENDOR_SA_API_H_ - -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****d* OpenSM Vendor SA Client/osmv_flags_t -* NAME -* osmv_flags_t -* -* DESCRIPTION -* Access layer flags used to direct the operation of various calls. -* -* SYNOPSIS -*/ -typedef uint32_t osmv_flags_t; -#define OSM_SA_FLAGS_SYNC 0x00000001 -/* -* VALUES -* OSM_SA_FLAGS_SYNC -* Indicates that the given operation should be performed synchronously. -* The call will block until it completes. Callbacks will still be -* invoked. -* -* SEE ALSO -* osmv_query_sa -*****/ - -/****d* OpenSM Vendor SA Client/osmv_query_type_t -* NAME -* osmv_query_type_t -* -* DESCRIPTION -* Abstracted queries supported by the access layer. -* -* SYNOPSIS -*/ -typedef enum _osmv_query_type { - OSMV_QUERY_USER_DEFINED, - - OSMV_QUERY_ALL_SVC_RECS, - OSMV_QUERY_SVC_REC_BY_NAME, - OSMV_QUERY_SVC_REC_BY_ID, - - OSMV_QUERY_CLASS_PORT_INFO, - - OSMV_QUERY_NODE_REC_BY_NODE_GUID, - OSMV_QUERY_PORT_REC_BY_LID, - OSMV_QUERY_PORT_REC_BY_LID_AND_NUM, - - OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK, - OSMV_QUERY_SLVL_BY_LID_AND_PORTS, - - OSMV_QUERY_PATH_REC_BY_PORT_GUIDS, - OSMV_QUERY_PATH_REC_BY_GIDS, - OSMV_QUERY_PATH_REC_BY_LIDS, - - OSMV_QUERY_UD_MULTICAST_SET, - OSMV_QUERY_UD_MULTICAST_DELETE, - - OSMV_QUERY_MULTIPATH_REC, - -} osmv_query_type_t; -/* -* VALUES -* OSMV_QUERY_USER_DEFINED -* Query the SA based on user-defined input. Queries of this type -* should reference an osmv_user_query_t structure as input to the -* query. -* -* OSMV_QUERY_SVC_REC_BY_NAME -* Query for service records based on the service name. Queries of -* this type should reference an ib_svc_name_t structure as input -* to the query. -* -* OSMV_QUERY_SVC_REC_BY_ID -* Query for service records based on the service ID. Queries of -* this type should reference an ib_net64_t value that indicates -* the ID of the service being requested. -* -* OSMV_QUERY_NODE_REC_BY_NODE_GUID -* Query for node information based on the node's GUID. Queries of -* this type should reference an ib_net64_t value that indicates -* the GUID of the node being requested. -* -* OSMV_QUERY_PORT_REC_BY_LID -* Query for port information based on the port's base LID. Queries -* of this type should reference an ib_net16_t value that indicates -* the base LID of the port being requested. -* -* OSMV_QUERY_PORT_REC_BY_LID_AND_NUM -* Query for port information based on the port's LID and port num. -* Queries of this type should reference an osmv_user_query_t -* structure as input to the query. The port num and lid should -* be provided by it. -* -* OSMV_QUERY_PATH_REC_BY_PORT_GUIDS -* Query for path records between the specified pair of port GUIDs. -* Queries of this type should reference an osmv_guid_pair_t -* structure that indicates the GUIDs of the path being requested. -* -* OSMV_QUERY_PATH_REC_BY_GIDS -* Query for path records between the specified pair of port GIDs. -* Queries of this type should reference an osmv_gid_pair_t -* structure that indicates the GIDs of the path being requested. -* -* OSMV_QUERY_PATH_REC_BY_LIDS -* Query for path records between the specified pair of port LIDs. -* Queries of this type should reference an osmv_lid_pair_t -* structure that indicates the LIDs of the path being requested. -* -* NOTES -* This enum is used to define abstracted queries provided by the access -* layer. Users may issue queries not listed here by sending MADs directly -* to subnet administration or a class manager. These queries are -* intended to represent those most often used by clients. -* -* SEE ALSO -* osmv_query, osmv_query_req_t, osmv_user_query_t, osmv_gid_pair_t, -* osmv_lid_pair_t osmv_guid_pair_t -*****/ - -/****s* OpenSM Vendor SA Client/osmv_user_query_t -* NAME -* osmv_user_query_t -* -* DESCRIPTION -* User-defined query information. -* -* SYNOPSIS -*/ -typedef struct _osmv_user_query { - uint8_t method; - ib_net16_t attr_id; - ib_net16_t attr_offset; - ib_net32_t attr_mod; - ib_net64_t comp_mask; - void *p_attr; -} osmv_user_query_t; -/* -* FIELDS -* -* method -* Method to be used -* -* attr_id -* Attribute identifier of query data. -* -* attr_offset -* Size of the query attribute, in 8-byte words. Users can set -* this value by passing in the sizeof( attribute ) into the -* ib_get_attr_offset() routine. -* -* attr_mod -* Attribute modifier for query request. -* -* comp_mask -* Indicates the attribute components that are specified for the -* query. -* -* p_attr -* References the attribute structure used as input into the query. -* This field is ignored if comp_mask is set to 0. -* -* NOTES -* This structure is used to describe a user-defined query. The attribute -* ID, attribute offset, component mask, and attribute structure must match -* those defined by the IBA specification. Users should refer to chapter -* 15 of the IBA specification for additional details. -* -* SEE ALSO -* osmv_query_type_t, ib_get_attr_offset, ib_get_attr_size, osmv_query_sa -*****/ - -/****s* OpenSM Vendor SA Client/osmv_gid_pair_t -* NAME -* osmv_gid_pair_t -* -* DESCRIPTION -* Source and destination GIDs. -* -* SYNOPSIS -*/ -typedef struct _osmv_gid_pair { - ib_gid_t src_gid; - ib_gid_t dest_gid; -} osmv_gid_pair_t; -/* -* FIELDS -* src_gid -* Source GID of a path. -* -* dest_gid -* Destination GID of a path. -* -* NOTES -* This structure is used to describe the endpoints of a path. -* -* SEE ALSO -* ib_gid_t -*****/ - -/****s* OpenSM Vendor SA Client/osmv_lid_pair_t -* NAME -* osmv_lid_pair_t -* -* DESCRIPTION -* Source and destination LIDs. -* -* SYNOPSIS -*/ -typedef struct _osmv_lid_pair { - ib_net16_t src_lid; - ib_net16_t dest_lid; -} osmv_lid_pair_t; -/* -* FIELDS -* src_lid -* Source LID of a path. -* -* dest_lid -* Destination LID of a path. -* -* NOTES -* This structure is used to describe the endpoints of a path. -*****/ - -/****s* OpenSM Vendor SA Client/osmv_guid_pair_t -* NAME -* osmv_guid_pair_t -* -* DESCRIPTION -* Source and destination GUIDs. These may be port or channel adapter -* GUIDs, depending on the context in which this structure is used. -* -* SYNOPSIS -*/ -typedef struct _osmv_guid_pair { - ib_net64_t src_guid; - ib_net64_t dest_guid; -} osmv_guid_pair_t; -/* -* FIELDS -* src_guid -* Source GUID of a path. -* -* dest_guid -* Destination GUID of a path. -* -* NOTES -* This structure is used to describe the endpoints of a path. The given -* GUID pair may belong to either ports or channel adapters. -* -* SEE ALSO -* ib_guid_t -*****/ - -/****s* OpenSM Vendor SA Client/osmv_multipath_req_t -* NAME -* osmv_multipath_req_t -* -* DESCRIPTION -* Fields from which to generate a MultiPathRecord request. -* -* SYNOPSIS -*/ -typedef struct _osmv_multipath_req_t { - ib_net64_t comp_mask; - uint16_t pkey; - boolean_t reversible; - uint8_t num_path; - uint8_t sl; - uint8_t independence; - uint8_t sgid_count; - uint8_t dgid_count; - ib_gid_t gids[IB_MULTIPATH_MAX_GIDS]; -} osmv_multipath_req_t; -/* -* FIELDS -* -* NOTES -* This structure is used to describe a multipath request. -* -* SEE ALSO -*****/ - -/****s* OpenSM Vendor SA Client/osmv_query_res_t -* NAME -* osmv_query_res_t -* -* DESCRIPTION -* Contains the results of a subnet administration query. -* -* SYNOPSIS -*/ -typedef struct _osmv_query_res { - const void *query_context; - ib_api_status_t status; - osmv_query_type_t query_type; - uint32_t result_cnt; - osm_madw_t *p_result_madw; -} osmv_query_res_t; -/* -* FIELDS -* query_context -* User-defined context information associated with the query -* through the osm_vendor_query_sa call. -* -* status -* Indicates the success of the query operation. -* -* query_type -* Indicates the type of query for which the results are being -* returned. This matches the query_type specified through the -* osm_vendor_query_sa call. -* -* result_cnt -* The number of result structures that were returned by the query. -* -* p_result_madw -* For queries returning IB_SUCCESS or IB_REMOTE_ERROR, this -* references the MAD wrapper returned by subnet administration -* containing the list of results or the returned error code. -* -* NOTES -* A query result structure is returned to a client through their -* osmv_pfn_query_cb_t routine to notify them of the results of a subnet -* administration query. If the query was successful or received an error -* from subnet administration, p_result_madw will reference a MAD wrapper -* containing the results. The MAD referenced by p_result_madw is owned by -* the user and remains available even after their callback returns. Users -* must call osm_mad_pool_put() to return the MAD wrapper back to the -* mad pool when they are done accessing the results. -* -* To retrieve individual result structures from the p_result_madw, users -* may call osmv_get_query_result(). -* -* SEE ALSO -* osmv_query_sa, osmv_pfn_query_cb_t, ib_api_status_t, -* osmv_query_status_t, osmv_query_type_t, -* osmv_get_query_result -*****/ - -/****f* OpenSM Vendor SA Client/osmv_get_query_result -* NAME -* osmv_get_query_result -* -* DESCRIPTION -* Retrieves a result structure from a MADW returned by a call to -* osmv_query_sa(). -* -* SYNOPSIS -*/ -static inline void *osmv_get_query_result(IN osm_madw_t * p_result_madw, - IN uint32_t result_index) -{ - ib_sa_mad_t *p_sa_mad; - - CL_ASSERT(p_result_madw); - p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw); - CL_ASSERT(p_sa_mad); - CL_ASSERT(ib_get_attr_size(p_sa_mad->attr_offset) * (result_index + 1) + - IB_SA_MAD_HDR_SIZE <= p_result_madw->mad_size); - - return (p_sa_mad->data + - (ib_get_attr_size(p_sa_mad->attr_offset) * result_index)); -} - -/* -* PARAMETERS -* p_result_madw -* [in] This is a reference to the MAD returned as a result of the -* query. -* -* result_index -* [in] A zero-based index indicating which result to return. -* -* NOTES -* This call returns a pointer to the start of a result structure from a -* call to osmv_query_sa(). The type of result structure must be known to -* the user either through the user's context or the query_type returned as -* part of the osmv_query_res_t structure. -* -* SEE ALSO -* osmv_query_res_t, osm_madw_t -*****/ - -/****f* OpenSM Vendor SA Client/osmv_get_query_path_rec -* NAME -* osmv_get_query_path_rec -* -* DESCRIPTION -* Retrieves a path record result from a MAD returned by a call to -* osmv_query_sa(). -* -* SYNOPSIS -*/ -static inline ib_path_rec_t *osmv_get_query_path_rec(IN osm_madw_t * - p_result_madw, - IN uint32_t result_index) -{ - ib_sa_mad_t *p_sa_mad; - - CL_ASSERT(p_result_madw); - p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw); - CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_PATH_RECORD); - - return ((ib_path_rec_t *) - osmv_get_query_result(p_result_madw, result_index)); -} - -/* -* PARAMETERS -* p_result_madw -* [in] This is a reference to the MAD returned as a result of the -* query. -* -* result_index -* [in] A zero-based index indicating which result to return. -* -* NOTES -* This call returns a pointer to the start of a path record result from -* a call to osmv_query_sa(). -* -* SEE ALSO -* osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_path_rec_t -*****/ - -/****f* OpenSM Vendor SA Client/osmv_get_query_portinfo_rec -* NAME -* osmv_get_query_portinfo_rec -* -* DESCRIPTION -* Retrieves a port info record result from a MAD returned by a call to -* osmv_query_sa(). -* -* SYNOPSIS -*/ -static inline ib_portinfo_record_t *osmv_get_query_portinfo_rec(IN osm_madw_t * - p_result_madw, - IN uint32_t - result_index) -{ - ib_sa_mad_t *p_sa_mad; - - CL_ASSERT(p_result_madw); - p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw); - CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_PORTINFO_RECORD); - - return ((ib_portinfo_record_t *) osmv_get_query_result(p_result_madw, - result_index)); -} - -/* -* PARAMETERS -* p_result_madw -* [in] This is a reference to the MAD returned as a result of the -* query. -* -* result_index -* [in] A zero-based index indicating which result to return. -* -* NOTES -* This call returns a pointer to the start of a port info record result -* from a call to osmv_query_sa(). -* -* SEE ALSO -* osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_portinfo_record_t -*****/ - -/****f* OpenSM Vendor SA Client/osmv_get_query_node_rec -* NAME -* osmv_get_query_node_rec -* -* DESCRIPTION -* Retrieves a node record result from a MAD returned by a call to -* osmv_query_sa(). -* -* SYNOPSIS -*/ -static inline ib_node_record_t *osmv_get_query_node_rec(IN osm_madw_t * - p_result_madw, - IN uint32_t - result_index) -{ - ib_sa_mad_t *p_sa_mad; - - CL_ASSERT(p_result_madw); - p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw); - CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_NODE_RECORD); - - return ((ib_node_record_t *) osmv_get_query_result(p_result_madw, - result_index)); -} - -/* -* PARAMETERS -* p_result_madw -* [in] This is a reference to the MAD returned as a result of the -* query. -* -* result_index -* [in] A zero-based index indicating which result to return. -* -* NOTES -* This call returns a pointer to the start of a node record result from -* a call to osmv_query_sa(). -* -* SEE ALSO -* osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_node_record_t -*****/ - -/****f* OpenSM Vendor SA Client/osmv_get_query_svc_rec -* NAME -* osmv_get_query_svc_rec -* -* DESCRIPTION -* Retrieves a service record result from a MAD returned by a call to -* osmv_query_sa(). -* -* SYNOPSIS -*/ -static inline ib_service_record_t *osmv_get_query_svc_rec(IN osm_madw_t * - p_result_madw, - IN uint32_t - result_index) -{ - ib_sa_mad_t *p_sa_mad; - - CL_ASSERT(p_result_madw); - p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw); - CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_SERVICE_RECORD); - - return ((ib_service_record_t *) osmv_get_query_result(p_result_madw, - result_index)); -} - -/* -* PARAMETERS -* p_result_madw -* [in] This is a reference to the MAD returned as a result of the -* query. -* -* result_index -* [in] A zero-based index indicating which result to return. -* -* NOTES -* This call returns a pointer to the start of a service record result from -* a call to osmv_query_sa(). -* -* SEE ALSO -* osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_service_record_t -*****/ - -/****f* OpenSM Vendor SA Client/osmv_get_query_mc_rec -* NAME -* osmv_get_query_mc_rec -* -* DESCRIPTION -* Retrieves a multicast record result from a MAD returned by a call to -* osmv_query_sa(). -* -* SYNOPSIS -*/ -static inline ib_member_rec_t *osmv_get_query_mc_rec(IN osm_madw_t * - p_result_madw, - IN uint32_t result_index) -{ - ib_sa_mad_t *p_sa_mad; - - CL_ASSERT(p_result_madw); - p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw); - CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_MCMEMBER_RECORD); - - return ((ib_member_rec_t *) osmv_get_query_result(p_result_madw, - result_index)); -} - -/* -* PARAMETERS -* p_result_madw -* [in] This is a reference to the MAD returned as a result of the -* query. -* -* result_index -* [in] A zero-based index indicating which result to return. -* -* NOTES -* This call returns a pointer to the start of a service record result from -* a call to osmv_query_sa(). -* -* SEE ALSO -* osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_member_rec_t -*****/ - -/****f* OpenSM Vendor SA Client/osmv_get_query_inform_info_rec -* NAME -* osmv_get_query_inform_info_rec -* -* DESCRIPTION -* Retrieves an InformInfo record result from a MAD returned by -* a call to osmv_query_sa(). -* -* SYNOPSIS -*/ -static inline ib_inform_info_record_t *osmv_get_query_inform_info_rec(IN - osm_madw_t - * - p_result_madw, - IN - uint32_t - result_index) -{ - ib_sa_mad_t *p_sa_mad; - - CL_ASSERT(p_result_madw); - p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw); - CL_ASSERT(p_sa_mad - && p_sa_mad->attr_id == IB_MAD_ATTR_INFORM_INFO_RECORD); - - return ((ib_inform_info_record_t *) osmv_get_query_result(p_result_madw, - result_index)); -} - -/* -* PARAMETERS -* p_result_madw -* [in] This is a reference to the MAD returned as a result of the -* query. -* -* result_index -* [in] A zero-based index indicating which result to return. -* -* NOTES -* This call returns a pointer to the start of a service record result from -* a call to osmv_query_sa(). -* -* SEE ALSO -* osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_inform_info_record_t -*****/ - -/****f* OpenSM Vendor SA Client/osmv_pfn_query_cb_t -* NAME -* osmv_pfn_query_cb_t -* -* DESCRIPTION -* User-defined callback invoked on completion of subnet administration -* query. -* -* SYNOPSIS -*/ -typedef void - (*osmv_pfn_query_cb_t) (IN osmv_query_res_t * p_query_res); -/* -* PARAMETERS -* p_query_res -* [in] This is a reference to a structure containing the result of -* the query. -* -* NOTES -* This routine is invoked to notify a client of the result of a subnet -* administration query. The p_query_rec parameter references the result -* of the query and, in the case of a successful query, any information -* returned by subnet administration. -* -* In the kernel, this callback is usually invoked using a tasklet, -* dependent on the implementation of the underlying verbs provider driver. -* -* SEE ALSO -* osmv_query_res_t -*****/ - -/****s* OpenSM Vendor SA Client/osmv_query_req_t -* NAME -* osmv_query_req_t -* -* DESCRIPTION -* Information used to request an access layer provided query of subnet -* administration. -* -* SYNOPSIS -*/ -typedef struct _osmv_query_req { - osmv_query_type_t query_type; - const void *p_query_input; - ib_net64_t sm_key; - - uint32_t timeout_ms; - uint32_t retry_cnt; - osmv_flags_t flags; - - const void *query_context; - osmv_pfn_query_cb_t pfn_query_cb; -} osmv_query_req_t; -/* -* FIELDS -* query_type -* Indicates the type of query that the access layer should -* perform. -* -* p_query_input -* A pointer to the input for the query. The data referenced by -* this structure is dependent on the type of query being requested -* and is determined by the specified query_type. -* -* sm_key -* The SM_Key to be provided with the SA MAD for authentication. -* Normally 0 is used. -* -* timeout_ms -* Specifies the number of milliseconds to wait for a response for -* this query until retrying or timing out the request. -* -* retry_cnt -* Specifies the number of times that the query will be retried -* before failing the request. -* -* flags -* Used to describe the mode of operation. Set to IB_FLAGS_SYNC to -* process the called routine synchronously. -* -* query_context -* User-defined context information associated with this query. -* The context data is returned to the user as a part of their -* query callback. -* -* pfn_query_cb -* A user-defined callback that is invoked upon completion of the -* query. -* -* NOTES -* This structure is used when requesting an osm vendor provided query -* of subnet administration. Clients specify the type of query through -* the query_type field. Based on the type of query, the p_query_input -* field is set to reference the appropriate data structure. -* -* The information referenced by the p_query_input field is one of the -* following: -* -* -- a NULL terminated service name -* -- a service id -* -- a single GUID -* -- a pair of GUIDs specified through an osmv_guid_pair_t structure -* -- a pair of GIDs specified through an osmv_gid_pair_t structure -* -* SEE ALSO -* osmv_query_type_t, osmv_pfn_query_cb_t, osmv_guid_pair_t, -* osmv_gid_pair_t -*****/ - -/****f* OpenSM Vendor SA Client/osmv_bind_sa -* NAME -* osmv_bind_sa -* -* DESCRIPTION -* Bind to the SA service and return a handle to be used for later -* queries. -* -* -* SYNOPSIS -*/ -osm_bind_handle_t -osmv_bind_sa(IN osm_vendor_t * const p_vend, - IN osm_mad_pool_t * const p_mad_pool, IN ib_net64_t port_guid); -/* -* PARAMETERS -* p_vend -* [in] an osm_vendor object to work with -* -* p_mad_pool -* [in] mad pool to obtain madw from -* -* port_guid -* [in] the port guid to attach to. -* -* RETURN VALUE -* Bind handle to be used for later SA queries or OSM_BIND_INVALID_HANDLE -* -* NOTES -* -* SEE ALSO -* osmv_query_sa -*********/ - -/****f* OpenSM Vendor SA Client/osmv_query_sa -* NAME -* osmv_query_sa -* -* DESCRIPTION -* Query the SA given an SA query request (similar to IBAL ib_query). -* -* SYNOPSIS -*/ -ib_api_status_t -osmv_query_sa(IN osm_bind_handle_t h_bind, - IN const osmv_query_req_t * const p_query_req); -/* -* PARAMETERS -* h_bind -* [in] bind handle for this port. Should be previously -* obtained by calling osmv_bind_sa -* -* p_query_req -* [in] an SA query request structure. -* -* RETURN VALUE -* IB_SUCCESS if completed successfuly (or in ASYNC mode -* if the request was sent). -* -* NOTES -* -* SEE ALSO -* osmv_bind_sa -*********/ - -END_C_DECLS -#endif /* _OSM_VENDOR_SA_API_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_test.h b/branches/opensm_3/user/include/vendor/osm_vendor_test.h deleted file mode 100644 index 8b360b96..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_test.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef _OSM_VENDOR_TEST_H_ -#define _OSM_VENDOR_TEST_H_ - -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/* This value must be zero for the TEST transport. */ -#define OSM_BIND_INVALID_HANDLE 0 -/* - * Abstract: - * Declaration of vendor specific transport interface. - * This is the "Test" vendor which allows compilation and some - * testing without a real vendor interface. - * These objects are part of the OpenSM family of objects. - */ -/****h* OpenSM/Vendor Test -* NAME -* Vendor Test -* -* DESCRIPTION -* The Vendor Test structure encapsulates an artificial transport layer -* interface for testing. -* -* AUTHOR -* Steve King, Intel -* -*********/ -/****s* OpenSM: Vendor Test/osm_vend_wrap_t -* NAME -* osm_vend_wrap_t -* -* DESCRIPTION -* Vendor specific MAD wrapper context. -* -* This structure allows direct access to member variables. -* -* SYNOPSIS -*/ -typedef struct _osm_vend_wrap { - uint32_t dummy; - -} osm_vend_wrap_t; -/*********/ - -/****s* OpenSM: Vendor Test/osm_vendor_t -* NAME -* osm_vendor_t -* -* DESCRIPTION -* Vendor specific MAD interface. -* -* This interface defines access to the vendor specific MAD -* transport layer. -* -* SYNOPSIS -*/ -typedef struct _osm_vendor { - osm_log_t *p_log; - uint32_t timeout; - -} osm_vendor_t; -/*********/ - -typedef struct _osm_bind_handle { - osm_vendor_t *p_vend; - ib_net64_t port_guid; - uint8_t mad_class; - uint8_t class_version; - boolean_t is_responder; - boolean_t is_trap_processor; - boolean_t is_report_processor; - uint32_t send_q_size; - uint32_t recv_q_size; - -} *osm_bind_handle_t; - -END_C_DECLS -#endif /* _OSM_VENDOR_TEST_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_ts.h b/branches/opensm_3/user/include/vendor/osm_vendor_ts.h deleted file mode 100644 index 7fbbf1a0..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_ts.h +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Definition of interface for the TS Vendor - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_VENDOR_TS_H_ -#define _OSM_VENDOR_TS_H_ - -#undef IN -#undef OUT -#include -#include -#include -#define IN -#define OUT -#include "iba/ib_types.h" -#include "iba/ib_al.h" -#include -#include -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****s* OpenSM: Vendor TS/osm_bind_handle_t - * NAME - * osm_bind_handle_t - * - * DESCRIPTION - * handle returned by the vendor transport bind call. - * - * SYNOPSIS - */ -typedef void *osm_bind_handle_t; -/* -**********/ -#define OSM_DEFAULT_RETRY_COUNT 3 - -/****s* OpenSM: Vendor osm_ts_bind_info_t - * NAME - * osm_ts_bind_info_t - * - * DESCRIPTION - * Handle to the result of binding a class callbacks . - * - * SYNOPSIS - */ -typedef struct _osm_ts_bind_info { - int ul_dev_fd; - VAPI_hca_hndl_t hca_hndl; - struct _osm_vendor *p_vend; - void *client_context; - uint8_t port_num; - void *rcv_callback; - void *send_err_callback; - struct _osm_mad_pool *p_osm_pool; - cl_thread_t poller; -} osm_ts_bind_info_t; -/* - * FIELDS - * ul_dev_file_hdl - * the file handle to be used for sending the MADs - * - * hca_hndl - * Handle to the HCA provided by the underlying VAPI - * - * p_vend - * Pointer to the vendor object. - * - * client_context - * User's context passed during osm_bind - * - * hca_id - * HCA Id we bind to. - * - * port_num - * Port number (within the HCA) of the bound port. - * - * rcv_callback - * OSM Callback function to be called on receive of MAD. - * - * send_err_callback - * OSM Callback to be called on send error. - * - * p_osm_pool - * Points to the MAD pool used by OSM - * - * poller - * A thread reading from the device file handle - * - * SEE ALSO - *********/ - -/****h* OpenSM/Vendor TS - * NAME - * Vendor TS - * - * DESCRIPTION - * - * The Vendor TS object is thread safe. - * - * This object should be treated as opaque and should be - * manipulated only through the provided functions. - * - * - * AUTHOR - * - * - *********/ - -/****s* OpenSM: Vendor TS/osm_ca_info_t - * NAME - * osm_ca_info_t - * - * DESCRIPTION - * Structure containing information about local Channle Adapters. - * - * SYNOPSIS - */ -typedef struct _osm_ca_info { - ib_net64_t guid; - size_t attr_size; - ib_ca_attr_t *p_attr; - -} osm_ca_info_t; - -/* - * FIELDS - * guid - * Node GUID of the local CA. - * - * attr_size - * Size of the CA attributes for this CA. - * - * p_attr - * Pointer to dynamicly allocated CA Attribute structure. - * - * SEE ALSO - *********/ - -/***** OpenSM: Vendor TS/osm_vendor_t - * NAME - * osm_vendor_t - * - * DESCRIPTION - * The structure defining a TS vendor - * - * SYNOPSIS - */ -typedef struct _osm_vendor { - osm_log_t *p_log; - uint32_t ca_count; - osm_ca_info_t *p_ca_info; - uint32_t timeout; - struct _osm_transaction_mgr *p_transaction_mgr; - osm_ts_bind_info_t smi_bind; - osm_ts_bind_info_t gsi_bind; -} osm_vendor_t; - -/* - * FIELDS - * h_al - * Handle returned by TS open call . - * - * p_log - * Pointer to the log object. - * - * ca_count - * Number of CA's in the array pointed to by p_ca_info. - * - * p_ca_info - * Pointer to dynamically allocated array of CA info objects. - * - * timeout - * Transaction timeout time in milliseconds. - * - * p_transaction_mgr - * Pointer to Transaction Manager. - * - * smi_bind - * Bind information for handling SMI MADs - * - * gsi_bind - * Bind information for GSI MADs - * - * SEE ALSO - *********/ - -/****f* OpenSM: Vendor TS/CA Info/osm_ca_info_get_port_guid - * NAME - * osm_ca_info_get_port_guid - * - * DESCRIPTION - * Returns the port GUID of the specified port owned by this CA. - * - * SYNOPSIS - */ -static inline ib_net64_t -osm_ca_info_get_port_guid(IN const osm_ca_info_t * const p_ca_info, - IN const uint8_t index) -{ - return (p_ca_info->p_attr->p_port_attr[index].port_guid); -} - -/* - * PARAMETERS - * p_ca_info - * [in] Pointer to a CA Info object. - * - * index - * [in] Port "index" for which to retrieve the port GUID. - * The index is the offset into the ca's internal array - * of port attributes. - * - * RETURN VALUE - * Returns the port GUID of the specified port owned by this CA. - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OpenSM: Vendor TS/CA Info/osm_ca_info_get_num_ports - * NAME - * osm_ca_info_get_num_ports - * - * DESCRIPTION - * Returns the number of ports of the given ca_info - * - * SYNOPSIS - */ -static inline uint8_t -osm_ca_info_get_num_ports(IN const osm_ca_info_t * const p_ca_info) -{ - return (p_ca_info->p_attr->num_ports); -} - -/* - * PARAMETERS - * p_ca_info - * [in] Pointer to a CA Info object. - * - * RETURN VALUE - * Returns the number of CA ports - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OpenSM: SM Vendor/osm_vendor_get_guid_ca_and_port - * NAME - * osm_vendor_get_guid_ca_and_port - * - * DESCRIPTION - * Given the vendor obj and a guid - * return the ca id and port number that have that guid - * - * SYNOPSIS - */ -ib_api_status_t -osm_vendor_get_guid_ca_and_port(IN osm_vendor_t * const p_vend, - IN ib_net64_t const guid, - OUT VAPI_hca_hndl_t * p_hca_hndl, - OUT VAPI_hca_id_t * p_hca_id, - OUT uint32_t * p_port_num); - -/* - * PARAMETERS - * p_vend - * [in] Pointer to an osm_vendor_t object. - * - * guid - * [in] The guid to search for. - * - * p_hca_id - * [out] The HCA Id (VAPI_hca_id_t *) that the port is found on. - * - * p_port_num - * [out] Pointer to a port number arg to be filled with the port number with the given guid. - * - * RETURN VALUES - * IB_SUCCESS on SUCCESS - * IB_INVALID_GUID if the guid is notfound on any Local HCA Port - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OpenSM: Vendor TS/osm_vendor_get_all_port_attr - * NAME - * osm_vendor_get_all_port_attr - * - * DESCRIPTION - * Fill in the array of port_attr with all available ports on ALL the - * avilable CAs on this machine. - * ALSO - - * UPDATE THE VENDOR OBJECT LIST OF CA_INFO STRUCTS - * - * SYNOPSIS - */ -ib_api_status_t osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend, - IN ib_port_attr_t * - const p_attr_array, - IN uint32_t * const p_num_ports); - -/* - * PARAMETERS - * p_vend - * [in] Pointer to an osm_vendor_t object. - * - * p_attr_array - * [out] Pre-allocated array of port attributes to be filled in - * - * p_num_ports - * [out] The size of the given array. Filled in by the actual numberof ports found. - * - * RETURN VALUES - * IB_SUCCESS if OK - * IB_INSUFFICIENT_MEMORY if not enough place for all ports was provided. - * - * NOTES - * - * SEE ALSO - *********/ - -#define OSM_BIND_INVALID_HANDLE 0 - -/****s* OpenSM: Vendor TS/osm_vend_wrap_t - * NAME - * TS Vendor MAD Wrapper - * - * DESCRIPTION - * TS specific MAD wrapper. TS transport layer uses this for - * housekeeping. - * - * SYNOPSIS - *********/ -typedef struct _osm_vend_wrap_t { - uint32_t size; - osm_bind_handle_t h_bind; - ib_mad_t *p_mad_buf; - void *p_resp_madw; -} osm_vend_wrap_t; - -/* - * FIELDS - * size - * Size of the allocated MAD - * - * h_bind - * Bind handle used on this transaction - * - * h_av - * Address vector handle used for this transaction. - * - * p_resp_madw - * Pointer to the mad wrapper structure used to hold the pending - * reponse to the mad, if any. If a response is expected, the - * wrapper for the reponse is allocated during the send call. - * - * SEE ALSO - *********/ - -END_C_DECLS -#endif /* _OSM_VENDOR_TS_H_ */ diff --git a/branches/opensm_3/user/include/vendor/osm_vendor_umadt.h b/branches/opensm_3/user/include/vendor/osm_vendor_umadt.h deleted file mode 100644 index 88581c66..00000000 --- a/branches/opensm_3/user/include/vendor/osm_vendor_umadt.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osm_mad_wrapper_t. - * This object represents the context wrapper for OpenSM MAD processing. - * This object is part of the OpenSM family of objects. - */ - -#ifndef _OSM_VENDOR_UMADT_h_ -#define _OSM_VENDOR_UMADT_h_ - -#include "iba/ib_types.h" -#include "complib/cl_qlist.h" -#include "complib/cl_thread.h" -#include -#include - -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -BEGIN_C_DECLS -/****h* OpenSM/ Vendor Umadt -* NAME -* MAD Wrapper -* -* DESCRIPTION -* -* -* AUTHOR -* Ranjit Pandit, Intel -* -*********/ -typedef void *osm_vendor_t; -#define OSM_BIND_INVALID_HANDLE 0 - -/****s* OpenSM: Vendor Umadt /osm_bind_handle_t -* NAME -* osm_bind_handle_t -* -* DESCRIPTION -* handle returned by the vendor transport bind call. -* -* SYNOPSIS -*/ - -typedef void *osm_bind_handle_t; - -/****s* OpenSM: Vendor Umadt /mad_direction_t -* NAME -* mad_direction_t -* -* DESCRIPTION -* Tags for mad wrapper to indicate the direction of mads. -* Umadt vendor transport layer uses this tag to call the appropriate -* Umadt APIs. -* -* SYNOPSIS -*/ -typedef enum _mad_direction_t { - SEND = 0, - RECEIVE, -} mad_direction_t; - -/****s* OpenSM/ osm_vend_wrap_t -* NAME -* Umadt Vendor MAD Wrapper -* -* DESCRIPTION -* Umadt specific MAD wrapper. Umadt transport layer sets this for -* housekeeping. -* -* SYNOPSIS -*********/ -typedef struct _osm_vend_wrap_t { - MadtStruct *p_madt_struct; - mad_direction_t direction; // send or receive - uint32_t size; -} osm_vend_wrap_t; -/* -* FIELDS -* p_madt_struct -* Umadt mad structure to identify a mad. -* -* direction -* Used to identify a mad with it's direction. -* -* SEE ALSO -*********/ - -END_C_DECLS -#endif /* _OSM_VENDOR_UMADT_h_ */ diff --git a/branches/opensm_3/user/include/vendor/winosm_common.h b/branches/opensm_3/user/include/vendor/winosm_common.h deleted file mode 100644 index d6325368..00000000 --- a/branches/opensm_3/user/include/vendor/winosm_common.h +++ /dev/null @@ -1,204 +0,0 @@ -#ifndef _OSM_COMMON_H_ -#define _OSM_COMMON_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#define cl_is_debug osm_is_debug - -#include -#include -#include - -#pragma warning(disable : 4996) -#pragma warning(disable : 4100) - -#include -#include -#include - -typedef int ssize_t; - -#define OSM_API __stdcall -#define OSM_CDECL __cdecl - -#define complib_init() -#define complib_exit() - -#define chmod(a,b) _chmod(a,b) -#define S_IRUSR _S_IREAD -#define S_IWUSR _S_IWRITE - -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#ifndef strtoull -#define strtoull _strtoui64 -#endif - -#ifndef PATH_MAX -#define PATH_MAX MAX_PATH -#endif -#define O_NONBLOCK 0 - -#define open _open -#define close _close -#define fileno _fileno -#define stat _stat -#define fstat _fstat -#define unlink(str) _unlink(str) -#define dup2(a,b) -#define isatty _isatty - -#ifndef getpid -#define getpid() GetCurrentProcessId() -#endif - -#define usleep(usec) SleepEx(usec/1000,TRUE) - -#define pthread_t cl_thread_t -#define pthread_mutex_t cl_mutex_t - -#define pthread_mutex_lock cl_mutex_acquire -#define pthread_mutex_unlock cl_mutex_release -#define pthread_mutex_init(a,b) cl_mutex_init((a)) -#define pthread_mutex_destroy cl_mutex_destroy - -#define pthread_cond_init(a,b) -#define pthread_cond_signal cl_event_signal -#define pthread_cond_destroy(a) - - -/************************************************************************/ -static char* -get_char_option(const char* optstring, - char*const* argv,int argc, - int iArg, int* opt_ind,char* opt_p); -int -getopt_long_only(int argc, char *const*argv, - const char *optstring, - const struct option *longopts, int *longindex); - -/**************************************************************************/ - -/* Verify the correct ETIMEDOUT value is defined in all compiled files */ -#ifndef ETIMEDOUT -#define ETIMEDOUT (10060) -#endif - -extern char *strdup_expand(const char *); -extern FILE *Fopen(const char *,const char *); -#define fopen Fopen - -/* The following defines replace syslog.h */ - -void openlog(char *ident, int option, int facility); -void closelog(void); -#define LOG_CONS (1<<0) -#define LOG_PID (1<<2) -#define LOG_USER (1<<3) - -void syslog(int priority, char *fmt, ... ); - -#define LOG_DEBUG 7 -#define LOG_INFO 6 -#define LOG_NOTICE 5 -#define LOG_WARNING 4 -#define LOG_ERR 3 -#define LOG_CRIT 2 -#define LOG_ALTERT 1 -#define LOG_EMERG 0 - -/*****************************************/ - -/****f* OpenSM: osm_common/GetOsmTempPath -* NAME -* GetOsmTempPath -* -* DESCRIPTION -* The function retrieves the temp path defined in Windows using its API -* -* SYNOPSIS -*/ -char* -GetOsmTempPath(void); -/* -* PARAMETERS -* NONE -* -* RETURN VALUE -* This function returns string containing the default temp path in windows -* -* NOTES -*/ - -/****f* OpenSM: osm_common/GetOsmCachePath -* NAME -* GetOsmCachePath -* -* DESCRIPTION -* The function retrieves the path the cache directory. This directory is -* the etc dir under the installation directory of the mellanox stack. -* The installation directory should be pointed out by the WinIB_HOME variable. -* If WinIB_HOME variable is missing, or there is not /etc/ dir under it - then -* the function will return the getOsmTempPath() value. -* -* SYNOPSIS -*/ -char* -GetOsmCachePath(void); -/* -* PARAMETERS -* NONE -* -* RETURN VALUE -* function returns string containing the default cache path for osm use. -* -* NOTES -*/ - -/* **** Move this to inc\complib\cl_qlist.h once it works correctly */ - -/****d* Component Library: Quick List/cl_item_obj -* NAME -* cl_item_obj -* -* DESCRIPTION -* used to extract a 'typed' pointer from Quick List item. -* -* SYNOPSIS -*/ - -#define cl_item_obj(item_ptr, obj_ptr, item_field) \ - (void*)((uint8_t*)item_ptr - \ - ((uint8_t*)(&(obj_ptr)->item_field) - (uint8_t*)(obj_ptr))) -/* -* PARAMETERS -* item_ptr -* [in] Pointer to a cl_qlist structure. -* -* obj_ptr -* [in] object pointer -* -* item_field -* [in] object pointer field -* -* TypeOF_Obj -* -* RETURN VALUE -* returns a 'TypeOF_Obj ptr -* -* SEE ALSO -* Quick List -*********/ - -#endif /* _OSM_COMMON_H_ */ diff --git a/branches/opensm_3/user/libvendor/Makefile b/branches/opensm_3/user/libvendor/Makefile deleted file mode 100644 index 3ad42085..00000000 --- a/branches/opensm_3/user/libvendor/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source -# file to this component. This file merely indirects to the real make file -# that is shared by all the driver components of the Windows NT DDK -# -!INCLUDE ..\..\..\..\inc\openib.def - diff --git a/branches/opensm_3/user/libvendor/SOURCES b/branches/opensm_3/user/libvendor/SOURCES deleted file mode 100644 index e6c9cd56..00000000 --- a/branches/opensm_3/user/libvendor/SOURCES +++ /dev/null @@ -1,64 +0,0 @@ -# Build the 'vendor' library for linking opensm.exe - -!if !defined(WINIBHOME) -WINIBHOME=..\..\..\.. -!endif - -LIBPATH=$(WINIBHOME)\bin\user\obj$(BUILD_ALT_DIR) - -!if defined(OSM_TARGET) -TARGETPATH=$(OSM_TARGET)\bin\user\obj$(BUILD_ALT_DIR) -!else -TARGETPATH=$(LIBPATH) -!endif - -!INCLUDE ..\mad-vendor.inc - -TARGETNAME=$(VENDOR_LIB) -TARGETTYPE=LIBRARY - -USE_NTDLL=1 -USE_NATIVE_EH=1 -OVR_DIR=..\addon - - -SOURCES= complib_files.c \ - winosm_common.c \ - $(VENDOR_SRC) - - -OSM_HOME=.. - -TARGETLIBS=\ -!if $(FREEBUILD) - $(LIBPATH)\*\complib.lib -!else - $(LIBPATH)\*\complibd.lib -!endif - -INCLUDES= \ - $(WINIBHOME)\inc; \ - $(WINIBHOME)\inc\user; \ - $(WINIBHOME)\inc\user\complib; \ - $(WINIBHOME)\inc\user\linux; \ - $(VENDOR_INC) \ - $(OSM_HOME); \ - $(OSM_HOME)\include; - -# Could be any special flag needed for this project -USER_C_FLAGS=$(USER_C_FLAGS) - -#Add preproccessor definitions -C_DEFINES=$(C_DEFINES) -D__WIN__ -DHAVE_CONFIG_H -D$(VENDOR_IF) - -!if !$(FREEBUILD) -C_DEFINES=$(C_DEFINES) -D_DEBUG -DDEBUG -DDBG -# in cl_types_osd.h '_DEBUG_' is defined by virture of '_DEBUG" being defined. -!endif - -LINKER_FLAGS= $(LINKER_FLAGS) /DEF:$(VENDOR_LIB).exports - -MSC_WARNING_LEVEL= /W2 /wd4242 - -#MSC_OPTIMIZATION= /O0 - diff --git a/branches/opensm_3/user/libvendor/complib_files.c b/branches/opensm_3/user/libvendor/complib_files.c deleted file mode 100644 index 062d1a17..00000000 --- a/branches/opensm_3/user/libvendor/complib_files.c +++ /dev/null @@ -1,3 +0,0 @@ - -#include <..\complib\cl_dispatcher.c> -#include <..\complib\cl_event_wheel.c> diff --git a/branches/opensm_3/user/libvendor/libosmvendor.ver b/branches/opensm_3/user/libvendor/libosmvendor.ver deleted file mode 100644 index 132452ae..00000000 --- a/branches/opensm_3/user/libvendor/libosmvendor.ver +++ /dev/null @@ -1,9 +0,0 @@ -# In this file we track the current API version -# of the vendor interface (and libraries) -# The version is built of the following -# tree numbers: -# API_REV:RUNNING_REV:AGE -# API_REV - advance on any added API -# RUNNING_REV - advance any change to the vendor files -# AGE - number of backward versions the API still supports -LIBVERSION=3:3:0 diff --git a/branches/opensm_3/user/libvendor/osm_pkt_randomizer.c b/branches/opensm_3/user/libvendor/osm_pkt_randomizer.c deleted file mode 100644 index 6a690e9b..00000000 --- a/branches/opensm_3/user/libvendor/osm_pkt_randomizer.c +++ /dev/null @@ -1,323 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_pkt_randomizer_t. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include - -#ifndef __WIN__ -#include -#include -#endif - -/********************************************************************** - * Return TRUE if the path is in a fault path, and FALSE otherwise. - * By in a fault path the meaning is that there is a path in the fault - * paths that the given path includes it. - * E.g: if there is a fault path: 0,1,4 - * For the given path: 0,1,4,7 the return value will be TRUE, also for - * the given path: 0,1,4 the return value will be TRUE, but for - * the given paths: 0,1 or 0,3,1,4 - the return value will be FALSE. - **********************************************************************/ -boolean_t -__osm_pkt_randomizer_is_path_in_fault_paths(IN osm_log_t * p_log, - IN osm_dr_path_t * p_dr_path, - IN osm_pkt_randomizer_t * - p_pkt_rand) -{ - boolean_t res = FALSE, found_path; - osm_dr_path_t *p_found_dr_path; - uint8_t ind1, ind2; - - OSM_LOG_ENTER(p_log); - - for (ind1 = 0; ind1 < p_pkt_rand->num_paths_initialized; ind1++) { - found_path = TRUE; - p_found_dr_path = &(p_pkt_rand->fault_dr_paths[ind1]); - /* if the hop count of the found path is greater than the - hop count of the input path - then it is not part of it. - Check the next path. */ - if (p_found_dr_path->hop_count > p_dr_path->hop_count) - continue; - - /* go over all the ports in the found path and see if they match - the ports in the input path */ - for (ind2 = 0; ind2 <= p_found_dr_path->hop_count; ind2++) - if (p_found_dr_path->path[ind2] != - p_dr_path->path[ind2]) - found_path = FALSE; - - /* If found_path is TRUE then there is a full match of the path */ - if (found_path == TRUE) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Given path is in a fault path\n"); - res = TRUE; - break; - } - } - - OSM_LOG_EXIT(p_log); - return res; -} - -/********************************************************************** - * For a given dr_path - return TRUE if the path should be dropped, - * return FALSE otherwise. - * The check uses random criteria in order to determine whether or not - * the path should be dropped. - * First - if not all paths are initialized, it randomally chooses if - * to use this path as a fault path or not. - * Second - if the path is in the fault paths (meaning - it is equal - * to or includes one of the fault paths) - then it randomally chooses - * if to drop it or not. - **********************************************************************/ -boolean_t -__osm_pkt_randomizer_process_path(IN osm_log_t * p_log, - IN osm_pkt_randomizer_t * p_pkt_rand, - IN osm_dr_path_t * p_dr_path) -{ - boolean_t res = FALSE; - static boolean_t rand_value_init = FALSE; - static int rand_value; - boolean_t in_fault_paths; - uint8_t i; - char buf[BUF_SIZE]; - char line[BUF_SIZE]; - - OSM_LOG_ENTER(p_log); - - if (rand_value_init == FALSE) { - int seed; -#ifdef __WIN__ - SYSTEMTIME st; -#else - struct timeval tv; - struct timezone tz; -#endif /* __WIN__ */ - - /* initiate the rand_value according to timeofday */ - rand_value_init = TRUE; - -#ifdef __WIN__ - GetLocalTime(&st); - seed = st.wMilliseconds; -#else - gettimeofday(&tv, &tz); - seed = tv.tv_usec; -#endif /* __WIN__ */ - - srand(seed); - } - - /* If the hop_count is 1 - then this is a mad down to our local port - don't drop it */ - if (p_dr_path->hop_count <= 1) - goto Exit; - - rand_value = rand(); - - sprintf(buf, "Path: "); - /* update the dr_path into the buf */ - for (i = 0; i <= p_dr_path->hop_count; i++) { - sprintf(line, "[%X]", p_dr_path->path[i]); - strcat(buf, line); - } - - /* Check if the path given is in one of the fault paths */ - in_fault_paths = - __osm_pkt_randomizer_is_path_in_fault_paths(p_log, p_dr_path, - p_pkt_rand); - - /* Check if all paths are initialized */ - if (p_pkt_rand->num_paths_initialized < - p_pkt_rand->osm_pkt_num_unstable_links) { - /* Not all packets are initialized. */ - if (in_fault_paths == FALSE) { - /* the path is not in the false paths. Check using the rand value - if to update it there or not. */ - if (rand_value % - (p_pkt_rand->osm_pkt_unstable_link_rate) == 0) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "%s added to the fault_dr_paths list\n" - "\t\t\t rand_value:%u, unstable_link_rate:%u \n", - buf, rand_value, - p_pkt_rand->osm_pkt_unstable_link_rate); - - /* update the path in the fault paths */ - memcpy(& - (p_pkt_rand-> - fault_dr_paths[p_pkt_rand-> - num_paths_initialized]), - p_dr_path, sizeof(osm_dr_path_t)); - p_pkt_rand->num_paths_initialized++; - in_fault_paths = TRUE; - } - } - } - - if (in_fault_paths == FALSE) { - /* If in_fault_paths is FALSE - just ignore the path */ - OSM_LOG(p_log, OSM_LOG_VERBOSE, "%s not in fault paths\n", buf); - goto Exit; - } - - /* The path is in the fault paths. Need to choose (randomally if to drop it - or not. */ - rand_value = rand(); - - if (rand_value % (p_pkt_rand->osm_pkt_drop_rate) == 0) { - /* drop the current packet */ - res = TRUE; - OSM_LOG(p_log, OSM_LOG_VERBOSE, "Dropping path:%s\n", buf); - } - -Exit: - OSM_LOG_EXIT(p_log); - return res; -} - -boolean_t -osm_pkt_randomizer_mad_drop(IN osm_log_t * p_log, - IN osm_pkt_randomizer_t * p_pkt_randomizer, - IN const ib_mad_t * p_mad) -{ - const ib_smp_t *p_smp; - boolean_t res = FALSE; - osm_dr_path_t dr_path; - - OSM_LOG_ENTER(p_log); - - p_smp = (ib_smp_t *) p_mad; - - if (p_smp->mgmt_class != IB_MCLASS_SUBN_DIR) - /* This is a lid route mad. Don't drop it */ - goto Exit; - - osm_dr_path_init(&dr_path, 0, /* The h_bind is not really important for us to save */ - p_smp->hop_count, p_smp->initial_path); - - if (__osm_pkt_randomizer_process_path - (p_log, p_pkt_randomizer, &dr_path)) { - /* the mad should be dropped o */ - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "mad TID: 0x%" PRIx64 " is being dropped\n", - cl_ntoh64(p_smp->trans_id)); - res = TRUE; - } - -Exit: - OSM_LOG_EXIT(p_log); - return res; -} - -ib_api_status_t -osm_pkt_randomizer_init(IN OUT osm_pkt_randomizer_t ** pp_pkt_randomizer, - IN osm_log_t * p_log) -{ - uint8_t tmp; - ib_api_status_t res = IB_SUCCESS; - - OSM_LOG_ENTER(p_log); - - *pp_pkt_randomizer = malloc(sizeof(osm_pkt_randomizer_t)); - if (*pp_pkt_randomizer == NULL) { - res = IB_INSUFFICIENT_MEMORY; - goto Exit; - } - memset(*pp_pkt_randomizer, 0, sizeof(osm_pkt_randomizer_t)); - (*pp_pkt_randomizer)->num_paths_initialized = 0; - - tmp = atol(getenv("OSM_PKT_DROP_RATE")); - (*pp_pkt_randomizer)->osm_pkt_drop_rate = tmp; - - if (getenv("OSM_PKT_NUM_UNSTABLE_LINKS") != NULL - && (tmp = atol(getenv("OSM_PKT_NUM_UNSTABLE_LINKS"))) > 0) - (*pp_pkt_randomizer)->osm_pkt_num_unstable_links = tmp; - else - (*pp_pkt_randomizer)->osm_pkt_num_unstable_links = 1; - - if (getenv("OSM_PKT_UNSTABLE_LINK_RATE") != NULL - && (tmp = atol(getenv("OSM_PKT_UNSTABLE_LINK_RATE"))) > 0) - (*pp_pkt_randomizer)->osm_pkt_unstable_link_rate = tmp; - else - (*pp_pkt_randomizer)->osm_pkt_unstable_link_rate = 20; - - OSM_LOG(p_log, OSM_LOG_VERBOSE, "Using OSM_PKT_DROP_RATE=%u \n" - "\t\t\t\t OSM_PKT_NUM_UNSTABLE_LINKS=%u \n" - "\t\t\t\t OSM_PKT_UNSTABLE_LINK_RATE=%u \n", - (*pp_pkt_randomizer)->osm_pkt_drop_rate, - (*pp_pkt_randomizer)->osm_pkt_num_unstable_links, - (*pp_pkt_randomizer)->osm_pkt_unstable_link_rate); - - /* allocate the fault_dr_paths variable */ - /* It is the number of the paths that will be saved as fault = osm_pkt_num_unstable_links */ - (*pp_pkt_randomizer)->fault_dr_paths = malloc(sizeof(osm_dr_path_t) * - (*pp_pkt_randomizer)-> - osm_pkt_num_unstable_links); - if ((*pp_pkt_randomizer)->fault_dr_paths == NULL) { - res = IB_INSUFFICIENT_MEMORY; - goto Exit; - } - - memset((*pp_pkt_randomizer)->fault_dr_paths, 0, - sizeof(osm_dr_path_t) * - (*pp_pkt_randomizer)->osm_pkt_num_unstable_links); - -Exit: - OSM_LOG_EXIT(p_log); - return (res); -} - -void -osm_pkt_randomizer_destroy(IN OUT osm_pkt_randomizer_t ** pp_pkt_randomizer, - IN osm_log_t * p_log) -{ - OSM_LOG_ENTER(p_log); - - if (*pp_pkt_randomizer != NULL) { - free((*pp_pkt_randomizer)->fault_dr_paths); - free(*pp_pkt_randomizer); - } - OSM_LOG_EXIT(p_log); -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_al.c b/branches/opensm_3/user/libvendor/osm_vendor_al.c deleted file mode 100644 index d6bad906..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_al.c +++ /dev/null @@ -1,1546 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Portions Copyright (c) 2008 Microsoft Corporation. All rights reserved. - * - * This software is available to you under the OpenIB.org BSD license - * below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * $Id$ - */ - -/* - * Abstract: - * Implementation of osm_req_t. - * This object represents the generic attribute requester. - * This object is part of the opensm family of objects. - * - * Environment: - * Windows User Mode - * - * $Revision: 1.8 $ - */ - -#ifdef OSM_VENDOR_INTF_AL -/* - Next available error code: 0x300 -*/ - -#ifdef HAVE_CONFIG -#include -#endif - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -/****s* OpenSM: Vendor AL/osm_al_bind_info_t - * NAME - * osm_al_bind_info_t - * - * DESCRIPTION - * Structure containing bind information. - * - * SYNOPSIS - */ -typedef struct _osm_al_bind_info -{ - osm_vendor_t *p_vend; - void *client_context; - ib_qp_handle_t h_qp; - ib_mad_svc_handle_t h_svc; - uint8_t port_num; - ib_pool_key_t pool_key; - osm_vend_mad_recv_callback_t rcv_callback; - osm_vend_mad_send_err_callback_t send_err_callback; - osm_mad_pool_t *p_osm_pool; - ib_av_handle_t h_dr_av; - -} osm_al_bind_info_t; -/* - * FIELDS - * p_vend - * Pointer to the vendor object. - * - * client_context - * User's context passed during osm_bind - * - * h_qp - * Handle the QP for this bind. - * - * h_qp_svc - * Handle the QP mad service for this bind. - * - * port_num - * Port number (within the HCA) of the bound port. - * - * pool_key - * Pool key returned by all for this QP. - * - * h_dr_av - * Address vector handle used for all directed route SMPs. - * - * SEE ALSO - *********/ - -/********************************************************************** - **********************************************************************/ -inline static ib_api_status_t -__osm_al_convert_wcs( - IN ib_wc_status_t const wc_status ) -{ - switch( wc_status ) - { - case IB_WCS_SUCCESS: - return( IB_SUCCESS ); - - case IB_WCS_TIMEOUT_RETRY_ERR: - return( IB_TIMEOUT ); - - default: - return( IB_ERROR ); - } -} - -/********************************************************************** - **********************************************************************/ -void AL_API -__osm_set_vend_wrap( IN osm_al_bind_info_t* const p_bind, - IN ib_mad_element_t* const p_elem, - OUT osm_vend_wrap_t* p_vw) -{ - p_vw->h_bind = p_bind; - p_vw->size = p_elem->size; - p_vw->p_elem = p_elem; - p_vw->h_av = 0; - p_vw->p_resp_madw = NULL; - -} - - -static void AL_API -__osm_al_ca_err_callback( IN ib_async_event_rec_t *p_async_rec ) -{ - osm_vendor_t *p_vend = (osm_vendor_t*)p_async_rec->context; - OSM_LOG_ENTER( p_vend->p_log ); - - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_al_ca_err_callback: ERR 3B01: " - "Event on channel adapter (%s).\n", - ib_get_async_event_str( p_async_rec->code ) ); - - OSM_LOG_EXIT( p_vend->p_log ); -} - -/********************************************************************** - **********************************************************************/ -static void AL_API -__osm_al_ca_destroy_callback( IN void *context ) -{ - osm_al_bind_info_t *p_bind = (osm_al_bind_info_t*)context; - osm_vendor_t *p_vend = p_bind->p_vend; - OSM_LOG_ENTER( p_vend->p_log ); - - osm_log( p_vend->p_log, OSM_LOG_INFO, - "__osm_al_ca_destroy_callback: " - "Closing local channel adapter.\n" ); - - OSM_LOG_EXIT( p_vend->p_log ); -} - -/********************************************************************** - **********************************************************************/ - -static void AL_API -__osm_al_err_callback( IN ib_async_event_rec_t *p_async_rec ) -{ - osm_al_bind_info_t *p_bind = (osm_al_bind_info_t*)p_async_rec->context; - osm_vendor_t *p_vend = p_bind->p_vend; - OSM_LOG_ENTER( p_vend->p_log ); - - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_al_err_callback: ERR 3B02: " - "Error on QP (%s).\n", - ib_get_async_event_str( p_async_rec->code ) ); - - OSM_LOG_EXIT( p_vend->p_log ); -} - -/********************************************************************** - **********************************************************************/ -/* - Send_cb will handle the following cases : - Element Status | Send Response (no reponse expected) | Send Request (response expeceted) - ================|===========================================|========================================== - ERROR | Free : AV , madw(send_err_cb) | Free : AV , madw , resp_madw - SUCCESS | Free : AV , madw | Free : AV , madw - - Element Status | Receive Response (no reponse expected) - ================|=========================================== - ERROR | Free : AV , madw(send_err_cb) - SUCCESS | Free : AV , madw, resp_madw (both through rcv_callback) - -*/ -static void AL_API -__osm_al_send_callback( - IN const ib_mad_svc_handle_t h_mad_svc, - IN void *mad_svc_context, - IN ib_mad_element_t *p_elem ) -{ - osm_al_bind_info_t* const p_bind = (osm_al_bind_info_t*)mad_svc_context; - osm_vendor_t* const p_vend = p_bind->p_vend; - osm_madw_t* const p_madw = (osm_madw_t*)p_elem->context1; - osm_vend_wrap_t* p_vw = osm_madw_get_vend_ptr( p_madw ); - ib_mad_t *p_mad = ib_get_mad_buf( p_elem ); - ib_av_attr_t av_attr; - ib_pd_handle_t h_pd; - ib_api_status_t status_elem,status; - osm_madw_t *p_new_madw; - - OSM_LOG_ENTER( p_vend->p_log ); - UNUSED_PARAM(h_mad_svc); - CL_ASSERT( p_vw ); - CL_ASSERT( p_vw->h_av ); - /* since we use context1 , safely , and its the only place that remove the clean - p_elem,p_madw , h_av no checks are required */ - status_elem = __osm_al_convert_wcs(p_elem->status); - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "__osm_al_send_callback: " - "Destroying av handle %p.\n", p_elem->h_av ); - /* Check first if its a direct route handle , in this case skip */ - if (p_elem->h_av != p_bind->h_dr_av) - { - ib_destroy_av( p_elem->h_av ); - } - /* Since the free order is first resp_madw then madw (PARENT) we should check - this case first */ - if (p_elem->resp_expected) - { - p_madw->status = status_elem; - if ( status_elem != IB_SUCCESS ) - { - /* - Return any wrappers to the pool that may have been - pre-emptively allocated to handle a receive. - */ - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_al_send_callback: ERR 3333 " - " Mad Completed with WQE Error : %s.\n",ib_get_wc_status_str(p_elem->status)); - if( p_vw->p_resp_madw ) - { - osm_mad_pool_put( p_bind->p_osm_pool, p_vw->p_resp_madw ); - p_vw->p_resp_madw = NULL; - } - - p_bind->send_err_callback( p_bind->client_context, p_madw ); - } - else - { - /* We are in response flow of receive , need to apply the rcv_callback - The rcv_callback will free the resp_madw , req_madw , p_elem of receive - and request */ - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__osm_al_send_callback: " - "The Mad is a response , thus handeled in __osm_al_send_callback\n"); - p_new_madw = p_vw->p_resp_madw; - p_bind->rcv_callback( p_new_madw, p_bind->client_context, - p_madw ); - - } - } - else - { - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "__osm_al_send_callback: " - "Returning MAD to pool, TID = 0x%" PRIx64 ".\n", - cl_ntoh64( p_mad->trans_id ) ); - osm_mad_pool_put( p_bind->p_osm_pool, p_madw ); - if ( status_elem != IB_SUCCESS ) - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_al_send_callback: ERR 3b0b " - "request mad had failed.\n"); - goto Exit; - } - - - - - - Exit: - OSM_LOG_EXIT( p_vend->p_log ); -} - -/********************************************************************** - **********************************************************************/ -/* - Receive_cb will be applied in the following cases : - Element Status | Receive Response (no reponse expected) | Receive Request (response expeceted) - ================|==============================================|======================================= - ERROR | NOT APPLIED | NOT_APPLIED - SUCCESS | Free : Resp_madw , copy_req_madw | Allocate new_madw (for response then in send_cb free) - */ - static void AL_API -__osm_al_rcv_callback( - IN const ib_mad_svc_handle_t h_mad_svc, - IN void *mad_svc_context, - IN ib_mad_element_t *p_elem ) -{ - osm_al_bind_info_t* const p_bind = (osm_al_bind_info_t*)mad_svc_context; - osm_vendor_t* const p_vend = p_bind->p_vend; - osm_madw_t *p_old_madw,*p_copy_old_madw; - osm_madw_t *p_new_madw; - osm_vend_wrap_t* p_old_vw; - osm_vend_wrap_t* p_new_vw; - ib_mad_t *p_new_mad; - osm_mad_addr_t mad_addr; - - OSM_LOG_ENTER( p_vend->p_log ); - UNUSED_PARAM(h_mad_svc); - CL_ASSERT( p_elem->context1 == NULL ); - CL_ASSERT( p_elem->context2 == NULL ); - /* - osm_log( p_vend->p_log, OSM_LOG_VERBOSE, - "__osm_al_rcv_callback: " - "Handling Transaction : 0x%" PRIx64 " .\n", - cl_ntoh64(p_elem->p_mad_buf->trans_id)); - */ - p_new_mad = ib_get_mad_buf( p_elem ); - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "__osm_al_rcv_callback: " - "Acquired implicitly MAD %p.\n", p_new_mad ); - - /* - In preperation for initializing the new mad wrapper, - Initialize the mad_addr structure for the received wire MAD. - */ - mad_addr.dest_lid = p_elem->remote_lid; - mad_addr.path_bits = p_elem->path_bits; - - /* TO DO - figure out which #define to use for the 2.5 Gb rate... */ - mad_addr.static_rate = 0; - - if( p_new_mad->mgmt_class == IB_MCLASS_SUBN_LID || - p_new_mad->mgmt_class == IB_MCLASS_SUBN_DIR ) - { - mad_addr.addr_type.smi.source_lid = p_elem->remote_lid; - } - else - { - mad_addr.addr_type.gsi.remote_qp = p_elem->remote_qp; - mad_addr.addr_type.gsi.remote_qkey = p_elem->remote_qkey; - mad_addr.addr_type.gsi.pkey_ix = p_elem->pkey_index; - mad_addr.addr_type.gsi.service_level = p_elem->remote_sl; - mad_addr.addr_type.gsi.global_route = 0; /* FIXME: handle GRH */ - memset(&mad_addr.addr_type.gsi.grh_info, 0, - sizeof mad_addr.addr_type.gsi.grh_info); - } - - /* - If this MAD is a response to a previous request, - then grab our pre-allocated MAD wrapper. - Otherwise, allocate a new MAD wrapper. - context1 - contains the request madw - */ - if( ib_mad_is_response( p_new_mad ) ) - { - /* - The acquiring was done in the ib_get_mad_buf function. - If this is a request - then we impllicitly allocate the MAD. - In this case - it was allocated in the lower layer. The message - is for tracking down messages - locate how/where this mad was - allocated. - */ - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "__osm_al_rcv_callback: " - "The Mad is a response , thus handled in __osm_al_send_callback\n"); - CL_ASSERT( p_elem->send_context1 != NULL ); - CL_ASSERT( p_elem->send_context2 == NULL ); - - p_old_madw = (osm_madw_t*)p_elem->send_context1; - p_old_vw = osm_madw_get_vend_ptr( p_old_madw ); - p_new_madw = p_old_vw->p_resp_madw; - - CL_ASSERT( p_new_madw ); - osm_madw_init( p_new_madw, p_bind, p_elem->size, - &mad_addr ); - osm_madw_set_mad( p_new_madw, p_new_mad ); - p_new_vw = osm_madw_get_vend_ptr( p_new_madw ); - __osm_set_vend_wrap(p_bind,p_elem,p_new_vw); - goto Exit; - } - else - { - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "__osm_al_rcv_callback: " - "The Mad is a request , thus handled in __osm_al_rcv_callback\n"); - CL_ASSERT( p_elem->send_context1 == NULL ); - CL_ASSERT( p_elem->send_context2 == NULL ); - - p_new_madw = osm_mad_pool_get_wrapper( p_bind->p_osm_pool, - p_bind, p_elem->size, p_new_mad, &mad_addr ); - CL_ASSERT(p_new_madw); - p_new_vw = osm_madw_get_vend_ptr( p_new_madw ); - - __osm_set_vend_wrap(p_bind,p_elem,p_new_vw); - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "__osm_al_rcv_callback: " - "Calling receive callback function %p.\n", - p_bind->rcv_callback ); - - - p_bind->rcv_callback( p_new_madw, p_bind->client_context, - ((osm_madw_t*)p_elem->send_context1) ); - } - - - Exit: - OSM_LOG_EXIT( p_vend->p_log ); -} - -/********************************************************************** - **********************************************************************/ -ib_api_status_t -osm_vendor_init( - IN osm_vendor_t* const p_vend, - IN osm_log_t* const p_log, - IN const uint32_t timeout ) -{ - ib_api_status_t status; - OSM_LOG_ENTER( p_log ); - - p_vend->p_log = p_log; - - /* - Open our instance of AL. - */ - status = ib_open_al( &p_vend->h_al ); - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_init: ERR 3B03: " - "Error opening AL (%s).\n", - ib_get_err_str( status ) ); - - goto Exit; - } - - p_vend->timeout = timeout; - - Exit: - OSM_LOG_EXIT( p_log ); - return( status ); -} - -/********************************************************************** - **********************************************************************/ -osm_vendor_t* -osm_vendor_new( - IN osm_log_t* const p_log, - IN const uint32_t timeout ) -{ - ib_api_status_t status; - osm_vendor_t *p_vend; - - OSM_LOG_ENTER( p_log ); - - p_vend = cl_zalloc( sizeof(*p_vend) ); - if( p_vend == NULL ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_new: ERR 3B04: " - "Unable to allocate vendor object.\n" ); - goto Exit; - } - - status = osm_vendor_init( p_vend, p_log, timeout ); - if( status != IB_SUCCESS ) - { - cl_free( p_vend ); - p_vend = NULL; - } - - Exit: - OSM_LOG_EXIT( p_log ); - return( p_vend ); -} - -/********************************************************************** - **********************************************************************/ -void -osm_vendor_delete( - IN osm_vendor_t** const pp_vend ) -{ - /* TO DO - fill this in */ - ib_close_al( (*pp_vend)->h_al ); - cl_free( *pp_vend ); - *pp_vend = NULL; -} - -/********************************************************************** - **********************************************************************/ -static ib_api_status_t -__osm_ca_info_init( - IN osm_vendor_t* const p_vend, - IN osm_ca_info_t* const p_ca_info, - IN const ib_net64_t ca_guid ) -{ - ib_api_status_t status; - - OSM_LOG_ENTER( p_vend->p_log ); - - p_ca_info->guid = ca_guid; - - if( osm_log_is_active( p_vend->p_log, OSM_LOG_VERBOSE ) ) - { - osm_log( p_vend->p_log, OSM_LOG_VERBOSE, - "__osm_ca_info_init: " - "Querying CA 0x%" PRIx64 ".\n", - cl_ntoh64( ca_guid ) ); - } -/* attr size by verbs definition is required to be (uint32_t *) under opensm is only being set as 1 */ - status = ib_query_ca_by_guid( p_vend->h_al, ca_guid, NULL, - (uint32_t*)&p_ca_info->attr_size ); - if( (status != IB_INSUFFICIENT_MEMORY ) && (status != IB_SUCCESS ) ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_ca_info_init: ERR 3B05: " - "Unexpected status getting CA attributes (%s).\n", - ib_get_err_str( status ) ); - goto Exit; - } - - CL_ASSERT( p_ca_info->attr_size ); - - p_ca_info->p_attr = cl_malloc( p_ca_info->attr_size ); - if( p_ca_info->p_attr == NULL ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_ca_info_init: ERR 3B06: " - "Unable to allocate attribute storage.\n" ); - goto Exit; - } - - status = ib_query_ca_by_guid( p_vend->h_al, ca_guid, p_ca_info->p_attr, - (uint32_t*)&p_ca_info->attr_size ); - - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_ca_info_init: ERR 3B07: " - "Unexpected status getting CA attributes (%s).\n", - ib_get_err_str( status ) ); - goto Exit; - } - - Exit: - OSM_LOG_EXIT( p_vend->p_log ); - return( status ); -} - - -/********************************************************************** - **********************************************************************/ -void -osm_ca_info_destroy( - IN osm_vendor_t* const p_vend, - IN osm_ca_info_t* const p_ca_info ) -{ - OSM_LOG_ENTER( p_vend->p_log ); - - if( p_ca_info->p_attr ) - cl_free( p_ca_info->p_attr ); - - cl_free( p_ca_info ); - - OSM_LOG_EXIT( p_vend->p_log ); -} - -/********************************************************************** - **********************************************************************/ -osm_ca_info_t* -osm_ca_info_new( - IN osm_vendor_t* const p_vend, - IN const ib_net64_t ca_guid ) -{ - ib_api_status_t status; - osm_ca_info_t *p_ca_info; - - OSM_LOG_ENTER( p_vend->p_log ); - - CL_ASSERT( ca_guid ); - - p_ca_info = cl_zalloc( sizeof(*p_ca_info) ); - if( p_ca_info == NULL ) - goto Exit; - - status = __osm_ca_info_init( p_vend, p_ca_info, ca_guid ); - if( status != IB_SUCCESS ) - { - osm_ca_info_destroy( p_vend, p_ca_info ); - p_ca_info = NULL; - goto Exit; - } - - Exit: - OSM_LOG_EXIT( p_vend->p_log ); - return( p_ca_info ); -} - -/********************************************************************** - **********************************************************************/ -static ib_api_status_t -__osm_vendor_get_ca_guids( - IN osm_vendor_t* const p_vend, - IN ib_net64_t** const p_guids, - IN size_t* const p_num_guids ) -{ - ib_api_status_t status; - - OSM_LOG_ENTER( p_vend->p_log ); - - CL_ASSERT( p_guids ); - CL_ASSERT( p_num_guids ); - - status = ib_get_ca_guids( p_vend->h_al, NULL, p_num_guids ); - if( (status != IB_INSUFFICIENT_MEMORY ) && (status != IB_SUCCESS ) ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_get_ca_guids: ERR 3B08: " - "Unexpected status getting CA GUID array (%s).\n", - ib_get_err_str( status ) ); - goto Exit; - } - - if( *p_num_guids == 0 ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_get_ca_guids: ERR 3B09: " - "No available channel adapters.\n" ); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - *p_guids = cl_malloc( *p_num_guids * sizeof(**p_guids) ); - if( *p_guids == NULL ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_get_ca_guids: ERR 3B10: " - "Unable to allocate CA GUID array.\n" ); - goto Exit; - } - - status = ib_get_ca_guids( p_vend->h_al, *p_guids, p_num_guids ); - CL_ASSERT( *p_num_guids ); - - if( osm_log_is_active( p_vend->p_log, OSM_LOG_VERBOSE ) ) - { - osm_log( p_vend->p_log, OSM_LOG_VERBOSE, - "__osm_vendor_get_ca_guids: " - "Detected %u local channel adapters.\n", *p_num_guids ); - } - - Exit: - OSM_LOG_EXIT( p_vend->p_log ); - return( status ); -} - -/****f* OpenSM: CA Info/osm_ca_info_get_pi_ptr - * NAME - * osm_ca_info_get_pi_ptr - * - * DESCRIPTION - * Returns a pointer to the port attribute of the specified port - * owned by this CA. - * - * SYNOPSIS - */ -static ib_port_attr_t* -__osm_ca_info_get_port_attr_ptr( - IN const osm_ca_info_t* const p_ca_info, - IN const uint8_t index ) -{ - return( &p_ca_info->p_attr->p_port_attr[index] ); -} -/* - * PARAMETERS - * p_ca_info - * [in] Pointer to a CA Info object. - * - * index - * [in] Port "index" for which to retrieve the port attribute. - * The index is the offset into the ca's internal array - * of port attributes. - * - * RETURN VALUE - * Returns a pointer to the port attribute of the specified port - * owned by this CA. - * Also allocate p_vend->p_ca_info if not allocated and init it . - * - * NOTES - * - * SEE ALSO - *********/ - -/********************************************************************** - **********************************************************************/ -ib_api_status_t -osm_vendor_get_all_port_attr( - IN osm_vendor_t* const p_vend, - IN ib_port_attr_t* const p_attr_array, - IN uint32_t* const p_num_ports ) -{ - ib_api_status_t status; - - uint32_t ca; - size_t ca_count; - uint32_t port_count = 0; - uint8_t port_num; - uint32_t total_ports = 0; - ib_net64_t *p_ca_guid = NULL; - osm_ca_info_t *p_ca_info; - - OSM_LOG_ENTER( p_vend->p_log ); - - CL_ASSERT( p_vend ); - - /* - 1) Determine the number of CA's - 2) If not allready allocated - allocate an array big enough to hold the - ca info object , the ca info will be overwrite to contain the new ca info - 3) Call again to retrieve the guids. - */ - status = __osm_vendor_get_ca_guids( p_vend, &p_ca_guid, &ca_count ); - - if (p_vend->p_ca_info == NULL) - { - p_vend->p_ca_info = cl_zalloc( ca_count * sizeof(*(p_vend->p_ca_info)) ); - - if( p_vend->p_ca_info == NULL ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_all_port_attr: ERR 3B11: " - "Unable to allocate CA information array.\n" ); - goto Exit; - } - } - - p_vend->ca_count = ca_count; - - /* - For each CA, retrieve the port info attributes - */ - for( ca = 0; ca < ca_count; ca++ ) - { - p_ca_info = &p_vend->p_ca_info[ca]; - - status = __osm_ca_info_init( - p_vend, - p_ca_info, - p_ca_guid[ca] ); - - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_all_port_attr: ERR 3B12: " - "Unable to initialize CA Info object (%s).\n", - ib_get_err_str( status ) ); - } - - total_ports += osm_ca_info_get_num_ports( p_ca_info ); - } - - /* - If the user supplied enough storage, return the port guids, - otherwise, return the appropriate error. - */ - if( *p_num_ports >= total_ports ) - { - for( ca = 0; ca < ca_count; ca++ ) - { - uint32_t num_ports; - - p_ca_info = &p_vend->p_ca_info[ca]; - - num_ports = osm_ca_info_get_num_ports( p_ca_info ); - - for( port_num = 0; port_num < num_ports; port_num++ ) - { - p_attr_array[port_count] = - *__osm_ca_info_get_port_attr_ptr( p_ca_info, port_num ); - /* convert lid to host order */ - p_attr_array[port_count].lid = cl_ntoh16(p_attr_array[port_count].lid); - port_count++; - } - } - } - else - { - status = IB_INSUFFICIENT_MEMORY; - } - - - *p_num_ports = total_ports; - - - Exit: - if( p_ca_guid ) - cl_free( p_ca_guid ); - - OSM_LOG_EXIT( p_vend->p_log ); - return( status ); -} - -/********************************************************************** - **********************************************************************/ -ib_net64_t -osm_vendor_get_ca_guid( - IN osm_vendor_t* const p_vend, - IN const ib_net64_t port_guid ) -{ - uint8_t index; - uint8_t num_ports; - uint32_t num_guids = 0; - osm_ca_info_t *p_ca_info; - uint32_t ca; - - OSM_LOG_ENTER( p_vend->p_log ); - - CL_ASSERT( port_guid ); - /* - First, locate the HCA that owns this port. - */ - if( p_vend->p_ca_info == NULL ) - { - /* - Initialize the osm_ca_info_t array which allows - us to match port GUID to CA. - */ - osm_vendor_get_all_port_attr( p_vend, NULL, &num_guids ); - } - - CL_ASSERT( p_vend->p_ca_info ); - CL_ASSERT( p_vend->ca_count ); - - for( ca = 0; ca < p_vend->ca_count; ca++ ) - { - p_ca_info = &p_vend->p_ca_info[ca]; - - num_ports = osm_ca_info_get_num_ports( p_ca_info ); - CL_ASSERT( num_ports ); - - for( index = 0; index < num_ports; index++ ) - { - if( port_guid == - osm_ca_info_get_port_guid( p_ca_info, index ) ) - { - OSM_LOG_EXIT( p_vend->p_log ); - return( osm_ca_info_get_ca_guid( p_ca_info ) ); - } - } - } - - /* - No local CA owns this guid! - */ - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_ca_guid: ERR 3B13: " - "Unable to determine CA guid.\n" ); - - OSM_LOG_EXIT( p_vend->p_log ); - return( 0 ); -} - -/********************************************************************** - **********************************************************************/ -uint8_t -osm_vendor_get_port_num( - IN osm_vendor_t* const p_vend, - IN const ib_net64_t port_guid ) -{ - uint8_t index; - uint8_t num_ports; - uint32_t num_guids = 0; - osm_ca_info_t *p_ca_info; - uint32_t ca; - - OSM_LOG_ENTER( p_vend->p_log ); - - CL_ASSERT( port_guid ); - /* - First, locate the HCA that owns this port. - */ - if( p_vend->p_ca_info == NULL ) - { - /* - Initialize the osm_ca_info_t array which allows - us to match port GUID to CA. - */ - osm_vendor_get_all_port_attr( p_vend, NULL, &num_guids ); - } - - CL_ASSERT( p_vend->p_ca_info ); - CL_ASSERT( p_vend->ca_count ); - - for( ca = 0; ca < p_vend->ca_count; ca++ ) - { - p_ca_info = &p_vend->p_ca_info[ca]; - - num_ports = osm_ca_info_get_num_ports( p_ca_info ); - CL_ASSERT( num_ports ); - - for( index = 0; index < num_ports; index++ ) - { - if( port_guid == - osm_ca_info_get_port_guid( p_ca_info, index ) ) - { - OSM_LOG_EXIT( p_vend->p_log ); - return( osm_ca_info_get_port_num( p_ca_info, index ) ); - } - } - } - - /* - No local CA owns this guid! - */ - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_port_num: ERR 3B30: " - "Unable to determine CA guid.\n" ); - - OSM_LOG_EXIT( p_vend->p_log ); - return( 0 ); -} - - -/********************************************************************** - **********************************************************************/ -static ib_api_status_t -__osm_vendor_open_ca( - IN osm_vendor_t* const p_vend, - IN const ib_net64_t port_guid ) -{ - ib_net64_t ca_guid; - ib_api_status_t status; - - OSM_LOG_ENTER( p_vend->p_log ); - - ca_guid = osm_vendor_get_ca_guid( p_vend, port_guid ); - if( ca_guid == 0 ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_open_ca: ERR 3B31: " - "Bad port GUID value 0x%" PRIx64 ".\n", - cl_ntoh64( port_guid ) ); - status = IB_ERROR; - goto Exit; - } - - osm_log( p_vend->p_log, OSM_LOG_VERBOSE, - "__osm_vendor_open_ca: " - "Opening HCA 0x%" PRIx64 ".\n", cl_ntoh64( ca_guid ) ); - - status = ib_open_ca( p_vend->h_al, - ca_guid, - __osm_al_ca_err_callback, - p_vend, - &p_vend->h_ca ); - - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_open_ca: ERR 3B15: " - "Unable to open CA (%s).\n", - ib_get_err_str( status ) ); - goto Exit; - } - - CL_ASSERT( p_vend->h_ca ); - - status = ib_alloc_pd( - p_vend->h_ca, - IB_PDT_ALIAS, - p_vend, - &p_vend->h_pd ); - - if( status != IB_SUCCESS ) - { - ib_close_ca( p_vend->h_ca,__osm_al_ca_destroy_callback ); - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_open_ca: ERR 3B16: " - "Unable to allocate protection domain (%s).\n", - ib_get_err_str( status ) ); - goto Exit; - } - - CL_ASSERT( p_vend->h_pd ); - - Exit: - OSM_LOG_EXIT( p_vend->p_log ); - return( status ); -} - -/********************************************************************** - **********************************************************************/ -static void -__osm_vendor_init_av( - IN const osm_al_bind_info_t* p_bind, - IN ib_av_attr_t* p_av ) -{ - cl_memclr( p_av, sizeof(*p_av) ); - p_av->port_num = p_bind->port_num; - p_av->dlid = IB_LID_PERMISSIVE; -} - -/********************************************************************** - **********************************************************************/ -osm_bind_handle_t -osm_vendor_bind( - IN osm_vendor_t* const p_vend, - IN osm_bind_info_t* const p_user_bind, - IN osm_mad_pool_t* const p_mad_pool, - IN osm_vend_mad_recv_callback_t mad_recv_callback, - IN osm_vend_mad_send_err_callback_t send_err_callback, - IN void* context ) -{ - ib_net64_t port_guid; - osm_al_bind_info_t *p_bind = 0; - ib_api_status_t status; - ib_qp_create_t qp_create; - ib_mad_svc_t mad_svc; - ib_av_attr_t av; - - OSM_LOG_ENTER( p_vend->p_log ); - - CL_ASSERT( p_user_bind ); - CL_ASSERT( p_mad_pool ); - CL_ASSERT( mad_recv_callback ); - CL_ASSERT( send_err_callback ); - - port_guid = p_user_bind->port_guid; - osm_log( p_vend->p_log, OSM_LOG_INFO, - "osm_vendor_bind: Binding to port 0x%" PRIx64 ".\n", - cl_ntoh64( port_guid ) ); - - if( p_vend->h_ca == 0 ) - { - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_bind: " - "Opening CA that owns port 0x%" PRIx64 ".\n", - cl_ntoh64( port_guid )); - - status = __osm_vendor_open_ca( p_vend, port_guid ); - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 3B17: " - "Unable to Open CA (%s).\n", - ib_get_err_str( status ) ); - goto Exit; - } - } - - p_bind = cl_zalloc( sizeof(*p_bind) ); - if( p_bind == NULL ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 3B18: " - "Unable to allocate internal bind object.\n" ); - goto Exit; - } - - p_bind->p_vend = p_vend; - p_bind->client_context = context; - p_bind->port_num = osm_vendor_get_port_num( p_vend, port_guid ); - p_bind->rcv_callback = mad_recv_callback; - p_bind->send_err_callback = send_err_callback; - p_bind->p_osm_pool = p_mad_pool; - - CL_ASSERT( p_bind->port_num ); - - /* - Get the proper QP. - */ - cl_memclr( &qp_create, sizeof(qp_create) ); - - switch( p_user_bind->mad_class ) - { - case IB_MCLASS_SUBN_LID: - case IB_MCLASS_SUBN_DIR: - qp_create.qp_type = IB_QPT_QP0_ALIAS; - break; - - case IB_MCLASS_SUBN_ADM: - default: - qp_create.qp_type = IB_QPT_QP1_ALIAS; - break; - } - - qp_create.sq_depth = p_user_bind->send_q_size; - qp_create.rq_depth = p_user_bind->recv_q_size; - qp_create.sq_sge = OSM_AL_SQ_SGE; - qp_create.rq_sge = OSM_AL_RQ_SGE; - status = ib_get_spl_qp( p_vend->h_pd, - port_guid, - &qp_create, - p_bind, - __osm_al_err_callback, - &p_bind->pool_key, - &p_bind->h_qp ); - - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 3B19: " - "Unable to get QP handle (%s).\n", - ib_get_err_str( status ) ); - cl_free( p_bind ); - p_bind = 0; - goto Exit; - } - - CL_ASSERT( p_bind->h_qp ); - CL_ASSERT( p_bind->pool_key ); - - cl_memclr( &mad_svc, sizeof(mad_svc) ); - - mad_svc.mad_svc_context = p_bind; - mad_svc.pfn_mad_send_cb = __osm_al_send_callback; - mad_svc.pfn_mad_recv_cb = __osm_al_rcv_callback; - mad_svc.mgmt_class = p_user_bind->mad_class; - mad_svc.mgmt_version = p_user_bind->class_version; - mad_svc.support_unsol = p_user_bind->is_responder; - - mad_svc.method_array[IB_MAD_METHOD_GET] = TRUE; - mad_svc.method_array[IB_MAD_METHOD_SET] = TRUE; - mad_svc.method_array[IB_MAD_METHOD_DELETE] = TRUE; - mad_svc.method_array[IB_MAD_METHOD_TRAP] = TRUE; - mad_svc.method_array[IB_MAD_METHOD_GETTABLE] = TRUE; - -#ifdef DUAL_SIDED_RMPP - mad_svc.method_array[IB_MAD_METHOD_GETMULTI] = TRUE; -#endif - /* Add in IB_MAD_METHOD_GETTRACETABLE */ - /* when supported by OpenSM */ -#if 0 - if (p_user_bind->is_report_processor) - mad_svc.method_array[IB_MAD_METHOD_REPORT] = TRUE; - - if (p_user_bind->is_trap_processor) { - mad_svc.method_array[IB_MAD_METHOD_TRAP] = TRUE; - mad_svc.method_array[IB_MAD_METHOD_TRAP_REPRESS] = TRUE; - } -#endif - status = ib_reg_mad_svc( p_bind->h_qp, &mad_svc, &p_bind->h_svc ); - - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 3B21: " - "Unable to register QP0 MAD service (%s).\n", - ib_get_err_str( status ) ); - cl_free( p_bind ); - p_bind = 0; - goto Exit; - } - - __osm_vendor_init_av( p_bind, &av ); - - status = ib_create_av( p_vend->h_pd, &av, &(p_bind->h_dr_av) ); - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 3B22: " - "Unable to create address vector (%s).\n", - ib_get_err_str( status ) ); - - cl_free( p_bind ); - p_bind = 0; - goto Exit; - } - - if( osm_log_is_active( p_vend->p_log, OSM_LOG_DEBUG ) ) - { - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_bind: " - "Allocating av handle %p.\n", p_bind->h_dr_av ); - } - - Exit: - OSM_LOG_EXIT( p_vend->p_log ); - return( (osm_bind_handle_t)p_bind ); -} - -/********************************************************************** - **********************************************************************/ -/* osm_vendor_unbind is added due to OSM-1.8.0 gen2 merging - The functionality will be added when the Gen2 osm_vendor_unbind - will be implemented. -*/ -void -osm_vendor_unbind( - IN osm_bind_handle_t h_bind) -{ - osm_al_bind_info_t *p_bind = ( osm_al_bind_info_t * ) h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - - - OSM_LOG_ENTER( p_vend->p_log ); - - OSM_LOG_EXIT( p_vend->p_log); -} - -/********************************************************************** - **********************************************************************/ -ib_mad_t* -osm_vendor_get( - IN osm_bind_handle_t h_bind, - IN const uint32_t mad_size, - IN osm_vend_wrap_t* const p_vw ) -{ - ib_mad_t *p_mad; - osm_al_bind_info_t *p_bind = (osm_al_bind_info_t *)h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - ib_api_status_t status; - - OSM_LOG_ENTER( p_vend->p_log ); - - CL_ASSERT( p_vw ); - - p_vw->size = mad_size; - p_vw->h_bind = h_bind; - - /* - Retrieve a MAD element from the pool and give the user direct - access to its buffer. - */ - status = ib_get_mad( p_bind->pool_key, mad_size, &p_vw->p_elem ); - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get: ERR 3B25: " - "Unable to acquire MAD (%s).\n", - ib_get_err_str( status ) ); - - p_mad = NULL; - goto Exit; - } - - CL_ASSERT( p_vw->p_elem ); - p_mad = ib_get_mad_buf( p_vw->p_elem ); - - if( osm_log_get_level( p_vend->p_log ) >= OSM_LOG_DEBUG ) - { - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_get: " - "Acquired MAD %p, size = %u.\n", p_mad, mad_size ); - } - - Exit: - OSM_LOG_EXIT( p_vend->p_log ); - return( p_mad ); -} - -/********************************************************************** - **********************************************************************/ -void -osm_vendor_put( - IN osm_bind_handle_t h_bind, - IN osm_vend_wrap_t* const p_vw ) -{ - osm_al_bind_info_t *p_bind = (osm_al_bind_info_t *)h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - ib_api_status_t status; - - OSM_LOG_ENTER( p_vend->p_log ); - - CL_ASSERT( p_vw ); - CL_ASSERT( p_vw->p_elem ); - CL_ASSERT( p_vw->h_bind == h_bind ); - - if( osm_log_get_level( p_vend->p_log ) >= OSM_LOG_DEBUG ) - { - - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_put: " - "Retiring MAD %p.\n", ib_get_mad_buf( p_vw->p_elem ) ); - // "Retiring MAD %p.\n", p_mad); - } - - status = ib_put_mad( p_vw->p_elem ); - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_put: ERR 3B26: " - "Unable to retire MAD (%s).\n", - ib_get_err_str( status ) ); - } - - OSM_LOG_EXIT( p_vend->p_log ); -} - -/********************************************************************** - **********************************************************************/ -ib_api_status_t -osm_vendor_send( - IN osm_bind_handle_t h_bind, - IN osm_madw_t* const p_madw, - IN boolean_t const resp_expected ) -{ - osm_al_bind_info_t* const p_bind = h_bind; - osm_vendor_t* const p_vend = p_bind->p_vend; - osm_vend_wrap_t* const p_vw = osm_madw_get_vend_ptr( p_madw ); - osm_mad_addr_t* const p_mad_addr = osm_madw_get_mad_addr_ptr( p_madw ); - ib_mad_t* const p_mad = osm_madw_get_mad_ptr( p_madw ); - ib_api_status_t status; - ib_mad_element_t *p_elem; - ib_av_attr_t av; - - OSM_LOG_ENTER( p_vend->p_log ); - - CL_ASSERT( p_vw->h_bind == h_bind ); - CL_ASSERT( p_vw->p_elem ); - - p_elem = p_vw->p_elem; - - /* - If a response is expected to this MAD, then preallocate - a mad wrapper to contain the wire MAD received in the - response. Allocating a wrapper here allows for easier - failure paths than after we already received the wire mad. - In order to seperate the receive callback and the send callback - dependency , we copy the request madw and send it as context2 - Which in time in the receive callback will replace the req_madw - to allow avoid races with send callback - */ - if( resp_expected ) - { - p_vw->p_resp_madw = osm_mad_pool_get_wrapper_raw( - p_bind->p_osm_pool ); - if( p_vw->p_resp_madw == NULL ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_send: ERR 3B27: " - "Unable to allocate MAD wrapper.\n" ); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - } - else - p_vw->p_resp_madw = NULL; - - /* - For all sends other than directed route SM MADs, - acquire an address vector for the destination. - */ - if( p_mad->mgmt_class != IB_MCLASS_SUBN_DIR ) - { - cl_memclr( &av, sizeof(av) ); - av.port_num = p_bind->port_num; - av.dlid = p_mad_addr->dest_lid; - av.static_rate = p_mad_addr->static_rate; - av.path_bits = p_mad_addr->path_bits; - - if( (p_mad->mgmt_class != IB_MCLASS_SUBN_LID) && - (p_mad->mgmt_class != IB_MCLASS_SUBN_DIR) ) - { - av.sl = p_mad_addr->addr_type.gsi.service_level; - - - if(p_mad_addr->addr_type.gsi.global_route) - { - av.grh_valid = TRUE; - /* ANIL */ - /* av.grh = p_mad_addr->addr_type.gsi.grh_info; */ - } - } - - if( osm_log_is_active( p_vend->p_log, OSM_LOG_DEBUG ) ) - { - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_send: " - "av.port_num 0x%X, " - "av.dlid 0x%X, " - "av.static_rate %d, " - "av.path_bits %d.\n", - av.port_num, cl_ntoh16(av.dlid), - av.static_rate, av.path_bits); - } - - status = ib_create_av( p_vend->h_pd, &av, &(p_vw->h_av) ); - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_send: ERR 3B28: " - "Unable to create address vector (%s).\n", - ib_get_err_str( status ) ); - - if( p_vw->p_resp_madw ) - osm_mad_pool_put( p_bind->p_osm_pool, p_vw->p_resp_madw ); - /* Since we in immediate error the vendor layer is expected to handle the rollback , i.e free of madw */ - if (p_madw) - osm_mad_pool_put( p_bind->p_osm_pool, p_madw ); - goto Exit; - } - - if( osm_log_is_active( p_vend->p_log, OSM_LOG_DEBUG ) ) - { - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_send: " - "Allocating av handle %p.\n", p_vw->h_av ); - } - } - else - { - p_vw->h_av = p_bind->h_dr_av; - } - - p_elem->h_av = p_vw->h_av; - - p_elem->context1 = p_madw; - p_elem->context2 = NULL; - - p_elem->immediate_data = 0; - p_elem->p_grh = NULL; - p_elem->resp_expected = resp_expected; - p_elem->retry_cnt = OSM_DEFAULT_RETRY_COUNT; - - p_elem->send_opt = IB_SEND_OPT_SIGNALED; - p_elem->timeout_ms = p_vend->timeout; - - /* Completion information. */ - p_elem->status = 0; /* Not trusting AL */ - - - if( (p_mad->mgmt_class == IB_MCLASS_SUBN_LID) || - (p_mad->mgmt_class == IB_MCLASS_SUBN_DIR) ) - { - p_elem->remote_qp = 0; - p_elem->remote_qkey = 0; - } - else - { - p_elem->remote_qp = p_mad_addr->addr_type.gsi.remote_qp; - p_elem->remote_qkey = p_mad_addr->addr_type.gsi.remote_qkey; - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_send: " - "remote qp = 0x%X, remote qkey = 0x%X.\n", - cl_ntoh32(p_elem->remote_qp), - cl_ntoh32(p_elem->remote_qkey) ); - } - - status = ib_send_mad( p_bind->h_svc, p_elem, NULL ); - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_send: ERR 3B29: " - "Send failed , cleaning up (%s).\n", - ib_get_err_str( status ) ); - /* When we destroy the av - we should take the pointer from local allocation since - we do not "trust" IBAL to keep track in p_elem */ - - if (p_vw->h_av && (p_vw->h_av != p_bind->h_dr_av) ) - { - osm_log( p_vend->p_log, OSM_LOG_DEBUG, - "__osm_al_send: " - "Destroying av handle %p.\n", p_vw->h_av ); - ib_destroy_av( p_vw->h_av ); - } - if( p_vw->p_resp_madw ) - osm_mad_pool_put( p_bind->p_osm_pool, p_vw->p_resp_madw ); - /* Since we in immediate error the vendor layer is expected to handle the rollback , i.e free of madw */ - if (p_madw) - osm_mad_pool_put( p_bind->p_osm_pool, p_madw ); - goto Exit; - } - - Exit: - OSM_LOG_EXIT( p_vend->p_log ); - return( status ); -} - -/********************************************************************** - **********************************************************************/ -ib_api_status_t -osm_vendor_local_lid_change( - IN osm_bind_handle_t h_bind ) -{ - osm_al_bind_info_t *p_bind = (osm_al_bind_info_t *)h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - - OSM_LOG_ENTER( p_vend->p_log ); - - OSM_LOG_EXIT( p_vend->p_log ); - return( IB_SUCCESS ); -} - -/********************************************************************** - **********************************************************************/ -void -osm_vendor_set_sm( - IN osm_bind_handle_t h_bind, - IN boolean_t is_sm_val ) -{ - osm_al_bind_info_t *p_bind = (osm_al_bind_info_t *)h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - ib_api_status_t status; - ib_port_attr_mod_t attr_mod; - - OSM_LOG_ENTER( p_vend->p_log ); - - cl_memclr( &attr_mod, sizeof(attr_mod) ); - - attr_mod.cap.sm = is_sm_val; - - status = ib_modify_ca( p_vend->h_ca, p_bind->port_num, - IB_CA_MOD_IS_SM, &attr_mod ); - - if( status != IB_SUCCESS ) - { - osm_log( p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_set_sm: ERR 3B34: " - "Unable set 'IS_SM' bit to:%u in port attributes (%s).\n", - is_sm_val, ib_get_err_str( status ) ); - } - - OSM_LOG_EXIT( p_vend->p_log ); -} - -/********************************************************************** - **********************************************************************/ -void osm_vendor_set_debug(IN osm_vendor_t * const p_vend, IN int32_t level) -{ -} - -#endif /* OSM_VENDOR_INTF_AL */ diff --git a/branches/opensm_3/user/libvendor/osm_vendor_ibumad.c b/branches/opensm_3/user/libvendor/osm_vendor_ibumad.c deleted file mode 100644 index 79af5b44..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_ibumad.c +++ /dev/null @@ -1,1194 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_vendor_t (for umad). - * This object represents the OpenIB vendor layer. - * This object is part of the opensm family of objects. - * - * Environment: - * Linux User Mode - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#ifdef OSM_VENDOR_INTF_OPENIB - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/****s* OpenSM: Vendor UMAD/osm_umad_bind_info_t - * NAME - * osm_umad_bind_info_t - * - * DESCRIPTION - * Structure containing bind information. - * - * SYNOPSIS - */ -typedef struct _osm_umad_bind_info { - osm_vendor_t *p_vend; - void *client_context; - osm_mad_pool_t *p_mad_pool; - osm_vend_mad_recv_callback_t mad_recv_callback; - osm_vend_mad_send_err_callback_t send_err_callback; - ib_net64_t port_guid; - int port_id; - int agent_id; - int agent_id1; /* SMI requires two agents */ - int timeout; - int max_retries; -} osm_umad_bind_info_t; - -typedef struct _umad_receiver { - pthread_t tid; - osm_vendor_t *p_vend; - osm_log_t *p_log; -} umad_receiver_t; - -static void osm_vendor_close_port(osm_vendor_t * const p_vend); - -static void clear_madw(osm_vendor_t * p_vend) -{ - umad_match_t *m, *e, *old_m; - ib_net64_t old_tid; - - OSM_LOG_ENTER(p_vend->p_log); - pthread_mutex_lock(&p_vend->match_tbl_mutex); - for (m = p_vend->mtbl.tbl, e = m + p_vend->mtbl.max; m < e; m++) { - if (m->tid) { - old_m = m; - old_tid = m->tid; - m->tid = 0; - osm_mad_pool_put(((osm_umad_bind_info_t - *) ((osm_madw_t *) m->v)->h_bind)-> - p_mad_pool, m->v); - pthread_mutex_unlock(&p_vend->match_tbl_mutex); - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5401: " - "evicting entry %p (tid was 0x%" PRIx64 ")\n", - old_m, cl_ntoh64(old_tid)); - goto Exit; - } - } - pthread_mutex_unlock(&p_vend->match_tbl_mutex); - -Exit: - OSM_LOG_EXIT(p_vend->p_log); -} - -static osm_madw_t *get_madw(osm_vendor_t * p_vend, ib_net64_t * tid) -{ - umad_match_t *m, *e; - ib_net64_t mtid = (*tid & CL_HTON64(0x00000000ffffffffULL)); - osm_madw_t *res; - - /* - * Since mtid == 0 is the empty key, we should not - * waste time looking for it - */ - if (mtid == 0) - return 0; - - pthread_mutex_lock(&p_vend->match_tbl_mutex); - for (m = p_vend->mtbl.tbl, e = m + p_vend->mtbl.max; m < e; m++) { - if (m->tid == mtid) { - m->tid = 0; - *tid = mtid; - res = m->v; - pthread_mutex_unlock(&p_vend->match_tbl_mutex); - return res; - } - } - - pthread_mutex_unlock(&p_vend->match_tbl_mutex); - return 0; -} - -static void -put_madw(osm_vendor_t * p_vend, osm_madw_t * p_madw, ib_net64_t tid) -{ - umad_match_t *m, *e, *old_lru, *lru = 0; - osm_madw_t *p_req_madw; - osm_umad_bind_info_t *p_bind; - ib_net64_t old_tid; - uint32_t oldest = ~0; - - pthread_mutex_lock(&p_vend->match_tbl_mutex); - for (m = p_vend->mtbl.tbl, e = m + p_vend->mtbl.max; m < e; m++) { - if (m->tid == 0) { - m->tid = tid; - m->v = p_madw; - m->version = - cl_atomic_inc((atomic32_t *) & p_vend->mtbl. - last_version); - pthread_mutex_unlock(&p_vend->match_tbl_mutex); - return; - } - if (oldest > m->version) { - oldest = m->version; - lru = m; - } - } - - old_lru = lru; - old_tid = lru->tid; - p_req_madw = old_lru->v; - p_bind = p_req_madw->h_bind; - p_req_madw->status = IB_CANCELED; - pthread_mutex_lock(&p_vend->cb_mutex); - (*p_bind->send_err_callback) (p_bind->client_context, p_req_madw); - pthread_mutex_unlock(&p_vend->cb_mutex); - lru->tid = tid; - lru->v = p_madw; - lru->version = - cl_atomic_inc((atomic32_t *) & p_vend->mtbl.last_version); - pthread_mutex_unlock(&p_vend->match_tbl_mutex); - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5402: " - "evicting entry %p (tid was 0x%" PRIx64 ")\n", old_lru, - cl_ntoh64(old_tid)); -} - -static void -ib_mad_addr_conv(ib_user_mad_t * umad, osm_mad_addr_t * osm_mad_addr, - int is_smi) -{ - ib_mad_addr_t *ib_mad_addr = umad_get_mad_addr(umad); - osm_mad_addr->dest_lid = ib_mad_addr->lid; - osm_mad_addr->path_bits = ib_mad_addr->path_bits; - osm_mad_addr->static_rate = 0; - - if (is_smi) { - osm_mad_addr->addr_type.smi.source_lid = osm_mad_addr->dest_lid; - osm_mad_addr->addr_type.smi.port_num = 255; /* not used */ - return; - } - - osm_mad_addr->addr_type.gsi.remote_qp = ib_mad_addr->qpn; - osm_mad_addr->addr_type.gsi.remote_qkey = ib_mad_addr->qkey; - osm_mad_addr->addr_type.gsi.pkey_ix = umad_get_pkey(umad); - osm_mad_addr->addr_type.gsi.service_level = ib_mad_addr->sl; - osm_mad_addr->addr_type.gsi.global_route = 0; /* FIXME: handle GRH */ - memset(&osm_mad_addr->addr_type.gsi.grh_info, 0, - sizeof osm_mad_addr->addr_type.gsi.grh_info); -} - -static void *swap_mad_bufs(osm_madw_t * p_madw, void *umad) -{ - void *old; - - old = p_madw->vend_wrap.umad; - p_madw->vend_wrap.umad = umad; - p_madw->p_mad = umad_get_mad(umad); - - return old; -} - -static void unlock_mutex(void *arg) -{ - pthread_mutex_unlock(arg); -} - -static void * OSM_API umad_receiver(void *p_ptr) -{ - umad_receiver_t *const p_ur = (umad_receiver_t *) p_ptr; - osm_vendor_t *p_vend = p_ur->p_vend; - osm_umad_bind_info_t *p_bind; - ib_mad_addr_t *ib_mad_addr; - osm_mad_addr_t osm_addr; - osm_madw_t *p_madw, *p_req_madw; - ib_mad_t *mad; - void *umad = 0; - int mad_agent, length; - - OSM_LOG_ENTER(p_ur->p_log); - - for (;;) { - if (!umad && - !(umad = umad_alloc(1, umad_size() + MAD_BLOCK_SIZE))) { - OSM_LOG(p_ur->p_log, OSM_LOG_ERROR, "ERR 5403: " - "can't alloc MAD sized umad\n"); - break; - } - - length = MAD_BLOCK_SIZE; - if ((mad_agent = umad_recv(p_vend->umad_port_id, umad, - &length, -1)) < 0) { - if (length <= MAD_BLOCK_SIZE) { - OSM_LOG(p_ur->p_log, OSM_LOG_ERROR, "ERR 5404: " - "recv error on MAD sized umad (%m)\n"); - continue; - } else { - umad_free(umad); - /* Need a larger buffer for RMPP */ - umad = umad_alloc(1, umad_size() + length); - if (!umad) { - OSM_LOG(p_ur->p_log, OSM_LOG_ERROR, - "ERR 5405: " - "can't alloc umad length %d\n", - length); - continue; - } - - if ((mad_agent = umad_recv(p_vend->umad_port_id, - umad, &length, - -1)) < 0) { - OSM_LOG(p_ur->p_log, OSM_LOG_ERROR, - "ERR 5406: " - "recv error on umad length %d (%m)\n", - length); - continue; - } - } - } - - if (mad_agent >= OSM_UMAD_MAX_AGENTS || - !(p_bind = p_vend->agents[mad_agent])) { - OSM_LOG(p_ur->p_log, OSM_LOG_ERROR, "ERR 5407: " - "invalid mad agent %d - dropping\n", mad_agent); - continue; - } - - mad = (ib_mad_t *) umad_get_mad(umad); - ib_mad_addr = umad_get_mad_addr(umad); - - ib_mad_addr_conv(umad, &osm_addr, - mad->mgmt_class == IB_MCLASS_SUBN_LID || - mad->mgmt_class == IB_MCLASS_SUBN_DIR); - - if (!(p_madw = osm_mad_pool_get(p_bind->p_mad_pool, - (osm_bind_handle_t) p_bind, - MAX(length, MAD_BLOCK_SIZE), - &osm_addr))) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5408: " - "request for a new madw failed -- dropping packet\n"); - continue; - } - - /* Need to fix up MAD size if short RMPP packet */ - if (length < MAD_BLOCK_SIZE) - p_madw->mad_size = length; - - /* - * Avoid copying by swapping mad buf pointers. - * Do not use umad after this line of code. - */ - umad = swap_mad_bufs(p_madw, umad); - - /* if status != 0 then we are handling recv timeout on send */ - if (umad_status(p_madw->vend_wrap.umad)) { - - if (mad->mgmt_class != IB_MCLASS_SUBN_DIR) { - /* LID routed */ - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5410: " - "Send completed with error -- dropping\n" - "\t\t\tClass 0x%x, Method 0x%X, Attr 0x%X, " - "TID 0x%" PRIx64 ", LID %u\n", - mad->mgmt_class, mad->method, - cl_ntoh16(mad->attr_id), - cl_ntoh64(mad->trans_id), - cl_ntoh16(ib_mad_addr->lid)); - } else { - ib_smp_t *smp; - - /* Direct routed SMP */ - smp = (ib_smp_t *) mad; - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5411: " - "DR SMP Send completed with error -- dropping\n" - "\t\t\tMethod 0x%X, Attr 0x%X, TID 0x%" PRIx64 - ", Hop Ptr: 0x%X\n", - mad->method, cl_ntoh16(mad->attr_id), - cl_ntoh64(mad->trans_id), smp->hop_ptr); - osm_dump_smp_dr_path(p_vend->p_log, smp, - OSM_LOG_ERROR); - } - - if (!(p_req_madw = get_madw(p_vend, &mad->trans_id))) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, - "ERR 5412: " - "Failed to obtain request madw for timed out MAD" - " (method=0x%X attr=0x%X tid=0x%"PRIx64") -- dropping\n", - mad->method, cl_ntoh16(mad->attr_id), - cl_ntoh64(mad->trans_id)); - } else { - p_req_madw->status = IB_TIMEOUT; - /* cb frees req_madw */ -#ifdef __WIN__ - pthread_mutex_lock(&p_vend->cb_mutex); - (*p_bind->send_err_callback) (p_bind-> - client_context, - p_req_madw); - pthread_mutex_unlock(&p_vend->cb_mutex); -#else - pthread_mutex_lock(&p_vend->cb_mutex); - pthread_cleanup_push(unlock_mutex, - &p_vend->cb_mutex); - (*p_bind->send_err_callback) (p_bind-> - client_context, - p_req_madw); - pthread_cleanup_pop(1); -#endif - } - - osm_mad_pool_put(p_bind->p_mad_pool, p_madw); - continue; - } - - p_req_madw = 0; - if (ib_mad_is_response(mad) && - !(p_req_madw = get_madw(p_vend, &mad->trans_id))) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5413: " - "Failed to obtain request madw for received MAD" - "(method=0x%X attr=0x%X tid=0x%"PRIx64") -- dropping\n", - mad->method, cl_ntoh16((mad)->attr_id), - cl_ntoh64(mad->trans_id)); - osm_mad_pool_put(p_bind->p_mad_pool, p_madw); - continue; - } -#ifndef VENDOR_RMPP_SUPPORT - if ((mad->mgmt_class != IB_MCLASS_SUBN_DIR) && - (mad->mgmt_class != IB_MCLASS_SUBN_LID) && - (ib_rmpp_is_flag_set((ib_rmpp_mad_t *) mad, - IB_RMPP_FLAG_ACTIVE))) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5414: " - "class 0x%x method 0x%x RMPP version %d type " - "%d flags 0x%x received -- dropping\n", - mad->mgmt_class, mad->method, - ((ib_rmpp_mad_t *) mad)->rmpp_version, - ((ib_rmpp_mad_t *) mad)->rmpp_type, - ((ib_rmpp_mad_t *) mad)->rmpp_flags); - osm_mad_pool_put(p_bind->p_mad_pool, p_madw); - continue; - } -#endif - - /* call the CB */ -#ifdef __WIN__ - pthread_mutex_lock(&p_vend->cb_mutex); - (*p_bind->mad_recv_callback) (p_madw, p_bind->client_context, - p_req_madw); - pthread_mutex_unlock(&p_vend->cb_mutex); -#else /* !__WIN__ */ - pthread_mutex_lock(&p_vend->cb_mutex); - pthread_cleanup_push(unlock_mutex, &p_vend->cb_mutex); - (*p_bind->mad_recv_callback) (p_madw, p_bind->client_context, - p_req_madw); - pthread_cleanup_pop(1); -#endif - } - - OSM_LOG_EXIT(p_vend->p_log); - return NULL; -} - -static int umad_receiver_start(osm_vendor_t * p_vend) -{ - umad_receiver_t *p_ur = p_vend->receiver; - - p_ur->p_vend = p_vend; - p_ur->p_log = p_vend->p_log; - -#ifdef HAVE_LIBPTHREADS - if (pthread_create(&p_ur->tid, NULL, umad_receiver, p_ur) < 0) - return -1; - - return 0; -#else - { - ib_api_status_t status; - - status = cl_thread_init( &p_ur->tid, - (void*)umad_receiver, - (void*)p_ur, - "umad_recvr" ); - - if (status != IB_SUCCESS) { - OSM_LOG(p_ur->p_log, OSM_LOG_ERROR, - "ERR: thread 'umad_recvr' start failure: %s\n", - ib_get_err_str(status)); - } - return (status != IB_SUCCESS ? -1 : 0); - } -#endif -} - -static void umad_receiver_stop(umad_receiver_t * p_ur) -{ -#ifdef HAVE_LIBPTHREADS - pthread_cancel(p_ur->tid); - pthread_join(p_ur->tid, NULL); - p_ur->tid = 0; -#else - /* XXX hangs current thread - suspect umad_recv() ignoring wakeup. - cl_thread_destroy(&p_ur->tid); - */ -#endif - p_ur->p_vend = NULL; - p_ur->p_log = NULL; -} - -ib_api_status_t -osm_vendor_init(IN osm_vendor_t * const p_vend, - IN osm_log_t * const p_log, IN const uint32_t timeout) -{ - char *max = NULL; - int r, n_cas; - - OSM_LOG_ENTER(p_log); - - p_vend->p_log = p_log; - p_vend->timeout = timeout; - p_vend->max_retries = OSM_DEFAULT_RETRY_COUNT; - pthread_mutex_init(&p_vend->cb_mutex, NULL); - pthread_mutex_init(&p_vend->match_tbl_mutex, NULL); - p_vend->umad_port_id = -1; - p_vend->issmfd = -1; - - /* - * Open our instance of UMAD. - */ - if ((r = umad_init()) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, - "ERR 5415: Error opening UMAD\n"); - } - - if ((n_cas = umad_get_cas_names(p_vend->ca_names, - OSM_UMAD_MAX_CAS)) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, - "ERR 5416: umad_get_cas_names failed\n"); - r = n_cas; - goto Exit; - } - - p_vend->ca_count = n_cas; - p_vend->mtbl.max = DEFAULT_OSM_UMAD_MAX_PENDING; - - if ((max = getenv("OSM_UMAD_MAX_PENDING")) != NULL) { - int tmp = strtol(max, NULL, 0); - if (tmp > 0) - p_vend->mtbl.max = tmp; - else - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "Error:" - "OSM_UMAD_MAX_PENDING=%d is invalid\n", - tmp); - } - - OSM_LOG(p_vend->p_log, OSM_LOG_INFO, "%d pending umads specified\n", - p_vend->mtbl.max); - - p_vend->mtbl.tbl = calloc(p_vend->mtbl.max, sizeof(*(p_vend->mtbl.tbl))); - if (!p_vend->mtbl.tbl) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "Error:" - "failed to allocate vendor match table\n"); - r = IB_INSUFFICIENT_MEMORY; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_log); - return (r); -} - -osm_vendor_t *osm_vendor_new(IN osm_log_t * const p_log, - IN const uint32_t timeout) -{ - osm_vendor_t *p_vend = NULL; - - OSM_LOG_ENTER(p_log); - - if (!timeout) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 5433: " - "transaction timeout cannot be 0\n"); - goto Exit; - } - - p_vend = malloc(sizeof(*p_vend)); - if (p_vend == NULL) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 5417: " - "Unable to allocate vendor object\n"); - goto Exit; - } - - memset(p_vend, 0, sizeof(*p_vend)); - - if (osm_vendor_init(p_vend, p_log, timeout) < 0) { - free(p_vend); - p_vend = NULL; - } - -Exit: - OSM_LOG_EXIT(p_log); - return (p_vend); -} - -void osm_vendor_delete(IN osm_vendor_t ** const pp_vend) -{ - osm_vendor_close_port(*pp_vend); - - clear_madw(*pp_vend); - /* make sure all ports are closed */ - umad_done(); - - pthread_mutex_destroy(&(*pp_vend)->cb_mutex); - pthread_mutex_destroy(&(*pp_vend)->match_tbl_mutex); - free((*pp_vend)->mtbl.tbl); - free(*pp_vend); - *pp_vend = NULL; -} - -ib_api_status_t -osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend, - IN ib_port_attr_t * const p_attr_array, - IN uint32_t * const p_num_ports) -{ - umad_ca_t ca; - ib_port_attr_t *attr = p_attr_array; - unsigned done = 0; - int r = 0, i, j, k; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vend && p_num_ports); - - if (!*p_num_ports) { - r = IB_INVALID_PARAMETER; - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5418: " - "Ports in should be > 0\n"); - goto Exit; - } - - if (!p_attr_array) { - r = IB_INSUFFICIENT_MEMORY; - *p_num_ports = 0; - goto Exit; - } - - for (i = 0; i < p_vend->ca_count && !done; i++) { - /* For each CA, retrieve the port attributes */ - if (umad_get_ca(p_vend->ca_names[i], &ca) == 0) { - if (ca.node_type < 1 || ca.node_type > 3) - continue; - for (j = 0; j <= ca.numports; j++) { - if (!ca.ports[j]) - continue; - attr->port_guid = ca.ports[j]->port_guid; - attr->lid = ca.ports[j]->base_lid; - attr->port_num = ca.ports[j]->portnum; - attr->sm_lid = ca.ports[j]->sm_lid; - attr->link_state = ca.ports[j]->state; - if (attr->num_pkeys && attr->p_pkey_table) { - if (attr->num_pkeys > ca.ports[j]->pkeys_size) - attr->num_pkeys = ca.ports[j]->pkeys_size; - for (k = 0; k < attr->num_pkeys; k++) - attr->p_pkey_table[k] = - cl_hton16(ca.ports[j]->pkeys[k]); - } - attr->num_pkeys = ca.ports[j]->pkeys_size; - attr++; - if (attr - p_attr_array > *p_num_ports) { - done = 1; - break; - } - } - umad_release_ca(&ca); - } - } - - *p_num_ports = attr - p_attr_array; - -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return r; -} - -static int -osm_vendor_open_port(IN osm_vendor_t * const p_vend, - IN const ib_net64_t port_guid) -{ - ib_net64_t portguids[OSM_UMAD_MAX_PORTS_PER_CA + 1]; - umad_ca_t umad_ca; - int i = 0, umad_port_id = -1; - char *name; - int ca, r; - - CL_ASSERT(p_vend); - - OSM_LOG_ENTER(p_vend->p_log); - - if (p_vend->umad_port_id >= 0) { - umad_port_id = p_vend->umad_port_id; - goto Exit; - } - - if (!port_guid) { - name = NULL; - i = 0; - goto _found; - } - - for (ca = 0; ca < p_vend->ca_count; ca++) { - if ((r = umad_get_ca_portguids(p_vend->ca_names[ca], portguids, - OSM_UMAD_MAX_PORTS_PER_CA + 1)) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5421: " - "Unable to get CA %s port guids (%s)\n", - p_vend->ca_names[ca], strerror(r)); - goto Exit; - } - for (i = 0; i < r; i++) - if (port_guid == portguids[i]) { - name = p_vend->ca_names[ca]; - goto _found; - } - } - - /* - * No local CA owns this guid! - */ - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5422: " - "Unable to find requested CA guid 0x%" PRIx64 "\n", - cl_ntoh64(port_guid)); - goto Exit; - -_found: - /* Validate that node is an IB node type (not iWARP) */ - if (umad_get_ca(name, &umad_ca) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 542A: " - "umad_get_ca() failed\n"); - goto Exit; - } - - if (umad_ca.node_type < 1 || umad_ca.node_type > 3) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 542D: " - "Type %d of node \'%s\' is not an IB node type\n", - umad_ca.node_type, umad_ca.ca_name); - fprintf(stderr, - "Type %d of node \'%s\' is not an IB node type\n", - umad_ca.node_type, umad_ca.ca_name); - umad_release_ca(&umad_ca); - goto Exit; - } - umad_release_ca(&umad_ca); - - /* Port found, try to open it */ - if (umad_get_port(name, i, &p_vend->umad_port) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 542B: " - "umad_get_port() failed\n"); - goto Exit; - } - - if ((umad_port_id = umad_open_port(p_vend->umad_port.ca_name, - p_vend->umad_port.portnum)) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 542C: " - "umad_open_port() failed\n"); - goto Exit; - } - - p_vend->umad_port_id = umad_port_id; - - /* start receiver thread */ - if (!(p_vend->receiver = calloc(1, sizeof(umad_receiver_t)))) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5423: " - "Unable to alloc receiver struct\n"); - umad_close_port(umad_port_id); - umad_release_port(&p_vend->umad_port); - p_vend->umad_port.port_guid = 0; - p_vend->umad_port_id = umad_port_id = -1; - goto Exit; - } - if (umad_receiver_start(p_vend) != 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5420: " - "umad_receiver_init failed\n"); - umad_close_port(umad_port_id); - umad_release_port(&p_vend->umad_port); - p_vend->umad_port.port_guid = 0; - p_vend->umad_port_id = umad_port_id = -1; - } - -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return umad_port_id; -} - -static void osm_vendor_close_port(osm_vendor_t * const p_vend) -{ - umad_receiver_t *p_ur; - int i; - - p_ur = p_vend->receiver; - p_vend->receiver = NULL; - if (p_ur) { - umad_receiver_stop(p_ur); - free(p_ur); - } - - if (p_vend->umad_port_id >= 0) { - for (i = 0; i < OSM_UMAD_MAX_AGENTS; i++) - if (p_vend->agents[i]) - umad_unregister(p_vend->umad_port_id, i); - umad_close_port(p_vend->umad_port_id); - umad_release_port(&p_vend->umad_port); - p_vend->umad_port.port_guid = 0; - p_vend->umad_port_id = -1; - } -} - -static int set_bit(int nr, void *method_mask) -{ - long mask, *addr = method_mask; - int retval; - - addr += nr / (8 * sizeof(long)); - mask = 1L << (nr % (8 * sizeof(long))); - retval = (mask & *addr) != 0; - *addr |= mask; - return retval; -} - -osm_bind_handle_t -osm_vendor_bind(IN osm_vendor_t * const p_vend, - IN osm_bind_info_t * const p_user_bind, - IN osm_mad_pool_t * const p_mad_pool, - IN osm_vend_mad_recv_callback_t mad_recv_callback, - IN osm_vend_mad_send_err_callback_t send_err_callback, - IN void *context) -{ - ib_net64_t port_guid; - osm_umad_bind_info_t *p_bind = 0; - long method_mask[16 / sizeof(long)]; - int umad_port_id; - uint8_t rmpp_version; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_user_bind); - CL_ASSERT(p_mad_pool); - CL_ASSERT(mad_recv_callback); - CL_ASSERT(send_err_callback); - - port_guid = p_user_bind->port_guid; - - OSM_LOG(p_vend->p_log, OSM_LOG_INFO, - "Binding to port 0x%" PRIx64 "\n", cl_ntoh64(port_guid)); - - if ((umad_port_id = osm_vendor_open_port(p_vend, port_guid)) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5424: " - "Unable to open port 0x%" PRIx64 "\n", - cl_ntoh64(port_guid)); - goto Exit; - } -#ifndef __WIN__ - if (umad_get_issm_path(p_vend->umad_port.ca_name, - p_vend->umad_port.portnum, - p_vend->issm_path, - sizeof(p_vend->issm_path)) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 542E: " - "Cannot resolve issm path for port %s:%u\n", - p_vend->umad_port.ca_name, p_vend->umad_port.portnum); - goto Exit; - } -#endif - if (!(p_bind = malloc(sizeof(*p_bind)))) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5425: " - "Unable to allocate internal bind object\n"); - goto Exit; - } - - memset(p_bind, 0, sizeof(*p_bind)); - p_bind->p_vend = p_vend; - p_bind->port_id = umad_port_id; - p_bind->client_context = context; - p_bind->mad_recv_callback = mad_recv_callback; - p_bind->send_err_callback = send_err_callback; - p_bind->p_mad_pool = p_mad_pool; - p_bind->port_guid = port_guid; - p_bind->timeout = p_user_bind->timeout ? p_user_bind->timeout : - p_vend->timeout; - p_bind->max_retries = p_user_bind->retries ? p_user_bind->retries : - p_vend->max_retries; - - memset(method_mask, 0, sizeof method_mask); - if (p_user_bind->is_responder) { - set_bit(IB_MAD_METHOD_GET, &method_mask); - set_bit(IB_MAD_METHOD_SET, &method_mask); - if (p_user_bind->mad_class == IB_MCLASS_SUBN_ADM) { - set_bit(IB_MAD_METHOD_GETTABLE, &method_mask); - set_bit(IB_MAD_METHOD_DELETE, &method_mask); -#ifdef DUAL_SIDED_RMPP - set_bit(IB_MAD_METHOD_GETMULTI, &method_mask); -#endif - /* Add in IB_MAD_METHOD_GETTRACETABLE */ - /* when supported by OpenSM */ - } - } - if (p_user_bind->is_report_processor) - set_bit(IB_MAD_METHOD_REPORT, &method_mask); - if (p_user_bind->is_trap_processor) { - set_bit(IB_MAD_METHOD_TRAP, &method_mask); - set_bit(IB_MAD_METHOD_TRAP_REPRESS, &method_mask); - } -#ifndef VENDOR_RMPP_SUPPORT - rmpp_version = 0; -#else - /* If SA class, set rmpp_version */ - if (p_user_bind->mad_class == IB_MCLASS_SUBN_ADM) - rmpp_version = 1; - else - rmpp_version = 0; -#endif - - if ((p_bind->agent_id = umad_register(p_vend->umad_port_id, - p_user_bind->mad_class, - p_user_bind->class_version, - rmpp_version, method_mask)) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5426: " - "Unable to register class %u version %u\n", - p_user_bind->mad_class, p_user_bind->class_version); - free(p_bind); - p_bind = 0; - goto Exit; - } - - if (p_bind->agent_id >= OSM_UMAD_MAX_AGENTS || - p_vend->agents[p_bind->agent_id]) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5427: " - "bad agent id %u or duplicate agent for class %u vers %u\n", - p_bind->agent_id, p_user_bind->mad_class, - p_user_bind->class_version); - free(p_bind); - p_bind = 0; - goto Exit; - } - - p_vend->agents[p_bind->agent_id] = p_bind; - - /* If Subn Directed Route class, register Subn LID routed class */ - if (p_user_bind->mad_class == IB_MCLASS_SUBN_DIR) { - if ((p_bind->agent_id1 = umad_register(p_vend->umad_port_id, - IB_MCLASS_SUBN_LID, - p_user_bind-> - class_version, 0, - method_mask)) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5428: " - "Unable to register class 1 version %u\n", - p_user_bind->class_version); - free(p_bind); - p_bind = 0; - goto Exit; - } - - if (p_bind->agent_id1 >= OSM_UMAD_MAX_AGENTS || - p_vend->agents[p_bind->agent_id1]) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5429: " - "bad agent id %u or duplicate agent for class 1 vers %u\n", - p_bind->agent_id1, p_user_bind->class_version); - free(p_bind); - p_bind = 0; - goto Exit; - } - - p_vend->agents[p_bind->agent_id1] = p_bind; - } - -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return ((osm_bind_handle_t) p_bind); -} - -static void -__osm_vendor_recv_dummy_cb(IN osm_madw_t * p_madw, - IN void *bind_context, IN osm_madw_t * p_req_madw) -{ -#ifdef _DEBUG_ - fprintf(stderr, - "__osm_vendor_recv_dummy_cb: Ignoring received MAD after osm_vendor_unbind\n"); -#endif -} - -static void -__osm_vendor_send_err_dummy_cb(IN void *bind_context, - IN osm_madw_t * p_req_madw) -{ -#ifdef _DEBUG_ - fprintf(stderr, - "__osm_vendor_send_err_dummy_cb: Ignoring send error after osm_vendor_unbind\n"); -#endif -} - -void osm_vendor_unbind(IN osm_bind_handle_t h_bind) -{ - osm_umad_bind_info_t *p_bind = (osm_umad_bind_info_t *) h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - - OSM_LOG_ENTER(p_vend->p_log); - - pthread_mutex_lock(&p_vend->cb_mutex); - p_bind->mad_recv_callback = __osm_vendor_recv_dummy_cb; - p_bind->send_err_callback = __osm_vendor_send_err_dummy_cb; - pthread_mutex_unlock(&p_vend->cb_mutex); - - OSM_LOG_EXIT(p_vend->p_log); -} - -ib_mad_t *osm_vendor_get(IN osm_bind_handle_t h_bind, - IN const uint32_t mad_size, - IN osm_vend_wrap_t * const p_vw) -{ - osm_umad_bind_info_t *p_bind = (osm_umad_bind_info_t *) h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - - OSM_LOG_ENTER(p_vend->p_log); - - OSM_LOG(p_vend->p_log, OSM_LOG_DEBUG, - "Acquiring UMAD for p_madw = %p, size = %u\n", p_vw, mad_size); - CL_ASSERT(p_vw); - p_vw->size = mad_size; - p_vw->umad = umad_alloc(1, mad_size + umad_size()); - - /* track locally */ - p_vw->h_bind = h_bind; - - OSM_LOG(p_vend->p_log, OSM_LOG_DEBUG, - "Acquired UMAD %p, size = %u\n", p_vw->umad, p_vw->size); - - OSM_LOG_EXIT(p_vend->p_log); - return (p_vw->umad ? umad_get_mad(p_vw->umad) : NULL); -} - -void -osm_vendor_put(IN osm_bind_handle_t h_bind, IN osm_vend_wrap_t * const p_vw) -{ - osm_umad_bind_info_t *p_bind = (osm_umad_bind_info_t *) h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - osm_madw_t *p_madw; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vw); - - OSM_LOG(p_vend->p_log, OSM_LOG_DEBUG, "Retiring UMAD %p\n", p_vw->umad); - - /* - * We moved the removal of the transaction to immediately after - * it was looked up. - */ - - /* free the mad but the wrapper is part of the madw object */ - umad_free(p_vw->umad); - p_vw->umad = 0; - p_madw = PARENT_STRUCT(p_vw, osm_madw_t, vend_wrap); - p_madw->p_mad = NULL; - - OSM_LOG_EXIT(p_vend->p_log); -} - -ib_api_status_t -osm_vendor_send(IN osm_bind_handle_t h_bind, - IN osm_madw_t * const p_madw, IN boolean_t const resp_expected) -{ - osm_umad_bind_info_t *const p_bind = h_bind; - osm_vendor_t *const p_vend = p_bind->p_vend; - osm_vend_wrap_t *const p_vw = osm_madw_get_vend_ptr(p_madw); - osm_mad_addr_t *const p_mad_addr = osm_madw_get_mad_addr_ptr(p_madw); - ib_mad_t *const p_mad = osm_madw_get_mad_ptr(p_madw); - ib_sa_mad_t *const p_sa = (ib_sa_mad_t *) p_mad; - int ret = -1; - int is_rmpp = 0; - uint32_t sent_mad_size; -#ifndef VENDOR_RMPP_SUPPORT - uint32_t paylen = 0; -#endif - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vw->h_bind == h_bind); - CL_ASSERT(p_mad == umad_get_mad(p_vw->umad)); - - if (p_mad->mgmt_class == IB_MCLASS_SUBN_DIR) { - umad_set_addr_net(p_vw->umad, 0xffff, 0, 0, 0); - umad_set_grh(p_vw->umad, 0); - goto Resp; - } - if (p_mad->mgmt_class == IB_MCLASS_SUBN_LID) { - umad_set_addr_net(p_vw->umad, p_mad_addr->dest_lid, 0, 0, 0); - umad_set_grh(p_vw->umad, 0); - goto Resp; - } - /* GS classes */ - umad_set_addr_net(p_vw->umad, p_mad_addr->dest_lid, - p_mad_addr->addr_type.gsi.remote_qp, - p_mad_addr->addr_type.gsi.service_level, - IB_QP1_WELL_KNOWN_Q_KEY); - umad_set_grh(p_vw->umad, 0); /* FIXME: GRH support */ - umad_set_pkey(p_vw->umad, p_mad_addr->addr_type.gsi.pkey_ix); - if (ib_class_is_rmpp(p_mad->mgmt_class)) { /* RMPP GS classes FIXME: no GRH */ - if (!ib_rmpp_is_flag_set((ib_rmpp_mad_t *) p_sa, - IB_RMPP_FLAG_ACTIVE)) { - /* Clear RMPP header when RMPP not ACTIVE */ - p_sa->rmpp_version = 0; - p_sa->rmpp_type = 0; - p_sa->rmpp_flags = 0; - p_sa->rmpp_status = 0; -#ifdef VENDOR_RMPP_SUPPORT - } else - is_rmpp = 1; - OSM_LOG(p_vend->p_log, OSM_LOG_VERBOSE, "RMPP %d length %d\n", - ib_rmpp_is_flag_set((ib_rmpp_mad_t *) p_sa, - IB_RMPP_FLAG_ACTIVE), - p_madw->mad_size); -#else - } else { - p_sa->rmpp_version = 1; - p_sa->seg_num = cl_ntoh32(1); /* first DATA is seg 1 */ - p_sa->rmpp_flags |= (uint8_t) 0x70; /* RRespTime of 14 (high 5 bits) */ - p_sa->rmpp_status = 0; - paylen = p_madw->mad_size - IB_SA_MAD_HDR_SIZE; - paylen += (IB_SA_MAD_HDR_SIZE - MAD_RMPP_HDR_SIZE); - p_sa->paylen_newwin = cl_ntoh32(paylen); - } -#endif - } - -Resp: - if (resp_expected) - put_madw(p_vend, p_madw, p_mad->trans_id); - -#ifdef VENDOR_RMPP_SUPPORT - sent_mad_size = p_madw->mad_size; -#else - sent_mad_size = is_rmpp ? p_madw->mad_size - IB_SA_MAD_HDR_SIZE : - p_madw->mad_size; -#endif - if ((ret = umad_send(p_bind->port_id, p_bind->agent_id, p_vw->umad, - sent_mad_size, - resp_expected ? p_bind->timeout : 0, - p_bind->max_retries)) < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5430: " - "Send p_madw = %p of size %d TID 0x%" PRIx64 " failed %d (%m)\n", - p_madw, sent_mad_size, cl_ntoh64(p_mad->trans_id), ret); - if (resp_expected) { - get_madw(p_vend, &p_mad->trans_id); /* remove from aging table */ - p_madw->status = IB_ERROR; - pthread_mutex_lock(&p_vend->cb_mutex); - (*p_bind->send_err_callback) (p_bind->client_context, p_madw); /* cb frees madw */ - pthread_mutex_unlock(&p_vend->cb_mutex); - } else - osm_mad_pool_put(p_bind->p_mad_pool, p_madw); - goto Exit; - } - - if (!resp_expected) - osm_mad_pool_put(p_bind->p_mad_pool, p_madw); - - OSM_LOG(p_vend->p_log, OSM_LOG_DEBUG, "Completed sending %s p_madw = %p\n", - resp_expected ? "request" : "response or unsolicited", p_madw); -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return (ret); -} - -ib_api_status_t osm_vendor_local_lid_change(IN osm_bind_handle_t h_bind) -{ - osm_umad_bind_info_t *p_bind = (osm_umad_bind_info_t *) h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - - OSM_LOG_ENTER(p_vend->p_log); - ; - OSM_LOG_EXIT(p_vend->p_log); - return (0); -} - -#ifndef __WIN__ - -void osm_vendor_set_sm(IN osm_bind_handle_t h_bind, IN boolean_t is_sm_val) -{ - osm_umad_bind_info_t *p_bind = (osm_umad_bind_info_t *) h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - - OSM_LOG_ENTER(p_vend->p_log); - if (TRUE == is_sm_val) { - p_vend->issmfd = open(p_vend->issm_path, O_NONBLOCK); - if (p_vend->issmfd < 0) { - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5431: " - "setting IS_SM capmask: cannot open file " - "\'%s\': %s\n", - p_vend->issm_path, strerror(errno)); - p_vend->issmfd = -1; - } - } else if (p_vend->issmfd != -1) { - if (0 != close(p_vend->issmfd)) - OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5432: " - "clearing IS_SM capmask: cannot close: %s\n", - strerror(errno)); - p_vend->issmfd = -1; - } - OSM_LOG_EXIT(p_vend->p_log); -} - -#else /* ! __WIN__ */ - -void osm_vendor_set_sm(IN osm_bind_handle_t h_bind, IN boolean_t is_sm_val) -{ - osm_umad_bind_info_t *p_bind = (osm_umad_bind_info_t *) h_bind; - osm_vendor_t *p_vend = p_bind->p_vend; - - OSM_LOG_ENTER(p_vend->p_log); - - OSM_LOG_EXIT(p_vend->p_log); -} -#endif /* ! __WIN__ */ - -void osm_vendor_set_debug(IN osm_vendor_t * const p_vend, IN int32_t level) -{ - umad_debug(level); -} - -#endif /* OSM_VENDOR_INTF_OPENIB */ diff --git a/branches/opensm_3/user/libvendor/osm_vendor_ibumad_sa.c b/branches/opensm_3/user/libvendor/osm_vendor_ibumad_sa.c deleted file mode 100644 index 83b44bf5..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_ibumad_sa.c +++ /dev/null @@ -1,736 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007,2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include - -/* this struct is the internal rep of the bind handle */ -typedef struct _osmv_sa_bind_info { - osm_bind_handle_t h_bind; - osm_log_t *p_log; - osm_vendor_t *p_vendor; - osm_mad_pool_t *p_mad_pool; - cl_event_t sync_event; - time_t last_lids_update_sec; -} osmv_sa_bind_info_t; - -/* - Call back on new mad received: - - We basically only need to set the context of the query. - Or report an error. - - A pointer to the actual context of the request (a copy of the oriignal - request structure) is attached as the p_madw->context.ni_context.node_guid -*/ -static void -__osmv_sa_mad_rcv_cb(IN osm_madw_t * p_madw, - IN void *bind_context, IN osm_madw_t * p_req_madw) -{ - osmv_sa_bind_info_t *p_bind = (osmv_sa_bind_info_t *) bind_context; - osmv_query_req_t *p_query_req_copy = NULL; - osmv_query_res_t query_res; - ib_sa_mad_t *p_sa_mad; - ib_net16_t mad_status; - - OSM_LOG_ENTER(p_bind->p_log); - - if (!p_req_madw) { - OSM_LOG(p_bind->p_log, OSM_LOG_DEBUG, - "Ignoring a non-response mad\n"); - osm_mad_pool_put(p_bind->p_mad_pool, p_madw); - goto Exit; - } - - /* obtain the sent context since we store it during send in the ni_ctx */ - p_query_req_copy = - (osmv_query_req_t *) (long *)(long)(p_req_madw->context.ni_context. - node_guid); - - /* provide the context of the original request in the result */ - query_res.query_context = p_query_req_copy->query_context; - - /* provide the resulting madw */ - query_res.p_result_madw = p_madw; - - /* update the req fields */ - p_sa_mad = (ib_sa_mad_t *) p_madw->p_mad; - - /* if we got a remote error track it in the status */ - mad_status = (ib_net16_t) (p_sa_mad->status & IB_SMP_STATUS_MASK); - if (mad_status != IB_SUCCESS) { - OSM_LOG(p_bind->p_log, OSM_LOG_ERROR, "ERR 5501: " - "Remote error:0x%04X\n", cl_ntoh16(mad_status)); - query_res.status = IB_REMOTE_ERROR; - } else - query_res.status = IB_SUCCESS; - - /* what if we have got back an empty mad ? */ - if (!p_madw->mad_size) { - OSM_LOG(p_bind->p_log, OSM_LOG_ERROR, "ERR 5502: " - "Got an empty mad\n"); - query_res.status = IB_ERROR; - } - - if (IB_SUCCESS == mad_status) { - - /* if we are in not in a method response of an rmpp nature we must get only 1 */ - /* HACK: in the future we might need to be smarter for other methods... */ - if (p_sa_mad->method != IB_MAD_METHOD_GETTABLE_RESP) { - query_res.result_cnt = 1; - } else { -#ifndef VENDOR_RMPP_SUPPORT - if (mad_status != IB_SUCCESS) - query_res.result_cnt = 0; - else - query_res.result_cnt = 1; -#else - if (ib_get_attr_size(p_sa_mad->attr_offset)) { - /* we used the offset value to calculate the - number of records in here */ - query_res.result_cnt = (uintn_t) - ((p_madw->mad_size - IB_SA_MAD_HDR_SIZE) / - ib_get_attr_size(p_sa_mad->attr_offset)); - OSM_LOG(p_bind->p_log, OSM_LOG_DEBUG, - "Count = %u = %u / %u (%u)\n", - query_res.result_cnt, - p_madw->mad_size - IB_SA_MAD_HDR_SIZE, - ib_get_attr_size(p_sa_mad->attr_offset), - (p_madw->mad_size - - IB_SA_MAD_HDR_SIZE) % - ib_get_attr_size(p_sa_mad->attr_offset)); - } else - query_res.result_cnt = 0; -#endif - } - } - - query_res.query_type = p_query_req_copy->query_type; - - p_query_req_copy->pfn_query_cb(&query_res); - - if ((p_query_req_copy->flags & OSM_SA_FLAGS_SYNC) == OSM_SA_FLAGS_SYNC) - cl_event_signal(&p_bind->sync_event); - -Exit: - - /* free the copied query request if found */ - if (p_query_req_copy) - free(p_query_req_copy); - - /* put back the request madw */ - if (p_req_madw) - osm_mad_pool_put(p_bind->p_mad_pool, p_req_madw); - - OSM_LOG_EXIT(p_bind->p_log); -} - -/* - Send Error Callback: - - Only report the error and get rid of the mad wrapper -*/ -static void __osmv_sa_mad_err_cb(IN void *bind_context, IN osm_madw_t * p_madw) -{ - osmv_sa_bind_info_t *p_bind = (osmv_sa_bind_info_t *) bind_context; - osmv_query_req_t *p_query_req_copy = NULL; - osmv_query_res_t query_res; - - OSM_LOG_ENTER(p_bind->p_log); - - /* Obtain the sent context etc */ - p_query_req_copy = - (osmv_query_req_t *) (long *)(long)(p_madw->context.ni_context. - node_guid); - - /* provide the context of the original request in the result */ - query_res.query_context = p_query_req_copy->query_context; - - query_res.p_result_madw = p_madw; - - query_res.status = IB_TIMEOUT; - query_res.result_cnt = 0; - - query_res.query_type = p_query_req_copy->query_type; - - p_query_req_copy->pfn_query_cb(&query_res); - - if ((p_query_req_copy->flags & OSM_SA_FLAGS_SYNC) == OSM_SA_FLAGS_SYNC) - cl_event_signal(&p_bind->sync_event); - - if (p_query_req_copy) - free(p_query_req_copy); - OSM_LOG_EXIT(p_bind->p_log); -} - -/***************************************************************************** - Update lids of vendor umad_port. - *****************************************************************************/ -static ib_api_status_t update_umad_port(osm_vendor_t * p_vend) -{ - umad_port_t port; - if (umad_get_port(p_vend->umad_port.ca_name, - p_vend->umad_port.portnum, &port) < 0) - return IB_ERROR; - p_vend->umad_port.base_lid = port.base_lid; - p_vend->umad_port.sm_lid = port.sm_lid; - umad_release_port(&port); - return IB_SUCCESS; -} - -osm_bind_handle_t -osmv_bind_sa(IN osm_vendor_t * const p_vend, - IN osm_mad_pool_t * const p_mad_pool, IN ib_net64_t port_guid) -{ - osm_bind_info_t bind_info; - osm_log_t *p_log = p_vend->p_log; - osmv_sa_bind_info_t *p_sa_bind_info; - cl_status_t cl_status; - - OSM_LOG_ENTER(p_log); - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Binding to port 0x%" PRIx64 "\n", cl_ntoh64(port_guid)); - - bind_info.port_guid = port_guid; - bind_info.mad_class = IB_MCLASS_SUBN_ADM; - bind_info.class_version = 2; - bind_info.is_responder = FALSE; - bind_info.is_trap_processor = FALSE; - bind_info.is_report_processor = FALSE; - bind_info.send_q_size = OSM_SM_DEFAULT_QP1_RCV_SIZE; - bind_info.recv_q_size = OSM_SM_DEFAULT_QP1_SEND_SIZE; - bind_info.timeout = OSM_DEFAULT_TRANS_TIMEOUT_MILLISEC; - bind_info.retries = OSM_DEFAULT_RETRY_COUNT; - - /* allocate the new sa bind info */ - p_sa_bind_info = - (osmv_sa_bind_info_t *) malloc(sizeof(osmv_sa_bind_info_t)); - if (!p_sa_bind_info) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 5505: " - "Failed to allocate new bind structure\n"); - p_sa_bind_info = OSM_BIND_INVALID_HANDLE; - goto Exit; - } - - /* store some important context */ - p_sa_bind_info->p_log = p_log; - p_sa_bind_info->p_mad_pool = p_mad_pool; - p_sa_bind_info->p_vendor = p_vend; - - /* Bind to the lower level */ - p_sa_bind_info->h_bind = osm_vendor_bind(p_vend, &bind_info, p_mad_pool, __osmv_sa_mad_rcv_cb, __osmv_sa_mad_err_cb, p_sa_bind_info); /* context provided to CBs */ - - if (p_sa_bind_info->h_bind == OSM_BIND_INVALID_HANDLE) { - free(p_sa_bind_info); - p_sa_bind_info = OSM_BIND_INVALID_HANDLE; - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 5506: " - "Failed to bind to vendor GSI\n"); - goto Exit; - } - - /* update time umad_port is initilized now */ - p_sa_bind_info->last_lids_update_sec = time(NULL); - - /* initialize the sync_event */ - cl_event_construct(&p_sa_bind_info->sync_event); - cl_status = cl_event_init(&p_sa_bind_info->sync_event, TRUE); - if (cl_status != CL_SUCCESS) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 5508: " - "cl_init_event failed: %s\n", ib_get_err_str(cl_status)); - free(p_sa_bind_info); - p_sa_bind_info = OSM_BIND_INVALID_HANDLE; - } - -Exit: - OSM_LOG_EXIT(p_log); - return (p_sa_bind_info); -} - -/****t* OSM Vendor SA Client/osmv_sa_mad_data - * NAME - * osmv_sa_mad_data - * - * DESCRIPTION - * Extra fields required to perform a mad query - * This struct is passed to the actual send method - * - * SYNOPSIS - */ -typedef struct _osmv_sa_mad_data { - /* MAD data. */ - uint8_t method; - ib_net16_t attr_id; - ib_net16_t attr_offset; - ib_net32_t attr_mod; - ib_net64_t comp_mask; - void *p_attr; -} osmv_sa_mad_data_t; -/* - * method - * The method of the mad to be sent - * - * attr_id - * Attribute ID - * - * attr_offset - * Offset as defined by RMPP - * - * attr_mod - * Attribute modifier - * - * comp_mask - * The component mask of the query - * - * p_attr - * A pointer to the record of the attribute to be sent. - * - *****/ - -/* Send a MAD out on the GSI interface */ -static ib_api_status_t -__osmv_send_sa_req(IN osmv_sa_bind_info_t * p_bind, - IN const osmv_sa_mad_data_t * const p_sa_mad_data, - IN const osmv_query_req_t * const p_query_req) -{ - ib_api_status_t status; - ib_mad_t *p_mad_hdr; - ib_sa_mad_t *p_sa_mad; - osm_madw_t *p_madw; - osm_log_t *p_log = p_bind->p_log; - static atomic32_t trans_id; - boolean_t sync; - osmv_query_req_t *p_query_req_copy; - - OSM_LOG_ENTER(p_log); - - /* - since the sm_lid might change we obtain it every send - (actually it is cached in the bind object and refreshed - every 30sec by this proc) - */ - if (time(NULL) > p_bind->last_lids_update_sec + 30) { - status = update_umad_port(p_bind->p_vendor); - if (status != IB_SUCCESS) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 5509: " - "Failed to obtain the SM lid\n"); - goto Exit; - } - p_bind->last_lids_update_sec = time(NULL); - } - - /* Get a MAD wrapper for the send */ - p_madw = osm_mad_pool_get(p_bind->p_mad_pool, - p_bind->h_bind, MAD_BLOCK_SIZE, NULL); - - if (p_madw == NULL) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 5510: " - "Unable to acquire MAD\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - /* Initialize the Sent MAD: */ - - /* Initialize the MAD buffer for the send operation. */ - p_mad_hdr = osm_madw_get_mad_ptr(p_madw); - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - - /* Get a new transaction Id */ - cl_atomic_inc(&trans_id); - - /* Cleanup the MAD from any residue */ - memset(p_sa_mad, 0, MAD_BLOCK_SIZE); - - /* Initialize the standard MAD header. */ - ib_mad_init_new(p_mad_hdr, /* mad pointer */ - IB_MCLASS_SUBN_ADM, /* class */ - (uint8_t) 2, /* version */ - p_sa_mad_data->method, /* method */ - cl_hton64((uint64_t) trans_id), /* tid */ - p_sa_mad_data->attr_id, /* attr id */ - p_sa_mad_data->attr_mod /* attr mod */); - - /* Set the query information. */ - p_sa_mad->sm_key = p_query_req->sm_key; - p_sa_mad->attr_offset = 0; - p_sa_mad->comp_mask = p_sa_mad_data->comp_mask; -#ifdef DUAL_SIDED_RMPP - if (p_sa_mad->method == IB_MAD_METHOD_GETMULTI) - p_sa_mad->rmpp_flags = IB_RMPP_FLAG_ACTIVE; -#endif - if (p_sa_mad->comp_mask) { - memcpy(p_sa_mad->data, p_sa_mad_data->p_attr, - ib_get_attr_size(p_sa_mad_data->attr_offset)); - } - - /* - Provide the address to send to - */ - p_madw->mad_addr.dest_lid = - cl_hton16(p_bind->p_vendor->umad_port.sm_lid); - p_madw->mad_addr.addr_type.smi.source_lid = - cl_hton16(p_bind->p_vendor->umad_port.base_lid); - p_madw->mad_addr.addr_type.gsi.remote_qp = CL_HTON32(1); - p_madw->resp_expected = TRUE; - p_madw->fail_msg = CL_DISP_MSGID_NONE; - - /* - Provide MAD context such that the call back will know what to do. - We have to keep the entire request structure so we know the CB. - Since we can not rely on the client to keep it around until - the response - we duplicate it and will later dispose it (in CB). - To store on the MADW we cast it into what opensm has: - p_madw->context.ni_context.node_guid - */ - p_query_req_copy = malloc(sizeof(*p_query_req_copy)); - if (!p_query_req_copy) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 5511: " - "Unable to acquire memory for query copy\n"); - osm_mad_pool_put(p_bind->p_mad_pool, p_madw); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - *p_query_req_copy = *p_query_req; - p_madw->context.ni_context.node_guid = - (ib_net64_t) (long)p_query_req_copy; - - /* we can support async as well as sync calls */ - sync = ((p_query_req->flags & OSM_SA_FLAGS_SYNC) == OSM_SA_FLAGS_SYNC); - - /* send the mad asynchronously */ - status = osm_vendor_send(osm_madw_get_bind_handle(p_madw), - p_madw, p_madw->resp_expected); - - /* if synchronous - wait on the event */ - if (sync) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "Waiting for async event\n"); - cl_event_wait_on(&p_bind->sync_event, EVENT_NO_TIMEOUT, FALSE); - cl_event_reset(&p_bind->sync_event); - status = p_madw->status; - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -/* - * Query the SA based on the user's request. - */ -ib_api_status_t -osmv_query_sa(IN osm_bind_handle_t h_bind, - IN const osmv_query_req_t * const p_query_req) -{ - union { - ib_service_record_t svc_rec; - ib_node_record_t node_rec; - ib_portinfo_record_t port_info; - ib_path_rec_t path_rec; -#ifdef DUAL_SIDED_RMPP - ib_multipath_rec_t multipath_rec; -#endif - ib_class_port_info_t class_port_info; - } u; - osmv_sa_mad_data_t sa_mad_data; - osmv_sa_bind_info_t *p_bind = (osmv_sa_bind_info_t *) h_bind; - osmv_user_query_t *p_user_query; -#ifdef DUAL_SIDED_RMPP - osmv_multipath_req_t *p_mpr_req; - int i, j; -#endif - osm_log_t *p_log = p_bind->p_log; - ib_api_status_t status; - - OSM_LOG_ENTER(p_log); - - /* Set the request information. */ - sa_mad_data.method = IB_MAD_METHOD_GETTABLE; - sa_mad_data.attr_mod = 0; - - /* Set the MAD attributes and component mask correctly. */ - switch (p_query_req->query_type) { - - case OSMV_QUERY_USER_DEFINED: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 USER_DEFINED\n"); - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - if (p_user_query->method) - sa_mad_data.method = p_user_query->method; - sa_mad_data.attr_offset = p_user_query->attr_offset; - sa_mad_data.attr_id = p_user_query->attr_id; - sa_mad_data.attr_mod = p_user_query->attr_mod; - sa_mad_data.comp_mask = p_user_query->comp_mask; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_ALL_SVC_RECS: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 SVC_REC_BY_NAME\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_service_record_t)); - sa_mad_data.comp_mask = 0; - sa_mad_data.p_attr = &u.svc_rec; - break; - - case OSMV_QUERY_SVC_REC_BY_NAME: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 SVC_REC_BY_NAME\n"); - sa_mad_data.method = IB_MAD_METHOD_GET; - sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - sa_mad_data.comp_mask = IB_SR_COMPMASK_SNAME; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_service_record_t)); - sa_mad_data.p_attr = &u.svc_rec; - memcpy(u.svc_rec.service_name, p_query_req->p_query_input, - sizeof(ib_svc_name_t)); - break; - - case OSMV_QUERY_SVC_REC_BY_ID: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 SVC_REC_BY_ID\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - sa_mad_data.comp_mask = IB_SR_COMPMASK_SID; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_service_record_t)); - sa_mad_data.p_attr = &u.svc_rec; - u.svc_rec.service_id = - *(ib_net64_t *) (p_query_req->p_query_input); - break; - - case OSMV_QUERY_CLASS_PORT_INFO: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 CLASS_PORT_INFO\n"); - sa_mad_data.method = IB_MAD_METHOD_GET; - sa_mad_data.attr_id = IB_MAD_ATTR_CLASS_PORT_INFO; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_class_port_info_t)); - sa_mad_data.comp_mask = 0; - sa_mad_data.p_attr = &u.class_port_info; - break; - - case OSMV_QUERY_NODE_REC_BY_NODE_GUID: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 NODE_REC_BY_NODE_GUID\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_NODE_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_node_record_t)); - sa_mad_data.comp_mask = IB_NR_COMPMASK_NODEGUID; - sa_mad_data.p_attr = &u.node_rec; - u.node_rec.node_info.node_guid = - *(ib_net64_t *) (p_query_req->p_query_input); - break; - - case OSMV_QUERY_PORT_REC_BY_LID: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PORT_REC_BY_LID\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_PORTINFO_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_portinfo_record_t)); - sa_mad_data.comp_mask = IB_PIR_COMPMASK_LID; - sa_mad_data.p_attr = &u.port_info; - u.port_info.lid = *(ib_net16_t *) (p_query_req->p_query_input); - break; - - case OSMV_QUERY_PORT_REC_BY_LID_AND_NUM: - sa_mad_data.method = IB_MAD_METHOD_GET; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PORT_REC_BY_LID_AND_NUM\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_PORTINFO_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_portinfo_record_t)); - sa_mad_data.comp_mask = - IB_PIR_COMPMASK_LID | IB_PIR_COMPMASK_PORTNUM; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK: - sa_mad_data.method = IB_MAD_METHOD_GET; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_VLARB_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_vl_arb_table_record_t)); - sa_mad_data.comp_mask = - IB_VLA_COMPMASK_LID | IB_VLA_COMPMASK_OUT_PORT | - IB_VLA_COMPMASK_BLOCK; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_SLVL_BY_LID_AND_PORTS: - sa_mad_data.method = IB_MAD_METHOD_GET; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_SLVL_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_slvl_table_record_t)); - sa_mad_data.comp_mask = - IB_SLVL_COMPMASK_LID | IB_SLVL_COMPMASK_OUT_PORT | - IB_SLVL_COMPMASK_IN_PORT; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_PATH_REC_BY_PORT_GUIDS: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PATH_REC_BY_PORT_GUIDS\n"); - memset(&u.path_rec, 0, sizeof(ib_path_rec_t)); - sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_path_rec_t)); - sa_mad_data.comp_mask = - (IB_PR_COMPMASK_DGID | IB_PR_COMPMASK_SGID | IB_PR_COMPMASK_NUMBPATH); - u.path_rec.num_path = 0x7f; - sa_mad_data.p_attr = &u.path_rec; - ib_gid_set_default(&u.path_rec.dgid, - ((osmv_guid_pair_t *) (p_query_req-> - p_query_input))-> - dest_guid); - ib_gid_set_default(&u.path_rec.sgid, - ((osmv_guid_pair_t *) (p_query_req-> - p_query_input))-> - src_guid); - break; - - case OSMV_QUERY_PATH_REC_BY_GIDS: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PATH_REC_BY_GIDS\n"); - memset(&u.path_rec, 0, sizeof(ib_path_rec_t)); - sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_path_rec_t)); - sa_mad_data.comp_mask = - (IB_PR_COMPMASK_DGID | IB_PR_COMPMASK_SGID | IB_PR_COMPMASK_NUMBPATH); - u.path_rec.num_path = 0x7f; - sa_mad_data.p_attr = &u.path_rec; - memcpy(&u.path_rec.dgid, - &((osmv_gid_pair_t *) (p_query_req->p_query_input))-> - dest_gid, sizeof(ib_gid_t)); - memcpy(&u.path_rec.sgid, - &((osmv_gid_pair_t *) (p_query_req->p_query_input))-> - src_gid, sizeof(ib_gid_t)); - break; - - case OSMV_QUERY_PATH_REC_BY_LIDS: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PATH_REC_BY_LIDS\n"); - memset(&u.path_rec, 0, sizeof(ib_path_rec_t)); - sa_mad_data.method = IB_MAD_METHOD_GET; - sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_path_rec_t)); - sa_mad_data.comp_mask = - (IB_PR_COMPMASK_DLID | IB_PR_COMPMASK_SLID); - sa_mad_data.p_attr = &u.path_rec; - u.path_rec.dlid = - ((osmv_lid_pair_t *) (p_query_req->p_query_input))-> - dest_lid; - u.path_rec.slid = - ((osmv_lid_pair_t *) (p_query_req->p_query_input))->src_lid; - break; - - case OSMV_QUERY_UD_MULTICAST_SET: - sa_mad_data.method = IB_MAD_METHOD_SET; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 OSMV_QUERY_UD_MULTICAST_SET\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_member_rec_t)); - sa_mad_data.comp_mask = p_user_query->comp_mask; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_UD_MULTICAST_DELETE: - sa_mad_data.method = IB_MAD_METHOD_DELETE; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 OSMV_QUERY_UD_MULTICAST_DELETE\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_member_rec_t)); - sa_mad_data.comp_mask = p_user_query->comp_mask; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - -#ifdef DUAL_SIDED_RMPP - case OSMV_QUERY_MULTIPATH_REC: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 MULTIPATH_REC\n"); - /* Validate sgid/dgid counts against SA client limit */ - p_mpr_req = (osmv_multipath_req_t *) p_query_req->p_query_input; - if (p_mpr_req->sgid_count + p_mpr_req->dgid_count > - IB_MULTIPATH_MAX_GIDS) { - OSM_LOG(p_log, OSM_LOG_ERROR, "DBG:001 MULTIPATH_REC " - "SGID count %d DGID count %d max count %d\n", - p_mpr_req->sgid_count, p_mpr_req->dgid_count, - IB_MULTIPATH_MAX_GIDS); - CL_ASSERT(0); - return IB_ERROR; - } - memset(&u.multipath_rec, 0, sizeof(ib_multipath_rec_t)); - sa_mad_data.method = IB_MAD_METHOD_GETMULTI; - sa_mad_data.attr_id = IB_MAD_ATTR_MULTIPATH_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_multipath_rec_t)); - sa_mad_data.p_attr = &u.multipath_rec; - sa_mad_data.comp_mask = p_mpr_req->comp_mask; - u.multipath_rec.num_path = p_mpr_req->num_path; - if (p_mpr_req->reversible) - u.multipath_rec.num_path |= 0x80; - else - u.multipath_rec.num_path &= ~0x80; - u.multipath_rec.pkey = p_mpr_req->pkey; - ib_multipath_rec_set_sl(&u.multipath_rec, p_mpr_req->sl); - ib_multipath_rec_set_qos_class(&u.multipath_rec, 0); - u.multipath_rec.independence = p_mpr_req->independence; - u.multipath_rec.sgid_count = p_mpr_req->sgid_count; - u.multipath_rec.dgid_count = p_mpr_req->dgid_count; - j = 0; - for (i = 0; i < p_mpr_req->sgid_count; i++, j++) - u.multipath_rec.gids[j] = p_mpr_req->gids[j]; - for (i = 0; i < p_mpr_req->dgid_count; i++, j++) - u.multipath_rec.gids[j] = p_mpr_req->gids[j]; - break; -#endif - - default: - OSM_LOG(p_log, OSM_LOG_ERROR, "DBG:001 UNKNOWN 0x%x (%d)\n", - p_query_req->query_type, p_query_req->query_type); - CL_ASSERT(0); - return IB_ERROR; - } - - status = __osmv_send_sa_req(h_bind, &sa_mad_data, p_query_req); - - OSM_LOG_EXIT(p_log); - return status; -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx.c deleted file mode 100644 index 4486f00b..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx.c +++ /dev/null @@ -1,768 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include - -/** - * FORWARD REFERENCES - */ -static ib_api_status_t -__osmv_get_send_txn(IN osm_bind_handle_t h_bind, - IN osm_madw_t * const p_madw, - IN boolean_t is_rmpp, - IN boolean_t resp_expected, OUT osmv_txn_ctx_t ** pp_txn); - -static void __osm_vendor_internal_unbind(osm_bind_handle_t h_bind); - -/* - * NAME osm_vendor_new - * - * DESCRIPTION Create and Initialize the osm_vendor_t Object - */ - -osm_vendor_t *osm_vendor_new(IN osm_log_t * const p_log, - IN const uint32_t timeout) -{ - ib_api_status_t status; - osm_vendor_t *p_vend; - - OSM_LOG_ENTER(p_log); - - CL_ASSERT(p_log); - - p_vend = malloc(sizeof(*p_vend)); - if (p_vend != NULL) { - memset(p_vend, 0, sizeof(*p_vend)); - - status = osm_vendor_init(p_vend, p_log, timeout); - if (status != IB_SUCCESS) { - osm_vendor_delete(&p_vend); - } - } else { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_new: ERR 7301: " - "Fail to allocate vendor object.\n"); - } - - OSM_LOG_EXIT(p_log); - return (p_vend); -} - -/* - * NAME osm_vendor_delete - * - * DESCRIPTION Delete all the binds behind the vendor + free the vendor object - */ - -void osm_vendor_delete(IN osm_vendor_t ** const pp_vend) -{ - cl_list_item_t *p_item; - cl_list_obj_t *p_obj; - osm_bind_handle_t bind_h; - osm_log_t *p_log; - - OSM_LOG_ENTER((*pp_vend)->p_log); - p_log = (*pp_vend)->p_log; - - /* go over the bind handles , unbind them and remove from list */ - p_item = cl_qlist_remove_head(&((*pp_vend)->bind_handles)); - while (p_item != cl_qlist_end(&((*pp_vend)->bind_handles))) { - - p_obj = PARENT_STRUCT(p_item, cl_list_obj_t, list_item); - bind_h = (osm_bind_handle_t *) cl_qlist_obj(p_obj); - osm_log(p_log, OSM_LOG_DEBUG, - "osm_vendor_delete: unbinding bind_h:%p \n", bind_h); - - __osm_vendor_internal_unbind(bind_h); - - free(p_obj); - /*removing from list */ - p_item = cl_qlist_remove_head(&((*pp_vend)->bind_handles)); - } - - if (NULL != ((*pp_vend)->p_transport_info)) { - free((*pp_vend)->p_transport_info); - (*pp_vend)->p_transport_info = NULL; - } - - /* remove the packet randomizer object */ - if ((*pp_vend)->run_randomizer == TRUE) - osm_pkt_randomizer_destroy(&((*pp_vend)->p_pkt_randomizer), - p_log); - - free(*pp_vend); - *pp_vend = NULL; - - OSM_LOG_EXIT(p_log); -} - -/* - * NAME osm_vendor_init - * - * DESCRIPTION Initialize the vendor object - */ - -ib_api_status_t -osm_vendor_init(IN osm_vendor_t * const p_vend, - IN osm_log_t * const p_log, IN const uint32_t timeout) -{ - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_log); - - p_vend->p_transport_info = NULL; - p_vend->p_log = p_log; - p_vend->resp_timeout = timeout; - p_vend->ttime_timeout = timeout * OSMV_TXN_TIMEOUT_FACTOR; - - cl_qlist_init(&p_vend->bind_handles); - - /* update the run_randomizer flag */ - if (getenv("OSM_PKT_DROP_RATE") != NULL - && atol(getenv("OSM_PKT_DROP_RATE")) != 0) { - /* if the OSM_PKT_DROP_RATE global variable is defined to a non-zero value - - then the randomizer should be called. - Need to create the packet randomizer object */ - p_vend->run_randomizer = TRUE; - status = - osm_pkt_randomizer_init(&(p_vend->p_pkt_randomizer), p_log); - if (status != IB_SUCCESS) - return status; - } else { - p_vend->run_randomizer = FALSE; - p_vend->p_pkt_randomizer = NULL; - } - - OSM_LOG_EXIT(p_log); - return (IB_SUCCESS); -} - -/* - * NAME osm_vendor_bind - * - * DESCRIPTION Create a new bind object under the vendor object - */ - -osm_bind_handle_t -osm_vendor_bind(IN osm_vendor_t * const p_vend, - IN osm_bind_info_t * const p_bind_info, - IN osm_mad_pool_t * const p_mad_pool, - IN osm_vend_mad_recv_callback_t mad_recv_callback, - IN osm_vend_mad_send_err_callback_t send_err_callback, - IN void *context) -{ - osmv_bind_obj_t *p_bo; - ib_api_status_t status; - char hca_id[32]; - cl_status_t cl_st; - cl_list_obj_t *p_obj; - uint8_t hca_index; - - if (NULL == p_vend || NULL == p_bind_info || NULL == p_mad_pool - || NULL == mad_recv_callback || NULL == send_err_callback) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 7302: " - "NULL parameter passed in: p_vend=%p p_bind_info=%p p_mad_pool=%p recv_cb=%p send_err_cb=%p\n", - p_vend, p_bind_info, p_mad_pool, mad_recv_callback, - send_err_callback); - - return OSM_BIND_INVALID_HANDLE; - } - - p_bo = malloc(sizeof(osmv_bind_obj_t)); - if (NULL == p_bo) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 7303: could not allocate the bind object\n"); - return OSM_BIND_INVALID_HANDLE; - } - - memset(p_bo, 0, sizeof(osmv_bind_obj_t)); - p_bo->p_vendor = p_vend; - p_bo->recv_cb = mad_recv_callback; - p_bo->send_err_cb = send_err_callback; - p_bo->cb_context = context; - p_bo->p_osm_pool = p_mad_pool; - - /* obtain the hca name and port num from the guid */ - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osm_vendor_bind: " - "Finding CA and Port that owns port guid 0x%" PRIx64 ".\n", - cl_ntoh64(p_bind_info->port_guid)); - - status = osm_vendor_get_guid_ca_and_port(p_bo->p_vendor, - p_bind_info->port_guid, - &(p_bo->hca_hndl), - hca_id, - &hca_index, &(p_bo->port_num)); - if (status != IB_SUCCESS) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 7304: " - "Fail to find port number of port guid:0x%016" PRIx64 - "\n", p_bind_info->port_guid); - free(p_bo); - return OSM_BIND_INVALID_HANDLE; - } - - /* Initialize the magic_ptr to the pointer of the p_bo info. - This will be used to signal when the object is being destroyed, so no - real action will be done then. */ - p_bo->magic_ptr = p_bo; - - p_bo->is_closing = FALSE; - - cl_spinlock_construct(&(p_bo->lock)); - cl_st = cl_spinlock_init(&(p_bo->lock)); - if (cl_st != CL_SUCCESS) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 7305: " - "could not initialize the spinlock ...\n"); - free(p_bo); - return OSM_BIND_INVALID_HANDLE; - } - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osm_vendor_bind: osmv_txnmgr_init ... \n"); - if (osmv_txnmgr_init(&p_bo->txn_mgr, p_vend->p_log, &(p_bo->lock)) != - IB_SUCCESS) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 7306: " - "osmv_txnmgr_init failed \n"); - cl_spinlock_destroy(&p_bo->lock); - free(p_bo); - return OSM_BIND_INVALID_HANDLE; - } - - /* Do the real job! (Transport-dependent) */ - if (IB_SUCCESS != - osmv_transport_init(p_bind_info, hca_id, hca_index, p_bo)) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 7307: " - "osmv_transport_init failed \n"); - osmv_txnmgr_done((osm_bind_handle_t) p_bo); - cl_spinlock_destroy(&p_bo->lock); - free(p_bo); - return OSM_BIND_INVALID_HANDLE; - } - - /* insert bind handle into db */ - p_obj = malloc(sizeof(cl_list_obj_t)); - if (NULL == p_obj) { - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osm_vendor_bind: ERR 7308: " - "osm_vendor_bind: could not allocate the list object\n"); - - osmv_transport_done(p_bo->p_transp_mgr); - osmv_txnmgr_done((osm_bind_handle_t) p_bo); - cl_spinlock_destroy(&p_bo->lock); - free(p_bo); - return OSM_BIND_INVALID_HANDLE; - } - memset(p_obj, 0, sizeof(cl_list_obj_t)); - cl_qlist_set_obj(p_obj, p_bo); - - cl_qlist_insert_head(&p_vend->bind_handles, &p_obj->list_item); - - return (osm_bind_handle_t) p_bo; -} - -/* - * NAME osm_vendor_unbind - * - * DESCRIPTION Destroy the bind object and remove it from the vendor's list - */ - -void osm_vendor_unbind(IN osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_log_t *p_log = p_bo->p_vendor->p_log; - cl_list_obj_t *p_obj = NULL; - cl_list_item_t *p_item, *p_item_tmp; - cl_qlist_t *const p_bh_list = - (cl_qlist_t * const)&p_bo->p_vendor->bind_handles; - - OSM_LOG_ENTER(p_log); - - /* go over all the items in the list and remove the specific item */ - p_item = cl_qlist_head(p_bh_list); - while (p_item != cl_qlist_end(p_bh_list)) { - p_obj = PARENT_STRUCT(p_item, cl_list_obj_t, list_item); - if (cl_qlist_obj(p_obj) == h_bind) { - break; - } - p_item_tmp = cl_qlist_next(p_item); - p_item = p_item_tmp; - } - - CL_ASSERT(p_item != cl_qlist_end(p_bh_list)); - - cl_qlist_remove_item(p_bh_list, p_item); - if (p_obj) - free(p_obj); - - if (h_bind != 0) { - __osm_vendor_internal_unbind(h_bind); - } - - OSM_LOG_EXIT(p_log); -} - -/* - * NAME osm_vendor_get - * - * DESCRIPTION Allocate the space for a new MAD - */ - -ib_mad_t *osm_vendor_get(IN osm_bind_handle_t h_bind, - IN const uint32_t mad_size, - IN osm_vend_wrap_t * const p_vw) -{ - ib_mad_t *p_mad; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_vendor_t const *p_vend = p_bo->p_vendor; - uint32_t act_mad_size; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vw); - - if (mad_size < MAD_BLOCK_SIZE) { - /* Stupid, but the applications want that! */ - act_mad_size = MAD_BLOCK_SIZE; - } else { - act_mad_size = mad_size; - } - - /* allocate it */ - p_mad = (ib_mad_t *) malloc(act_mad_size); - if (p_mad == NULL) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get: ERR 7309: " - "Error Obtaining MAD buffer.\n"); - goto Exit; - } - - memset(p_mad, 0, act_mad_size); - - if (osm_log_get_level(p_vend->p_log) >= OSM_LOG_DEBUG) { - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_get: " - "Allocated MAD %p, size = %u.\n", p_mad, act_mad_size); - } - p_vw->p_mad = p_mad; - -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return (p_mad); -} - -/* - * NAME osm_vendor_send - * - * DESCRIPTION Send a MAD buffer (RMPP or simple send). - * - * Semantics: - * (1) The RMPP send completes when every segment - * is acknowledged (synchronous) - * (2) The simple send completes when the send completion - * is received (asynchronous) - */ - -ib_api_status_t -osm_vendor_send(IN osm_bind_handle_t h_bind, - IN osm_madw_t * const p_madw, IN boolean_t const resp_expected) -{ - ib_api_status_t ret = IB_SUCCESS; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - boolean_t is_rmpp = FALSE, is_rmpp_ds = FALSE; - osmv_txn_ctx_t *p_txn = NULL; - ib_mad_t *p_mad; - osm_log_t *p_log = p_bo->p_vendor->p_log; - osm_mad_pool_t *p_mad_pool = p_bo->p_osm_pool; - OSM_LOG_ENTER(p_log); - - if (NULL == h_bind || NULL == p_madw || - NULL == (p_mad = osm_madw_get_mad_ptr(p_madw)) || - NULL == osm_madw_get_mad_addr_ptr(p_madw)) { - - return IB_INVALID_PARAMETER; - } - - is_rmpp = (p_madw->mad_size > MAD_BLOCK_SIZE - || osmv_mad_is_rmpp(p_mad)); - /* is this rmpp double sided? This means we expect a response that can be - an rmpp or not */ - is_rmpp_ds = (TRUE == is_rmpp && TRUE == resp_expected); - - /* Make our operations with the send context atomic */ - osmv_txn_lock(p_bo); - - if (TRUE == p_bo->is_closing) { - - osm_log(p_log, OSM_LOG_ERROR, - "osm_vendor_send: ERR 7310: " - "The handle %p is being unbound, cannot send.\n", - h_bind); - ret = IB_INTERRUPTED; - /* When closing p_bo could be detroyed or is going to , thus could not refer to it */ - goto send_done; - } - - if (TRUE == resp_expected || TRUE == is_rmpp) { - - /* We must run under a transaction framework. - * Get the transaction object (old or new) */ - ret = __osmv_get_send_txn(h_bind, p_madw, is_rmpp, - resp_expected, &p_txn); - if (IB_SUCCESS != ret) { - goto send_done; - } - } - - if (TRUE == is_rmpp) { - /* Do the job - RMPP! - * The call returns as all the packets are ACK'ed/upon error - * The txn lock will be released each time the function sleeps - * and re-acquired when it wakes up - */ - ret = osmv_rmpp_send_madw(h_bind, p_madw, p_txn, is_rmpp_ds); - } else { - - /* Do the job - single MAD! - * The call returns as soon as the MAD is put on the wire - */ - ret = osmv_simple_send_madw(h_bind, p_madw, p_txn, FALSE); - } - - if (IB_SUCCESS == ret) { - - if ((TRUE == is_rmpp) && (FALSE == is_rmpp_ds)) { - /* For double-sided sends, the txn continues to live */ - osmv_txn_done(h_bind, osmv_txn_get_key(p_txn), - FALSE /*not in callback */ ); - } - - if (FALSE == resp_expected) { - osm_mad_pool_put(p_mad_pool, p_madw); - } - } else if (IB_INTERRUPTED != ret) { - if (NULL != p_txn) { - osmv_txn_done(h_bind, osmv_txn_get_key(p_txn), - FALSE /*not in callback */ ); - } - - osm_log(p_log, OSM_LOG_ERROR, - "osm_vendor_send: ERR 7311: failed to send MADW %p\n", - p_madw); - - if (TRUE == resp_expected) { - /* Change the status on the p_madw */ - p_madw->status = ret; - /* Only the requester expects the error callback */ - p_bo->send_err_cb(p_bo->cb_context, p_madw); - } else { - /* put back the mad - it is useless ... */ - osm_mad_pool_put(p_mad_pool, p_madw); - } - } else { /* the transaction was aborted due to p_bo exit */ - - osm_mad_pool_put(p_mad_pool, p_madw); - goto aborted; - } -send_done: - - osmv_txn_unlock(p_bo); -aborted: - OSM_LOG_EXIT(p_log); - return ret; -} - -/* - * NAME osm_vendor_put - * - * DESCRIPTION Free the MAD's memory - */ - -void -osm_vendor_put(IN osm_bind_handle_t h_bind, IN osm_vend_wrap_t * const p_vw) -{ - - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_vendor_t const *p_vend = p_bo->p_vendor; - - if (p_bo->is_closing != TRUE) { - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vw); - CL_ASSERT(p_vw->p_mad); - - if (osm_log_get_level(p_vend->p_log) >= OSM_LOG_DEBUG) { - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_put: " "Retiring MAD %p.\n", - p_vw->p_mad); - } - - free(p_vw->p_mad); - p_vw->p_mad = NULL; - - OSM_LOG_EXIT(p_vend->p_log); - } -} - -/* - * NAME osm_vendor_local_lid_change - * - * DESCRIPTION Notifies the vendor transport layer that the local address - * has changed. This allows the vendor layer to perform - * housekeeping functions such as address vector updates. - */ - -ib_api_status_t osm_vendor_local_lid_change(IN osm_bind_handle_t h_bind) -{ - osm_vendor_t const *p_vend = ((osmv_bind_obj_t *) h_bind)->p_vendor; - OSM_LOG_ENTER(p_vend->p_log); - - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_local_lid_change: " "Change of LID.\n"); - - OSM_LOG_EXIT(p_vend->p_log); - - return (IB_SUCCESS); - -} - -/* - * NAME osm_vendor_set_sm - * - * DESCRIPTION Modifies the port info for the bound port to set the "IS_SM" bit - * according to the value given (TRUE or FALSE). - */ -#if !(defined(OSM_VENDOR_INTF_TS_NO_VAPI) || defined(OSM_VENDOR_INTF_SIM) || defined(OSM_VENDOR_INTF_TS)) -void osm_vendor_set_sm(IN osm_bind_handle_t h_bind, IN boolean_t is_sm_val) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_vendor_t const *p_vend = p_bo->p_vendor; - VAPI_ret_t status; - VAPI_hca_attr_t attr_mod; - VAPI_hca_attr_mask_t attr_mask; - - OSM_LOG_ENTER(p_vend->p_log); - - memset(&attr_mod, 0, sizeof(attr_mod)); - memset(&attr_mask, 0, sizeof(attr_mask)); - - attr_mod.is_sm = is_sm_val; - attr_mask = HCA_ATTR_IS_SM; - - status = - VAPI_modify_hca_attr(p_bo->hca_hndl, p_bo->port_num, &attr_mod, - &attr_mask); - if (status != VAPI_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_set_sm: ERR 7312: " - "Unable set 'IS_SM' bit to:%u in port attributes (%d).\n", - is_sm_val, status); - } - - OSM_LOG_EXIT(p_vend->p_log); -} - -#endif - -/* - * NAME __osm_vendor_internal_unbind - * - * DESCRIPTION Destroying a bind: - * (1) Wait for the completion of the sends in flight - * (2) Destroy the associated data structures - */ - -static void __osm_vendor_internal_unbind(osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_log_t *p_log = p_bo->p_vendor->p_log; - - OSM_LOG_ENTER(p_log); - - /* "notifying" all that from now on no new sends can be done */ - p_bo->txn_mgr.p_event_wheel->closing = TRUE; - - osmv_txn_lock(p_bo); - - /* - the is_closing is set under lock we we know we only need to - check for it after obtaining the lock - */ - p_bo->is_closing = TRUE; - - /* notifying all sleeping rmpp sends to exit */ - osmv_txn_abort_rmpp_txns(h_bind); - - /* unlock the bo to allow for any residual mads to be dispatched */ - osmv_txn_unlock(p_bo); - osm_log(p_log, OSM_LOG_DEBUG, - "__osm_vendor_internal_unbind: destroying transport mgr.. \n"); - /* wait for the receiver thread to exit */ - osmv_transport_done(h_bind); - - /* lock to avoid any collissions while we cleanup the structs */ - osmv_txn_lock(p_bo); - osm_log(p_log, OSM_LOG_DEBUG, - "__osm_vendor_internal_unbind: destroying txn mgr.. \n"); - osmv_txnmgr_done(h_bind); - osm_log(p_log, OSM_LOG_DEBUG, - "__osm_vendor_internal_unbind: destroying bind lock.. \n"); - osmv_txn_unlock(p_bo); - - /* - we intentionally let the p_bo and its lock leak - - as we did not implement a way to track active bind handles provided to - the client - and the client might use them - - cl_spinlock_destroy(&p_bo->lock); - free(p_bo); - */ - - OSM_LOG_EXIT(p_log); -} - -/* - * NAME __osmv_get_send_txn - * - * DESCRIPTION Return a transaction object that corresponds to this MAD. - * Optionally, create it, if the new request (query) is sent or received. - */ - -static ib_api_status_t -__osmv_get_send_txn(IN osm_bind_handle_t h_bind, - IN osm_madw_t * const p_madw, - IN boolean_t is_rmpp, - IN boolean_t resp_expected, OUT osmv_txn_ctx_t ** pp_txn) -{ - ib_api_status_t ret; - uint64_t tid, key; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - ib_mad_t *p_mad = osm_madw_get_mad_ptr(p_madw); - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - CL_ASSERT(NULL != pp_txn); - - key = tid = cl_ntoh64(p_mad->trans_id); - if (TRUE == resp_expected) { - /* Create a unique identifier at the requester side */ - key = osmv_txn_uniq_key(tid); - } - - /* We must run under a transaction framework */ - ret = osmv_txn_lookup(h_bind, key, pp_txn); - if (IB_NOT_FOUND == ret) { - /* Generally, we start a new transaction */ - ret = osmv_txn_init(h_bind, tid, key, pp_txn); - if (IB_SUCCESS != ret) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_get_send_txn: ERR 7313: " - "The transaction id=0x%llX failed to init.\n", - tid); - goto get_send_txn_done; - } - } else { - CL_ASSERT(NULL != *pp_txn); - /* The transaction context exists. - * This is legal only if I am going to return an - * (RMPP?) reply to an RMPP request sent by the other part - * (double-sided RMPP transfer) - */ - if (FALSE == is_rmpp - || FALSE == osmv_txn_is_rmpp_init_by_peer(*pp_txn)) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_get_send_txn: ERR 7314: " - "The transaction id=0x%llX is not unique. Send failed.\n", - tid); - - ret = IB_INVALID_SETTING; - goto get_send_txn_done; - } - - if (TRUE == resp_expected) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_get_send_txn: ERR 7315: " - "The transaction id=%llX can't expect a response. Send failed.\n", - tid); - - ret = IB_INVALID_PARAMETER; - goto get_send_txn_done; - } - } - - if (TRUE == is_rmpp) { - ret = osmv_txn_init_rmpp_sender(h_bind, *pp_txn, p_madw); - if (IB_SUCCESS != ret) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_get_send_txn: ERR 7316: " - "The transaction id=%llX failed to init the rmpp mad. Send failed.\n", - tid); - osmv_txn_done(h_bind, tid, FALSE); - goto get_send_txn_done; - } - } - - /* Save a reference to the MAD in the txn context - * We'll need to match it in two cases: - * (1) When the response is returned, if I am the requester - * (2) In RMPP retransmissions - */ - osmv_txn_set_madw(*pp_txn, p_madw); - -get_send_txn_done: - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - - return ret; -} - -void osm_vendor_set_debug(IN osm_vendor_t * const p_vend, IN int32_t level) -{ - -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_dispatcher.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_dispatcher.c deleted file mode 100644 index ad6ed835..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_dispatcher.c +++ /dev/null @@ -1,710 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include - -typedef enum _osmv_disp_route { - - OSMV_ROUTE_DROP, - OSMV_ROUTE_SIMPLE, - OSMV_ROUTE_RMPP, - -} osmv_disp_route_t; - -/** - * FORWARD REFERENCES TO PRIVATE FUNCTIONS - */ - -static osmv_disp_route_t -__osmv_dispatch_route(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, OUT osmv_txn_ctx_t ** pp_txn); - -static void -__osmv_dispatch_simple_mad(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr); - -static void -__osmv_dispatch_rmpp_mad(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr); - -static void -__osmv_dispatch_rmpp_snd(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr); - -static ib_api_status_t -__osmv_dispatch_rmpp_rcv(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr); - -static ib_api_status_t -__osmv_dispatch_accept_seg(IN osm_bind_handle_t h_bind, - IN osmv_txn_ctx_t * p_txn, - IN const ib_mad_t * p_mad); -static void -__osmv_dispatch_send_ack(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_req_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr); - -/* - * NAME - * osmv_dispatch_mad - * - * DESCRIPTION - * Lower-level MAD dispatcher. - * Implements a switch between the following MAD consumers: - * (1) Non-RMPP consumer (DATA) - * (2) RMPP receiver (DATA/ABORT/STOP) - * (3) RMPP sender (ACK/ABORT/STOP) - * - * PARAMETERS - * h_bind The bind handle - * p_mad_buf The 256 byte buffer of individual MAD - * p_mad_addr The MAD originator's address - */ - -ib_api_status_t -osmv_dispatch_mad(IN osm_bind_handle_t h_bind, - IN const void *p_mad_buf, - IN const osm_mad_addr_t * p_mad_addr) -{ - ib_api_status_t ret = IB_SUCCESS; - const ib_mad_t *p_mad = (ib_mad_t *) p_mad_buf; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osmv_txn_ctx_t *p_txn = NULL; - osm_log_t *p_log = p_bo->p_vendor->p_log; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - CL_ASSERT(NULL != h_bind && NULL != p_mad && NULL != p_mad_addr); - - osmv_txn_lock(p_bo); - - if (TRUE == p_bo->is_closing) { - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "The bind handle %p is being closed. " - "The MAD will not be dispatched.\n", p_bo); - - ret = IB_INTERRUPTED; - goto dispatch_mad_done; - } - - /* - Add call for packet drop randomizer. - This is a testing feature. If run_randomizer flag is set to TRUE, - the randomizer will be called, and randomally will drop - a packet. This is used for simulating unstable fabric. - */ - if (p_bo->p_vendor->run_randomizer == TRUE) { - /* Try the randomizer */ - if (osm_pkt_randomizer_mad_drop(p_bo->p_vendor->p_log, - p_bo->p_vendor-> - p_pkt_randomizer, - p_mad) == TRUE) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "The MAD will not be dispatched.\n"); - goto dispatch_mad_done; - } - } - - switch (__osmv_dispatch_route(h_bind, p_mad, &p_txn)) { - - case OSMV_ROUTE_DROP: - break; /* Do nothing */ - - case OSMV_ROUTE_SIMPLE: - __osmv_dispatch_simple_mad(h_bind, p_mad, p_txn, p_mad_addr); - break; - - case OSMV_ROUTE_RMPP: - __osmv_dispatch_rmpp_mad(h_bind, p_mad, p_txn, p_mad_addr); - break; - - default: - CL_ASSERT(FALSE); - } - -dispatch_mad_done: - osmv_txn_unlock(p_bo); - - OSM_LOG_EXIT(p_log); - return ret; -} - -/* - * NAME __osmv_dispatch_route() - * - * DESCRIPTION Decide which way to handle the received MAD: simple txn/RMPP/drop - */ - -static osmv_disp_route_t -__osmv_dispatch_route(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, OUT osmv_txn_ctx_t ** pp_txn) -{ - ib_api_status_t ret; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - boolean_t is_resp = ib_mad_is_response(p_mad); - boolean_t is_txn; - uint64_t key = cl_ntoh64(p_mad->trans_id); - - CL_ASSERT(NULL != pp_txn); - - ret = osmv_txn_lookup(h_bind, key, pp_txn); - is_txn = (IB_SUCCESS == ret); - - if (FALSE == is_txn && TRUE == is_resp) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Received a response to a non-started/aged-out transaction (tid=0x%llX). " - "Dropping the MAD.\n", key); - return OSMV_ROUTE_DROP; - } - - if (TRUE == osmv_mad_is_rmpp(p_mad)) { - /* An RMPP transaction. The filtering is more delicate there */ - return OSMV_ROUTE_RMPP; - } - - if (TRUE == is_txn && FALSE == is_resp) { - /* Does this MAD try to start a transaction with duplicate tid? */ - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Duplicate TID 0x%llX received (not a response). " - "Dropping the MAD.\n", key); - - return OSMV_ROUTE_DROP; - } - - return OSMV_ROUTE_SIMPLE; -} - -/* - * NAME __osmv_dispatch_simple_mad() - * - * DESCRIPTION Handle a MAD that is part of non-RMPP transfer - */ - -static void -__osmv_dispatch_simple_mad(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr) -{ - osm_madw_t *p_madw; - ib_mad_t *p_mad_buf; - osm_madw_t *p_req_madw = NULL; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - /* Build the MAD wrapper to be returned to the user. - * The actual storage for the MAD is allocated there. - */ - p_madw = - osm_mad_pool_get(p_bo->p_osm_pool, h_bind, MAD_BLOCK_SIZE, - p_mad_addr); - - if (NULL == p_madw) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_dispatch_simple_mad: ERR 6501: " - "Out Of Memory - could not allocate a buffer of size %d\n", - MAD_BLOCK_SIZE); - - goto dispatch_simple_mad_done; - } - - p_mad_buf = osm_madw_get_mad_ptr(p_madw); - /* Copy the payload to the MAD buffer */ - memcpy((void *)p_mad_buf, (void *)p_mad, MAD_BLOCK_SIZE); - - if (NULL != p_txn) { - /* This is a RESPONSE MAD. Pair it with the REQUEST MAD, pass upstream */ - p_req_madw = p_txn->p_madw; - CL_ASSERT(NULL != p_req_madw); - - p_mad_buf->trans_id = cl_hton64(osmv_txn_get_tid(p_txn)); - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Restoring the original TID to 0x%llX\n", - cl_ntoh64(p_mad_buf->trans_id)); - - /* Reply matched, transaction complete */ - osmv_txn_done(h_bind, osmv_txn_get_key(p_txn), FALSE); - } else { - /* This is a REQUEST MAD. Don't create a context, pass upstream */ - } - - /* Do the job ! */ - p_bo->recv_cb(p_madw, p_bo->cb_context, p_req_madw); - -dispatch_simple_mad_done: - OSM_LOG_EXIT(p_bo->p_vendor->p_log); -} - -/* - * NAME __osmv_dispatch_rmpp_mad() - * - * DESCRIPTION Handle a MAD that is part of RMPP transfer - */ - -static void -__osmv_dispatch_rmpp_mad(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr) -{ - ib_api_status_t status = IB_SUCCESS; - uint64_t key = cl_ntoh64(p_mad->trans_id); - boolean_t is_init_by_peer = FALSE; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_madw_t *p_madw; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - if (NULL == p_txn) { - if (FALSE == osmv_rmpp_is_data(p_mad) - || FALSE == osmv_rmpp_is_first(p_mad)) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "The MAD does not match any transaction " - "and does not start a sender-initiated RMPP transfer.\n"); - goto dispatch_rmpp_mad_done; - } - - /* IB Spec 13.6.2.2. This is a Sender Initiated Transfer. - My peer is the requester and RMPP Sender. I am the RMPP Receiver. - */ - status = osmv_txn_init(h_bind, /*tid==key */ key, key, &p_txn); - if (IB_SUCCESS != status) { - goto dispatch_rmpp_mad_done; - } - - is_init_by_peer = TRUE; - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "A new sender-initiated transfer (TID=0x%llX) started\n", - key); - } - - if (OSMV_TXN_RMPP_NONE == osmv_txn_get_rmpp_state(p_txn)) { - /* Case 1: Fall through from above. - * Case 2: When the transaction was initiated by me - * (a single request MAD), there was an uncertainty - * whether the reply will be RMPP. Now it's resolved, - * since the reply is RMPP! - */ - status = - osmv_txn_init_rmpp_receiver(h_bind, p_txn, is_init_by_peer); - if (IB_SUCCESS != status) { - goto dispatch_rmpp_mad_done; - } - } - - switch (osmv_txn_get_rmpp_state(p_txn)) { - - case OSMV_TXN_RMPP_RECEIVER: - status = - __osmv_dispatch_rmpp_rcv(h_bind, p_mad, p_txn, p_mad_addr); - if (IB_SUCCESS != status) { - if (FALSE == osmv_txn_is_rmpp_init_by_peer(p_txn)) { - /* This is a requester, still waiting for the reply. Apply the callback */ - /* update the status of the p_madw */ - p_madw = osmv_txn_get_madw(p_txn); - p_madw->status = status; - p_bo->send_err_cb(p_bo->cb_context, p_madw); - } - - /* ABORT/STOP/LOCAL ERROR */ - osmv_txn_done(h_bind, osmv_txn_get_key(p_txn), FALSE); - } - break; - - case OSMV_TXN_RMPP_SENDER: - __osmv_dispatch_rmpp_snd(h_bind, p_mad, p_txn, p_mad_addr); - /* If an error happens here, it's the sender thread to cleanup the txn */ - break; - - default: - CL_ASSERT(FALSE); - } - -dispatch_rmpp_mad_done: - OSM_LOG_EXIT(p_bo->p_vendor->p_log); -} - -/* - * NAME __osmv_dispatch_rmpp_snd() - * - * DESCRIPTION MAD handling by an RMPP sender (ACK/ABORT/STOP) - */ - -static void -__osmv_dispatch_rmpp_snd(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr) -{ - osmv_rmpp_send_ctx_t *p_send_ctx = osmv_txn_get_rmpp_send_ctx(p_txn); - - uint32_t old_wl = p_send_ctx->window_last; - uint32_t total_segs = osmv_rmpp_send_ctx_get_num_segs(p_send_ctx); - uint32_t seg_num = cl_ntoh32(((ib_rmpp_mad_t *) p_mad)->seg_num); - uint32_t new_wl = cl_ntoh32(((ib_rmpp_mad_t *) p_mad)->paylen_newwin); - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - if (TRUE == osmv_rmpp_is_abort_stop(p_mad)) { - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_dispatch_rmpp_snd: ERR 6502: " - "The remote side sent an ABORT/STOP indication.\n"); - osmv_rmpp_snd_error(p_send_ctx, IB_REMOTE_ERROR); - goto dispatch_rmpp_snd_done; - } - - if (FALSE == osmv_rmpp_is_ack(p_mad)) { - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Not supposed to receive DATA packets --> dropping the MAD\n"); - goto dispatch_rmpp_snd_done; - } - - /* Continue processing the ACK */ - if (seg_num > old_wl) { - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_dispatch_rmpp_snd: ERR 6503: " - "ACK received for a non-sent segment %d\n", seg_num); - - osmv_rmpp_send_nak(h_bind, p_mad, p_mad_addr, - IB_RMPP_TYPE_ABORT, IB_RMPP_STATUS_S2B); - - osmv_rmpp_snd_error(p_send_ctx, IB_REMOTE_ERROR); - goto dispatch_rmpp_snd_done; - } - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "__osmv_dispatch_rmpp_snd: " - "New WL = %u Old WL = %u Total Segs = %u\n", - new_wl, old_wl, total_segs); - - if (new_wl < old_wl) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_dispatch_rmpp_snd: ERR 6508: " - "The receiver requests a smaller WL (%d) than before (%d)\n", - new_wl, old_wl); - - osmv_rmpp_send_nak(h_bind, p_mad, p_mad_addr, - IB_RMPP_TYPE_ABORT, IB_RMPP_STATUS_W2S); - - osmv_rmpp_snd_error(p_send_ctx, IB_REMOTE_ERROR); - goto dispatch_rmpp_snd_done; - } - - /* Update the sender's window, and optionally wake up the sender thread - * Note! A single ACK can acknowledge a whole range of segments: [WF..SEG_NUM] - */ - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "ACK for seg_num #%d accepted.\n", seg_num); - - if (seg_num == old_wl) { - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "The send window [%d:%d] is totally acknowledged.\n", - p_send_ctx->window_first, old_wl); - - p_send_ctx->window_first = seg_num + 1; - p_send_ctx->window_last = - (new_wl < total_segs) ? new_wl : total_segs; - - /* Remove the response timeout event for the window */ - osmv_txn_remove_timeout_ev(h_bind, osmv_txn_get_key(p_txn)); - - /* Wake up the sending thread */ - cl_event_signal(&p_send_ctx->event); - } - -dispatch_rmpp_snd_done: - OSM_LOG_EXIT(p_bo->p_vendor->p_log); -} - -/* - * NAME __osmv_dispatch_rmpp_rcv() - * - * DESCRIPTION MAD handling by an RMPP receiver (DATA/ABORT/STOP) - */ - -static ib_api_status_t -__osmv_dispatch_rmpp_rcv(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_rmpp_recv_ctx_t *p_recv_ctx = osmv_txn_get_rmpp_recv_ctx(p_txn); - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - boolean_t is_last1 = FALSE, is_last2 = FALSE; - osm_madw_t *p_new_madw = NULL, *p_req_madw = NULL; - ib_mad_t *p_mad_buf; - uint32_t size = 0; - uint64_t key = osmv_txn_get_key(p_txn); - uint64_t tid = osmv_txn_get_tid(p_txn); - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - if (TRUE == osmv_rmpp_is_ack(p_mad)) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Not supposed to receive ACK's --> dropping the MAD\n"); - - goto dispatch_rmpp_rcv_done; - } - - if (TRUE == osmv_rmpp_is_abort_stop(p_mad)) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "__osmv_dispatch_rmpp_rcv: ERR 6504: " - "The Remote Side stopped sending\n"); - - status = IB_REMOTE_ERROR; - goto dispatch_rmpp_rcv_done; - } - - status = __osmv_dispatch_accept_seg(h_bind, p_txn, p_mad); - switch (status) { - - case IB_SUCCESS: - - /* Check wheter this is the legal last MAD */ - /* Criteria #1: the received MAD is marked last */ - is_last1 = osmv_rmpp_is_last(p_mad); - - /* Criteria #2: the total accumulated length hits the advertised one */ - is_last2 = is_last1; - - size = osmv_rmpp_recv_ctx_get_byte_num_from_first(p_recv_ctx); - if (size > 0) { - is_last2 = - (osmv_rmpp_recv_ctx_get_cur_byte_num(p_recv_ctx) >= - size); - } - - if (is_last1 != is_last2) { - - osmv_rmpp_send_nak(h_bind, p_mad, p_mad_addr, - IB_RMPP_TYPE_ABORT, - IB_RMPP_STATUS_BAD_LEN); - - status = IB_ERROR; - goto dispatch_rmpp_rcv_done; - } - - /* TBD Consider an optimization - sending an ACK - * only for the last segment in the window - */ - __osmv_dispatch_send_ack(h_bind, p_mad, p_txn, p_mad_addr); - break; - - case IB_INSUFFICIENT_RESOURCES: - /* An out-of-order segment received. Send the ACK anyway */ - __osmv_dispatch_send_ack(h_bind, p_mad, p_txn, p_mad_addr); - status = IB_SUCCESS; - goto dispatch_rmpp_rcv_done; - - case IB_INSUFFICIENT_MEMORY: - osmv_rmpp_send_nak(h_bind, p_mad, p_mad_addr, - IB_RMPP_TYPE_STOP, IB_RMPP_STATUS_RESX); - goto dispatch_rmpp_rcv_done; - - default: - /* Illegal return code */ - CL_ASSERT(FALSE); - } - - if (TRUE != is_last1) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "RMPP MADW assembly continues, TID=0x%llX\n", tid); - goto dispatch_rmpp_rcv_done; - } - - /* This is the last packet. */ - if (0 == size) { - /* The total size was not advertised in the first packet */ - size = osmv_rmpp_recv_ctx_get_byte_num_from_last(p_recv_ctx); - } - - /* - NOTE: the received mad might not be >= 256 bytes. - some MADs might contain several SA records but still be - less then a full MAD. - We have to use RMPP to send them over since on a regular - "simple" MAD there is no way to know how many records were sent - */ - - /* Build the MAD wrapper to be returned to the user. - * The actual storage for the MAD is allocated there. - */ - p_new_madw = - osm_mad_pool_get(p_bo->p_osm_pool, h_bind, size, p_mad_addr); - if (NULL == p_new_madw) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_dispatch_rmpp_rcv: ERR 6506: " - "Out Of Memory - could not allocate %d bytes for the MADW\n", - size); - - status = IB_INSUFFICIENT_MEMORY; - goto dispatch_rmpp_rcv_done; - } - - p_req_madw = osmv_txn_get_madw(p_txn); - p_mad_buf = osm_madw_get_mad_ptr(p_new_madw); - status = osmv_rmpp_recv_ctx_reassemble_arbt_mad(p_recv_ctx, size, - (uint8_t *) p_mad_buf); - if (IB_SUCCESS != status) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_dispatch_rmpp_rcv: ERR 6507: " - "Internal error - could not reassemble the result MAD\n"); - goto dispatch_rmpp_rcv_done; /* What can happen here? */ - } - - /* The MAD is assembled, we are about to apply the callback. - * Delete the transaction context, unless the transaction is double sided */ - if (FALSE == osmv_txn_is_rmpp_init_by_peer(p_txn) - || FALSE == osmv_mad_is_multi_resp(p_mad)) { - - osmv_txn_done(h_bind, key, FALSE); - } - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "RMPP MADW %p assembly complete, TID=0x%llX\n", p_new_madw, - tid); - - p_mad_buf->trans_id = cl_hton64(tid); - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Restoring the original TID to 0x%llX\n", - cl_ntoh64(p_mad_buf->trans_id)); - - /* Finally, do the job! */ - p_bo->recv_cb(p_new_madw, p_bo->cb_context, p_req_madw); - -dispatch_rmpp_rcv_done: - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - return status; -} - -/* - * NAME __osmv_dispatch_accept_seg() - * - * DESCRIPTION Store a DATA segment at the RMPP receiver side, - * if one is received in order. - */ - -static ib_api_status_t -__osmv_dispatch_accept_seg(IN osm_bind_handle_t h_bind, - IN osmv_txn_ctx_t * p_txn, IN const ib_mad_t * p_mad) -{ - ib_api_status_t ret = IB_SUCCESS; - uint32_t seg_num = cl_ntoh32(((ib_rmpp_mad_t *) p_mad)->seg_num); - osmv_rmpp_recv_ctx_t *p_recv_ctx = osmv_txn_get_rmpp_recv_ctx(p_txn); - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - uint64_t tid = osmv_txn_get_tid(p_txn); - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - if (seg_num != p_recv_ctx->expected_seg) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "TID 0x%llX: can't accept this segment (%d) - " - "this is a Go-Back-N implementation\n", tid, seg_num); - return IB_INSUFFICIENT_RESOURCES; - } - - /* Store the packet's copy in the reassembly list. - * Promote the expected segment counter. - */ - ret = osmv_rmpp_recv_ctx_store_mad_seg(p_recv_ctx, (uint8_t *) p_mad); - if (IB_SUCCESS != ret) { - return ret; - } - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "TID 0x%llX: segment %d accepted\n", tid, seg_num); - p_recv_ctx->expected_seg = seg_num + 1; - - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - return IB_SUCCESS; -} - -/* - * NAME __osmv_dispatch_send_ack() - * - * DESCRIPTION - * - * ISSUES - * Consider sending the ACK from an async thread - * if problems with the receiving side processing arise. - */ - -static void -__osmv_dispatch_send_ack(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_req_mad, - IN osmv_txn_ctx_t * p_txn, - IN const osm_mad_addr_t * p_mad_addr) -{ - osmv_rmpp_recv_ctx_t *p_recv_ctx = osmv_txn_get_rmpp_recv_ctx(p_txn); - - /* ACK the segment # that was accepted */ - uint32_t seg_num = cl_ntoh32(((ib_rmpp_mad_t *) p_req_mad)->seg_num); - - /* NOTE! The receiver can publish the New Window Last (NWL) value - * that is greater than the total number of segments to be sent. - * It's the sender's responsibility to compute the correct number - * of segments to send in the next burst. - */ - uint32_t nwl = p_recv_ctx->expected_seg + OSMV_RMPP_RECV_WIN - 1; - - osmv_rmpp_send_ack(h_bind, p_req_mad, seg_num, nwl, p_mad_addr); -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_hca.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_hca.c deleted file mode 100644 index fa168ced..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_hca.c +++ /dev/null @@ -1,522 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#if defined(OSM_VENDOR_INTF_MTL) | defined(OSM_VENDOR_INTF_TS) -#undef IN -#undef OUT -#include -#include -#include -#include -#include -#include - -/******************************************************************************** - * - * Provide the functionality for selecting an HCA Port and Obtaining it's guid. - * - ********************************************************************************/ - -typedef struct _osm_ca_info { - ib_net64_t guid; - size_t attr_size; - ib_ca_attr_t *p_attr; -} osm_ca_info_t; - -/********************************************************************** - * Convert the given GID to GUID by copy of it's upper 8 bytes - **********************************************************************/ -ib_api_status_t -__osm_vendor_gid_to_guid(IN u_int8_t * gid, OUT VAPI_gid_t * guid) -{ - memcpy(guid, gid + 8, 8); - return (IB_SUCCESS); -} - -/********************************************************************** - * Returns a pointer to the port attribute of the specified port - * owned by this CA. - ************************************************************************/ -static ib_port_attr_t *__osm_ca_info_get_port_attr_ptr(IN const osm_ca_info_t * - const p_ca_info, - IN const uint8_t index) -{ - return (&p_ca_info->p_attr->p_port_attr[index]); -} - -/******************************************************************************** - * get the CA names available on the system - * NOTE: user of this function needs to deallocate p_hca_ids after usage. - ********************************************************************************/ -static ib_api_status_t -__osm_vendor_get_ca_ids(IN osm_vendor_t * const p_vend, - IN VAPI_hca_id_t ** const p_hca_ids, - IN uint32_t * const p_num_guids) -{ - ib_api_status_t status; - VAPI_ret_t vapi_res; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_hca_ids); - CL_ASSERT(p_num_guids); - - /* first call is just to get the number */ - vapi_res = EVAPI_list_hcas(0, p_num_guids, NULL); - - /* fail ? */ - if (vapi_res == VAPI_EINVAL_PARAM) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_get_ca_ids: ERR 3D08: : " - "Bad parameter in calling: EVAPI_list_hcas. (%d)\n", - vapi_res); - status = IB_ERROR; - goto Exit; - } - - /* NO HCA ? */ - if (*p_num_guids == 0) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_get_ca_ids: ERR 3D09: " - "No available channel adapters.\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - /* allocate and really call - user of this function needs to deallocate it */ - *p_hca_ids = - (VAPI_hca_id_t *) malloc(*p_num_guids * sizeof(VAPI_hca_id_t)); - - /* now call it really */ - vapi_res = EVAPI_list_hcas(*p_num_guids, p_num_guids, *p_hca_ids); - - /* too many ? */ - if (vapi_res == VAPI_EAGAIN) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_get_ca_ids: ERR 3D10: " - "More CA GUIDs than allocated array (%d).\n", - *p_num_guids); - status = IB_ERROR; - goto Exit; - } - - /* fail ? */ - if (vapi_res != VAPI_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_vendor_get_ca_ids: ERR 3D11: : " - "Bad parameter in calling: EVAPI_list_hcas.\n"); - status = IB_ERROR; - goto Exit; - } - - if (osm_log_is_active(p_vend->p_log, OSM_LOG_DEBUG)) { - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__osm_vendor_get_ca_ids: " - "Detected %u local channel adapters.\n", *p_num_guids); - } - - status = IB_SUCCESS; - -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -/********************************************************************** - * Initialize an Info Struct for the Given HCA by its Id - **********************************************************************/ -static ib_api_status_t -__osm_ca_info_init(IN osm_vendor_t * const p_vend, - IN VAPI_hca_id_t ca_id, OUT osm_ca_info_t * const p_ca_info) -{ - ib_api_status_t status = IB_ERROR; - VAPI_ret_t vapi_res; - VAPI_hca_hndl_t hca_hndl; - VAPI_hca_vendor_t hca_vendor; - VAPI_hca_cap_t hca_cap; - VAPI_hca_port_t hca_port; - uint8_t port_num; - IB_gid_t *p_port_gid; - uint16_t maxNumGids; - - OSM_LOG_ENTER(p_vend->p_log); - - /* get the HCA handle */ - vapi_res = EVAPI_get_hca_hndl(ca_id, &hca_hndl); - if (vapi_res != VAPI_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_ca_info_init: ERR 3D05: " - "Fail to get HCA handle (%u).\n", vapi_res); - goto Exit; - } - - if (osm_log_is_active(p_vend->p_log, OSM_LOG_DEBUG)) { - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__osm_ca_info_init: " "Querying CA %s.\n", ca_id); - } - - /* query and get the HCA capability */ - vapi_res = VAPI_query_hca_cap(hca_hndl, &hca_vendor, &hca_cap); - if (vapi_res != VAPI_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_ca_info_init: ERR 3D06: " - "Fail to get HCA Capabilities (%u).\n", vapi_res); - goto Exit; - } - - /* get the guid of the HCA */ - memcpy(&(p_ca_info->guid), hca_cap.node_guid, 8 * sizeof(u_int8_t)); - p_ca_info->attr_size = 1; - p_ca_info->p_attr = (ib_ca_attr_t *) malloc(sizeof(ib_ca_attr_t)); - memcpy(&(p_ca_info->p_attr->ca_guid), hca_cap.node_guid, - 8 * sizeof(u_int8_t)); - - /* now obtain the attributes of the ports */ - p_ca_info->p_attr->num_ports = hca_cap.phys_port_num; - p_ca_info->p_attr->p_port_attr = - (ib_port_attr_t *) malloc(hca_cap.phys_port_num * - sizeof(ib_port_attr_t)); - - for (port_num = 0; port_num < p_ca_info->p_attr->num_ports; port_num++) { - - /* query the port attributes */ - vapi_res = - VAPI_query_hca_port_prop(hca_hndl, port_num + 1, &hca_port); - if (vapi_res != VAPI_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_ca_info_init: ERR 3D07: " - "Fail to get HCA Port Attributes (%d).\n", - vapi_res); - goto Exit; - } - - /* first call to know the size of the gid table */ - vapi_res = - VAPI_query_hca_gid_tbl(hca_hndl, port_num + 1, 0, - &maxNumGids, NULL); - p_port_gid = (IB_gid_t *) malloc(maxNumGids * sizeof(IB_gid_t)); - - vapi_res = - VAPI_query_hca_gid_tbl(hca_hndl, port_num + 1, maxNumGids, - &maxNumGids, p_port_gid); - if (vapi_res != VAPI_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_ca_info_init: ERR 3D12: " - "Fail to get HCA Port GID (%d).\n", vapi_res); - goto Exit; - } - - __osm_vendor_gid_to_guid(p_port_gid[0], - (IB_gid_t *) & p_ca_info->p_attr-> - p_port_attr[port_num].port_guid); - p_ca_info->p_attr->p_port_attr[port_num].lid = hca_port.lid; - p_ca_info->p_attr->p_port_attr[port_num].link_state = - hca_port.state; - p_ca_info->p_attr->p_port_attr[port_num].sm_lid = - hca_port.sm_lid; - - free(p_port_gid); - } - - status = IB_SUCCESS; -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -void -osm_ca_info_destroy(IN osm_vendor_t * const p_vend, - IN osm_ca_info_t * const p_ca_info, IN uint8_t num_ca) -{ - osm_ca_info_t *p_ca; - uint8_t i; - - OSM_LOG_ENTER(p_vend->p_log); - - for (i = 0; i < num_ca; i++) { - p_ca = &p_ca_info[i]; - - if (NULL != p_ca->p_attr) { - if (0 != p_ca->p_attr->num_ports) { - free(p_ca->p_attr->p_port_attr); - } - - free(p_ca->p_attr); - } - } - - free(p_ca_info); - - OSM_LOG_EXIT(p_vend->p_log); -} - -/********************************************************************** - * Fill in the array of port_attr with all available ports on ALL the - * avilable CAs on this machine. - * ALSO - - * Update the vendor object list of ca_info structs - **********************************************************************/ -ib_api_status_t -osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend, - IN ib_port_attr_t * const p_attr_array, - IN uint32_t * const p_num_ports) -{ - ib_api_status_t status; - - uint32_t ca; - uint32_t ca_count = 0; - uint32_t port_count = 0; - uint8_t port_num; - uint32_t total_ports = 0; - VAPI_hca_id_t *p_ca_ids = NULL; - osm_ca_info_t *p_ca_infos = NULL; - uint32_t attr_array_sz = *p_num_ports; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vend); - - /* determine the number of CA's */ - status = __osm_vendor_get_ca_ids(p_vend, &p_ca_ids, &ca_count); - if (status != IB_SUCCESS) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_all_port_attr: ERR 3D13: " - "Fail to get CA Ids.\n"); - goto Exit; - } - - /* Allocate an array big enough to hold the ca info objects */ - p_ca_infos = malloc(ca_count * sizeof(osm_ca_info_t)); - if (p_ca_infos == NULL) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_all_port_attr: ERR 3D14: " - "Unable to allocate CA information array.\n"); - goto Exit; - } - - memset(p_ca_infos, 0, ca_count * sizeof(osm_ca_info_t)); - - /* - * For each CA, retrieve the CA info attributes - */ - for (ca = 0; ca < ca_count; ca++) { - status = - __osm_ca_info_init(p_vend, p_ca_ids[ca], &p_ca_infos[ca]); - if (status != IB_SUCCESS) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_all_port_attr: ERR 3D15: " - "Unable to initialize CA Info object (%s).\n", - ib_get_err_str(status)); - goto Exit; - } - total_ports += p_ca_infos[ca].p_attr->num_ports; - } - - *p_num_ports = total_ports; - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_get_all_port_attr: total ports:%u \n", total_ports); - - /* - * If the user supplied enough storage, return the port guids, - * otherwise, return the appropriate error. - */ - if (attr_array_sz >= total_ports) { - for (ca = 0; ca < ca_count; ca++) { - uint32_t num_ports; - - num_ports = p_ca_infos[ca].p_attr->num_ports; - - for (port_num = 0; port_num < num_ports; port_num++) { - p_attr_array[port_count] = - *__osm_ca_info_get_port_attr_ptr(&p_ca_infos - [ca], - port_num); - port_count++; - } - } - } else { - status = IB_INSUFFICIENT_MEMORY; - goto Exit; - } - - status = IB_SUCCESS; - -Exit: - if (p_ca_ids) - free(p_ca_ids); - - if (p_ca_infos) { - osm_ca_info_destroy(p_vend, p_ca_infos, ca_count); - } - - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -/********************************************************************** - * Given the vendor obj and a guid - * return the ca id and port number that have that guid - **********************************************************************/ - -ib_api_status_t -osm_vendor_get_guid_ca_and_port(IN osm_vendor_t * const p_vend, - IN ib_net64_t const guid, - OUT VAPI_hca_hndl_t * p_hca_hndl, - OUT VAPI_hca_id_t * p_hca_id, - OUT uint8_t * p_hca_idx, - OUT uint32_t * p_port_num) -{ - - ib_api_status_t status; - VAPI_hca_id_t *p_ca_ids = NULL; - VAPI_ret_t vapi_res; - VAPI_hca_hndl_t hca_hndl; - VAPI_hca_vendor_t hca_vendor; - VAPI_hca_cap_t hca_cap; - IB_gid_t *p_port_gid = NULL; - uint16_t maxNumGids; - ib_net64_t port_guid; - uint32_t ca, portIdx, ca_count; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vend); - - /* - * 1) Determine the number of CA's - * 2) Allocate an array big enough to hold the ca info objects. - * 3) Call again to retrieve the guids. - */ - status = __osm_vendor_get_ca_ids(p_vend, &p_ca_ids, &ca_count); - if (status != IB_SUCCESS) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_guid_ca_and_port: ERR 3D16: " - "Fail to get CA Ids.\n"); - goto Exit; - } - - /* - * For each CA, retrieve the CA info attributes - */ - for (ca = 0; ca < ca_count; ca++) { - /* get the HCA handle */ - vapi_res = EVAPI_get_hca_hndl(p_ca_ids[ca], &hca_hndl); - if (vapi_res != VAPI_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_guid_ca_and_port: ERR 3D17: " - "Fail to get HCA handle (%u).\n", vapi_res); - goto Exit; - } - - /* get the CA attributes - to know how many ports it has: */ - if (osm_log_is_active(p_vend->p_log, OSM_LOG_DEBUG)) { - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_get_guid_ca_and_port: " - "Querying CA %s.\n", p_ca_ids[ca]); - } - - /* query and get the HCA capability */ - vapi_res = VAPI_query_hca_cap(hca_hndl, &hca_vendor, &hca_cap); - if (vapi_res != VAPI_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_guid_ca_and_port: ERR 3D18: " - "Fail to get HCA Capabilities (%u).\n", - vapi_res); - goto Exit; - } - - /* go over all ports - to obtail their guids */ - for (portIdx = 0; portIdx < hca_cap.phys_port_num; portIdx++) { - vapi_res = - VAPI_query_hca_gid_tbl(hca_hndl, portIdx + 1, 0, - &maxNumGids, NULL); - p_port_gid = - (IB_gid_t *) malloc(maxNumGids * sizeof(IB_gid_t)); - - /* get the port guid */ - vapi_res = - VAPI_query_hca_gid_tbl(hca_hndl, portIdx + 1, - maxNumGids, &maxNumGids, - p_port_gid); - if (vapi_res != VAPI_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_guid_ca_and_port: ERR 3D19: " - "Fail to get HCA Port GID (%d).\n", - vapi_res); - goto Exit; - } - - /* convert to SF style */ - __osm_vendor_gid_to_guid(p_port_gid[0], - (VAPI_gid_t *) & port_guid); - - /* finally did we find it ? */ - if (port_guid == guid) { - *p_hca_hndl = hca_hndl; - memcpy(p_hca_id, p_ca_ids[ca], - sizeof(VAPI_hca_id_t)); - *p_hca_idx = ca; - *p_port_num = portIdx + 1; - status = IB_SUCCESS; - goto Exit; - } - - free(p_port_gid); - p_port_gid = NULL; - } /* ALL PORTS */ - } /* all HCAs */ - - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_guid_ca_and_port: ERR 3D20: " - "Fail to find HCA and Port for Port Guid 0x%" PRIx64 "\n", - cl_ntoh64(guid)); - status = IB_INVALID_GUID; - -Exit: - if (p_ca_ids != NULL) - free(p_ca_ids); - if (p_port_gid != NULL) - free(p_port_gid); - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -#endif diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_hca_sim.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_hca_sim.c deleted file mode 100644 index 91efafae..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_hca_sim.c +++ /dev/null @@ -1,862 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#if defined(OSM_VENDOR_INTF_SIM) -#undef IN -#undef OUT - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/****************************************************************************** -* -* Provides the functionality for selecting an HCA Port and Obtaining it's guid. -* This version is based on $IBMGTSIM_DIR/$IBMGTSIM_NODE file system. -* This is a mimic of the OpenIB gen1 file system -* -******************************************************************************/ - -char *__get_simulator_dir(void) -{ - static char *ibmgtSimDir = NULL; - static char *defaultIbmgtSimDir = "/tmp/ibmgtsim"; - static char *ibmgtSimNode = NULL; - static char dirName[1024]; - - /* we use the first pointer to know if we were here */ - if (ibmgtSimDir == NULL) { - /* obtain the simulator directory */ - ibmgtSimDir = getenv("IBMGTSIM_DIR"); - if (ibmgtSimDir == NULL) { - printf - ("-W- Environment variable: IBMGTSIM_DIR does not exist.\n"); - printf - (" Please create one used by the simulator.\n"); - printf(" Using /tmp/ibmgtsim as default.\n"); - ibmgtSimDir = defaultIbmgtSimDir; - } - - /* obtain the node name we simulate */ - ibmgtSimNode = getenv("IBMGTSIM_NODE"); - if (ibmgtSimNode == NULL) { - printf - ("-W- Environment variable: IBMGTSIM_NODE does not exist.\n"); - printf - (" This variable should be the name of the node you wish to simulate.\n"); - printf(" Using H-1 as default.\n"); - ibmgtSimNode = "H-1"; - } - sprintf(dirName, "%s/%s", ibmgtSimDir, ibmgtSimNode); - } - - return dirName; -} - -typedef struct _osm_ca_info { - ib_net64_t guid; - size_t attr_size; - ib_ca_attr_t *p_attr; - -} osm_ca_info_t; - -/********************************************************************** - * Returns a pointer to the port attribute of the specified port - * owned by this CA. - ************************************************************************/ -static ib_port_attr_t *__osm_ca_info_get_port_attr_ptr(IN const osm_ca_info_t * - const p_ca_info, - IN const uint8_t index) -{ - return (&p_ca_info->p_attr->p_port_attr[index]); -} - -/********************************************************************** - * Obtain the number of local CAs by scanning /proc/infiniband/core - **********************************************************************/ -int __hca_sim_get_num_cas(void) -{ - int num_cas = 0; - DIR *dp; - struct dirent *ep; - - dp = opendir(__get_simulator_dir()); - - if (dp != NULL) { - while ((ep = readdir(dp))) { - /* CAs are directories with the format ca[1-9][0-9]* */ - /* if ((ep->d_type == DT_DIR) && !strncmp(ep->d_name, "ca", 2)) */ - if (!strncmp(ep->d_name, "ca", 2)) { - num_cas++; - } - } - closedir(dp); - } else { - printf("__hca_sim_get_num_cas: ERROR : ail to open dir %s\n", - __get_simulator_dir()); - exit(1); - } - - if (!num_cas) - exit(1); - return num_cas; -} - -/* - name: InfiniHost0 - provider: tavor - node GUID: 0002:c900:0120:3470 - ports: 2 - vendor ID: 0x2c9 - device ID: 0x5a44 - HW revision: 0xa1 - FW revision: 0x300020080 -*/ -typedef struct _sim_ca_info { - char name[32]; - char provider[32]; - uint64_t guid; - uint8_t num_ports; - uint32_t vend_id; - uint16_t dev_id; - uint16_t rev_id; - uint64_t fw_rev; -} sim_ca_info_t; - -/********************************************************************** - * Parse the CA Info file available in ibmgtSimDir/caN/info - **********************************************************************/ -static ib_api_status_t -__parse_ca_info_file(IN osm_vendor_t * const p_vend, - IN uint32_t idx, OUT sim_ca_info_t * sim_ca_info) -{ - ib_api_status_t status = IB_ERROR; - int info_file; - char file_name[256]; - char file_buffer[3200]; - char *p_ch; - int g1, g2, g3, g4; - int num_ports; - uint32_t len; - - OSM_LOG_ENTER(p_vend->p_log); - - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__parse_ca_info_file: " "Querying CA %d.\n", idx); - - /* we use the proc file system so we must be able to open the info file .. */ - sprintf(file_name, "%s/ca%d/info", __get_simulator_dir(), idx); - info_file = open(file_name, O_RDONLY); - if (!info_file) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_ca_info_file: ERR 5105: " - "Fail to open HCA:%d info file:(%s).\n", idx, - file_name); - goto Exit; - } - - /* read in the file */ - len = read(info_file, file_buffer, 3200); - close(info_file); - file_buffer[len] = '\0'; - - /* - parse the file ... - name: InfiniHost0 - provider: tavor - node GUID: 0002:c900:0120:3470 - ports: 2 - vendor ID: 0x2c9 - device ID: 0x5a44 - HW revision: 0xa1 - FW revision: 0x300020080 - */ - if (!(p_ch = strstr(file_buffer, "name:"))) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_ca_info_file: ERR 5106: " - "Fail to obtain HCA name. In info file:(%s).\n", - file_buffer); - goto Exit; - } - if (sscanf(p_ch, "name: %s", sim_ca_info->name) != 1) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_ca_info_file: ERR 5107: " - "Fail to parse name in info file:(%s).\n", p_ch); - goto Exit; - } - - /* get the guid of the HCA */ - if (!(p_ch = strstr(file_buffer, "node GUID:"))) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_ca_info_file: ERR 5108: " - "Fail to obtain GUID in info file:(%s).\n", - file_buffer); - goto Exit; - } - if (sscanf(p_ch, "node GUID: %x:%x:%x:%x", &g1, &g2, &g3, &g4) != 4) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_ca_info_file: ERR 5109: " - "Fail to parse GUID in info file:(%s).\n", p_ch); - goto Exit; - } - sim_ca_info->guid = (uint64_t) g1 << 48 | (uint64_t) g1 << 32 - | (uint64_t) g1 << 16 | (uint64_t) g3; - - /* obtain number of ports */ - if (!(p_ch = strstr(file_buffer, "ports:"))) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_ca_info_file: ERR 5110: " - "Fail to obtain number of ports in info file:(%s).\n", - file_buffer); - goto Exit; - } - if (sscanf(p_ch, "ports: %d", &num_ports) != 1) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_ca_info_file: ERR 5111: " - "Fail to parse num ports in info file:(%s).\n", p_ch); - goto Exit; - } - sim_ca_info->num_ports = num_ports; - - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__parse_ca_info_file: " - "CA1 = name:%s guid:0x%016llx ports:%d\n", - sim_ca_info->name, sim_ca_info->guid, sim_ca_info->num_ports); - - status = IB_SUCCESS; -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return status; -} - -/* - state: ACTIVE - LID: 0x0001 - LMC: 0x0000 - SM LID: 0x0001 - SM SL: 0x0000 - Capabilities: IsSM - IsTrapSupported - IsAutomaticMigrationSupported - IsSLMappingSupported - IsLEDInfoSupported - IsSystemImageGUIDSupported - IsVendorClassSupported - IsCapabilityMaskNoticeSupported -*/ -typedef struct _sim_port_info { - uint8_t state; - uint16_t lid; - uint8_t lmc; - uint16_t sm_lid; - uint8_t sm_sl; -} sim_port_info_t; - -/********************************************************************** - * Parse the Port Info file available in ibmgtSimDir/caN/portM/info - * Port num is 1..N - **********************************************************************/ -static ib_api_status_t -__parse_port_info_file(IN osm_vendor_t * const p_vend, - IN uint32_t hca_idx, - IN uint8_t port_num, OUT sim_port_info_t * sim_port_info) -{ - ib_api_status_t status = IB_ERROR; - int info_file; - char file_name[256]; - char file_buffer[3200]; - char state[12]; - char *p_ch; - int lid, sm_lid, lmc, sm_sl; - uint32_t len; - - OSM_LOG_ENTER(p_vend->p_log); - - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__parse_port_info_file: " - "Parsing Proc File System Port Info CA %d Port %d.\n", hca_idx, - port_num); - - /* we use the proc file system so we must be able to open the info file .. */ - sprintf(file_name, "%s/ca%d/port%d/info", __get_simulator_dir(), - hca_idx, port_num); - info_file = open(file_name, O_RDONLY); - if (!info_file) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5112: " - "Fail to open HCA:%d Port:%d info file:(%s).\n", - hca_idx, port_num, file_name); - goto Exit; - } - - /* read in the file */ - len = read(info_file, file_buffer, 3200); - close(info_file); - file_buffer[len] = '\0'; - - /* - parse the file ... - state: ACTIVE - LID: 0x0001 - LMC: 0x0000 - SM LID: 0x0001 - SM SL: 0x0000 - ... - */ - if (!(p_ch = strstr(file_buffer, "state:"))) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5113: " - "Fail to obtain port state. In info file:(%s).\n", - file_buffer); - goto Exit; - } - if (sscanf(p_ch, "state: %s", state) != 1) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5114: " - "Fail to parse state from info file:(%s).\n", p_ch); - goto Exit; - } - - if (!strcmp(state, "ACTIVE")) - sim_port_info->state = IB_LINK_ACTIVE; - else if (!strcmp(state, "DOWN")) - sim_port_info->state = IB_LINK_DOWN; - else if (!strcmp(state, "INIT")) - sim_port_info->state = IB_LINK_INIT; - else if (!strcmp(state, "ARMED")) - sim_port_info->state = IB_LINK_ARMED; - else - sim_port_info->state = 0; - - /* get lid */ - if (!(p_ch = strstr(file_buffer, "LID:"))) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5115: " - "Fail to obtain port lid. In info file:(%s).\n", - file_buffer); - goto Exit; - } - if (sscanf(p_ch, "LID: %x", &lid) != 1) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5116: " - "Fail to parse lid from info file:(%s).\n", p_ch); - goto Exit; - } - sim_port_info->lid = lid; - /* get LMC */ - if (!(p_ch = strstr(file_buffer, "LMC:"))) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5117: " - "Fail to obtain port LMC. In info file:(%s).\n", - file_buffer); - goto Exit; - } - if (sscanf(p_ch, "LMC: %x", &lmc) != 1) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5118: " - "Fail to parse LMC from info file:(%s).\n", p_ch); - goto Exit; - } - sim_port_info->lmc = lmc; - - /* get SM LID */ - if (!(p_ch = strstr(file_buffer, "SM LID:"))) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5119: " - "Fail to obtain port SM LID. In info file:(%s).\n", - file_buffer); - goto Exit; - } - if (sscanf(p_ch, "SM LID: %x", &sm_lid) != 1) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5120: " - "Fail to parse SM LID from info file:(%s).\n", p_ch); - goto Exit; - } - sim_port_info->sm_lid = sm_lid; - - /* get SM LID */ - if (!(p_ch = strstr(file_buffer, "SM SL:"))) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5121: " - "Fail to obtain port SM SL. In info file:(%s).\n", - file_buffer); - goto Exit; - } - if (sscanf(p_ch, "SM SL: %x", &sm_sl) != 1) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__parse_port_info_file: ERR 5122: " - "Fail to parse SM SL from info file:(%s).\n", p_ch); - goto Exit; - } - sim_port_info->sm_sl = sm_sl; - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__parse_port_info_file: " - "Obtained Port:%d = state:%d, lid:0x%04X, lmc:%d, sm_lid:0x%04X, sm_sl:%d\n", - port_num, sim_port_info->state, sim_port_info->lid, - sim_port_info->lmc, sim_port_info->sm_lid, - sim_port_info->sm_sl); - - status = IB_SUCCESS; -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return status; -} - -/********************************************************************** - * Parse the port guid_tbl file to obtain the port guid. - * File format is: - * [ 0] fe80:0000:0000:0000:0002:c900:0120:3472 - **********************************************************************/ -static ib_api_status_t -__get_port_guid_from_port_gid_tbl(IN osm_vendor_t * const p_vend, - IN uint32_t hca_idx, - IN uint8_t port_num, OUT uint64_t * port_guid) -{ - ib_api_status_t status = IB_ERROR; - int info_file; - char file_name[256]; - char file_buffer[3200]; - char *p_ch; - int g[8]; - uint32_t len; - - OSM_LOG_ENTER(p_vend->p_log); - - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__get_port_guid_from_port_gid_tbl: " - "Parsing Proc File System Port Guid Table CA %d Port %d.\n", - hca_idx, port_num); - - /* we use the proc file system so we must be able to open the info file .. */ - sprintf(file_name, "%s/ca%d/port%d/gid_table", - __get_simulator_dir(), hca_idx, port_num); - info_file = open(file_name, O_RDONLY); - if (!info_file) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__get_port_guid_from_port_gid_tbl: ERR 5123: " - "Fail to open HCA:%d Port:%d gid_table file:(%s).\n", - hca_idx, port_num, file_name); - goto Exit; - } - - /* read in the file */ - len = read(info_file, file_buffer, 3200); - close(info_file); - file_buffer[len] = '\0'; - - /* - parse the file ... - [ 0] fe80:0000:0000:0000:0002:c900:0120:3472 - ... - */ - if (!(p_ch = strstr(file_buffer, "[ 0]"))) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__get_port_guid_from_port_gid_tbl: ERR 5124: " - "Fail to obtain first gid index. In gid_table file:(%s).\n", - file_buffer); - goto Exit; - } - if (sscanf(p_ch + 6, "%x:%x:%x:%x:%x:%x:%x:%x", - &g[7], &g[6], &g[5], &g[4], &g[3], &g[2], &g[1], &g[0]) != 8) - { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__get_port_guid_from_port_gid_tbl: ERR 5125: " - "Fail to parse gid from gid_table file:(%s).\n", p_ch); - goto Exit; - } - - *port_guid = - (uint64_t) g[3] << 48 | (uint64_t) g[2] << 32 | (uint64_t) g[1] << - 16 | g[0]; - status = IB_SUCCESS; -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return status; -} - -/********************************************************************** - * Initialize an Info Struct for the Given HCA by its index 1..N - **********************************************************************/ -static ib_api_status_t -__osm_ca_info_init(IN osm_vendor_t * const p_vend, - IN uint32_t const idx, OUT osm_ca_info_t * const p_ca_info) -{ - ib_api_status_t status = IB_ERROR; - uint8_t port_num; - uint64_t port_guid; - - sim_ca_info_t sim_ca_info; - - OSM_LOG_ENTER(p_vend->p_log); - - /* parse the CA info file */ - if (__parse_ca_info_file(p_vend, idx, &sim_ca_info) != IB_SUCCESS) - goto Exit; - - p_ca_info->guid = cl_hton64(sim_ca_info.guid); - - /* set size of attributes and allocate them */ - p_ca_info->attr_size = 1; - p_ca_info->p_attr = (ib_ca_attr_t *) malloc(sizeof(ib_ca_attr_t)); - - p_ca_info->p_attr->ca_guid = p_ca_info->guid; - p_ca_info->p_attr->num_ports = sim_ca_info.num_ports; - - /* now obtain the attributes of the ports */ - p_ca_info->p_attr->p_port_attr = - (ib_port_attr_t *) malloc(sim_ca_info.num_ports * - sizeof(ib_port_attr_t)); - - /* get all the ports info */ - for (port_num = 1; port_num <= sim_ca_info.num_ports; port_num++) { - sim_port_info_t sim_port_info; - /* query the port attributes */ - if (__parse_port_info_file - (p_vend, idx, port_num, &sim_port_info)) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_ca_info_init: ERR 5126: " - "Fail to get HCA:%d Port:%d Attributes.\n", idx, - port_num); - goto Exit; - } - - /* HACK: the lids should have been converted to network but the rest of the code - is wrong and provdes them as is (host order) - so we stick with it. */ - p_ca_info->p_attr->p_port_attr[port_num - 1].lid = - sim_port_info.lid; - p_ca_info->p_attr->p_port_attr[port_num - 1].link_state = - sim_port_info.state; - p_ca_info->p_attr->p_port_attr[port_num - 1].sm_lid = - sim_port_info.sm_lid; - - /* get the port guid */ - if (__get_port_guid_from_port_gid_tbl - (p_vend, idx, port_num, &port_guid)) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osm_ca_info_init: ERR 5127: " - "Fail to get HCA:%d Port:%d Guid.\n", idx, - port_num); - goto Exit; - } - p_ca_info->p_attr->p_port_attr[port_num - 1].port_guid = - cl_hton64(port_guid); - } - - status = IB_SUCCESS; -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -void -osm_ca_info_destroy(IN osm_vendor_t * const p_vend, - IN osm_ca_info_t * const p_ca_info, IN uint8_t num_ca) -{ - osm_ca_info_t *p_ca; - uint8_t i; - - OSM_LOG_ENTER(p_vend->p_log); - - for (i = 0; i < num_ca; i++) { - p_ca = &p_ca_info[i]; - - if (NULL != p_ca->p_attr) { - if (0 != p_ca->p_attr->num_ports) { - free(p_ca->p_attr->p_port_attr); - } - - free(p_ca->p_attr); - } - } - - free(p_ca_info); - - OSM_LOG_EXIT(p_vend->p_log); -} - -/********************************************************************** - * Fill in the array of port_attr with all available ports on ALL the - * avilable CAs on this machine. - **********************************************************************/ -ib_api_status_t -osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend, - IN ib_port_attr_t * const p_attr_array, - IN uint32_t * const p_num_ports) -{ - ib_api_status_t status = IB_SUCCESS; - - uint32_t caIdx; - uint32_t ca_count = 0; - uint32_t port_count = 0; - uint8_t port_num; - uint32_t total_ports = 0; - osm_ca_info_t *p_ca_infos = NULL; - uint32_t attr_array_sz = *p_num_ports; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vend); - - /* determine the number of CA's */ - ca_count = __hca_sim_get_num_cas(); - if (!ca_count) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_all_port_attr: ERR 5128: " - "Fail to get Any CA Ids.\n"); - goto Exit; - } - - /* Allocate an array big enough to hold the ca info objects */ - p_ca_infos = malloc(ca_count * sizeof(osm_ca_info_t)); - if (p_ca_infos == NULL) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_all_port_attr: ERR 5129: " - "Unable to allocate CA information array.\n"); - goto Exit; - } - - memset(p_ca_infos, 0, ca_count * sizeof(osm_ca_info_t)); - - /* - * For each CA, retrieve the CA info attributes - */ - for (caIdx = 1; caIdx <= ca_count; caIdx++) { - status = - __osm_ca_info_init(p_vend, caIdx, &p_ca_infos[caIdx - 1]); - if (status != IB_SUCCESS) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_all_port_attr: ERR 5130: " - "Unable to initialize CA Info object (%s).\n", - ib_get_err_str(status)); - goto Exit; - } - total_ports += p_ca_infos[caIdx - 1].p_attr->num_ports; - } - - *p_num_ports = total_ports; - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_get_all_port_attr: total ports:%u \n", total_ports); - - /* - * If the user supplied enough storage, return the port guids, - * otherwise, return the appropriate error. - */ - if (attr_array_sz >= total_ports) { - for (caIdx = 1; caIdx <= ca_count; caIdx++) { - uint32_t num_ports; - - num_ports = p_ca_infos[caIdx - 1].p_attr->num_ports; - - for (port_num = 0; port_num < num_ports; port_num++) { - p_attr_array[port_count] = - *__osm_ca_info_get_port_attr_ptr(&p_ca_infos - [caIdx - - 1], - port_num); - port_count++; - } - } - } else { - status = IB_INSUFFICIENT_MEMORY; - goto Exit; - } - - status = IB_SUCCESS; - -Exit: - if (p_ca_infos) { - osm_ca_info_destroy(p_vend, p_ca_infos, ca_count); - } - - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -/********************************************************************** - * Given the vendor obj and a port guid - * return the ca id and port number that have that guid - **********************************************************************/ - -ib_api_status_t -osm_vendor_get_guid_ca_and_port(IN osm_vendor_t * const p_vend, - IN ib_net64_t const guid, - OUT uint32_t * p_hca_hndl, - OUT char *p_hca_id, - OUT uint8_t * p_hca_idx, - OUT uint32_t * p_port_num) -{ - uint32_t caIdx; - uint32_t ca_count = 0; - uint8_t port_num; - ib_api_status_t status = IB_ERROR; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vend); - - /* determine the number of CA's */ - ca_count = __hca_sim_get_num_cas(); - if (!ca_count) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_guid_ca_and_port: ERR 5131: " - "Fail to get Any CA Ids.\n"); - goto Exit; - } - - /* - * For each CA, retrieve the CA info attributes - */ - for (caIdx = 1; caIdx <= ca_count; caIdx++) { - sim_ca_info_t sim_ca_info; - if (__parse_ca_info_file(p_vend, caIdx, &sim_ca_info) == - IB_SUCCESS) { - /* get all the ports info */ - for (port_num = 1; port_num <= sim_ca_info.num_ports; - port_num++) { - uint64_t port_guid; - if (!__get_port_guid_from_port_gid_tbl - (p_vend, caIdx, port_num, &port_guid)) { - if (cl_hton64(port_guid) == guid) { - osm_log(p_vend->p_log, - OSM_LOG_DEBUG, - "osm_vendor_get_guid_ca_and_port: " - "Found Matching guid on HCA:%d Port:%d.\n", - caIdx, port_num); - strcpy(p_hca_id, - sim_ca_info.name); - *p_port_num = port_num; - *p_hca_idx = caIdx - 1; - *p_hca_hndl = 0; - status = IB_SUCCESS; - goto Exit; - } - } - } - } - } - - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_guid_ca_and_port: ERR 5132: " - "Fail to find HCA and Port for Port Guid 0x%" PRIx64 "\n", - cl_ntoh64(guid)); - status = IB_INVALID_GUID; - -Exit: - - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -/********************************************************************** - * Given the vendor obj HCA ID and Port Num - * update the given port guid if found. Return 0 on success. - **********************************************************************/ - -ib_api_status_t -osm_vendor_get_guid_by_ca_and_port(IN osm_vendor_t * const p_vend, - IN char *hca_id, - IN uint32_t port_num, - OUT uint64_t * p_port_guid) -{ - uint32_t caIdx; - uint32_t ca_count = 0; - ib_api_status_t status = IB_ERROR; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_vend); - - /* determine the number of CA's */ - ca_count = __hca_sim_get_num_cas(); - if (!ca_count) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_guid_by_ca_and_port: ERR 5133: " - "Fail to get Any CA Ids.\n"); - goto Exit; - } - - /* - * For each CA, retrieve the CA info attributes - */ - for (caIdx = 1; caIdx <= ca_count; caIdx++) { - sim_ca_info_t sim_ca_info; - if (__parse_ca_info_file(p_vend, caIdx, &sim_ca_info) == - IB_SUCCESS) { - /* if not identical by id - go to next one */ - if (strcmp(sim_ca_info.name, hca_id)) - continue; - - if ((port_num < 1) - || (port_num > sim_ca_info.num_ports)) { - return 1; - } - - if (!__get_port_guid_from_port_gid_tbl - (p_vend, caIdx, port_num, p_port_guid)) { - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osm_vendor_get_guid_by_ca_and_port: " - "Found Matching guid on HCA:%d Port:%d.\n", - caIdx, port_num); - status = IB_SUCCESS; - goto Exit; - } - } - } - - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_get_guid_by_ca_and_port: ERR 5134: " - "Fail to find HCA:%s\n", hca_id); - status = IB_INVALID_GUID; - -Exit: - - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -#endif diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_ibmgt.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_ibmgt.c deleted file mode 100644 index d54296f9..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_ibmgt.c +++ /dev/null @@ -1,783 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* AUTHOR Edward Bortnikov - * - * DESCRIPTION - * The lower-level MAD transport interface implementation - * that allows sending a single MAD/receiving a callback - * when a single MAD is received. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include - -typedef struct _osmv_IBMGT_transport_mgr_ { - IB_MGT_mad_type_t mad_type; - uint8_t mgmt_class; /* for gsi */ - /* for communication between send call back and send mad */ - boolean_t is_send_ok; - cl_event_t send_done; -} osmv_IBMGT_transport_mgr_t; - -typedef struct _osmv_IBMGT_transport_info_ { - IB_MGT_mad_hndl_t smi_h; - cl_qlist_t *p_smi_list; - - IB_MGT_mad_hndl_t gsi_h; - /* holds bind object list for every binded mgmt class */ - cl_qlist_t *gsi_mgmt_lists[15]; -} osmv_IBMGT_transport_info_t; - -static void -__osmv_IBMGT_rcv_desc_to_osm_addr(IN IB_MGT_mad_rcv_desc_t * p_rcv_desc, - IN uint8_t is_smi, - OUT osm_mad_addr_t * p_mad_addr); - -static void -__osmv_IBMGT_osm_addr_to_ibmgt_addr(IN const osm_mad_addr_t * p_mad_addr, - IN uint8_t is_smi, OUT IB_ud_av_t * p_av); - -void -__osmv_IBMGT_send_cb(IN IB_MGT_mad_hndl_t mad_hndl, - IN u_int64_t wrid, - IN IB_comp_status_t status, IN void *private_ctx_p); - -void -__osmv_IBMGT_rcv_cb(IN IB_MGT_mad_hndl_t mad_hndl, - IN void *private_ctx_p, - IN void *payload_p, - IN IB_MGT_mad_rcv_desc_t * rcv_remote_info_p); - -/* - * NAME - * osmv_transport_init - * - * DESCRIPTION - * Setup the MAD transport infrastructure (filters, callbacks etc). - */ - -ib_api_status_t -osmv_transport_init(IN osm_bind_info_t * p_info, - IN char hca_id[VENDOR_HCA_MAXNAMES], - IN uint8_t hca_idx, IN osmv_bind_obj_t * p_bo) -{ - ib_api_status_t st = IB_SUCCESS; - IB_MGT_ret_t ret; - IB_MGT_mad_type_t mad_type; - osmv_IBMGT_transport_mgr_t *p_mgr; - osmv_IBMGT_transport_info_t *p_tpot_info; - cl_list_obj_t *p_obj = NULL; - osm_log_t *p_log = p_bo->p_vendor->p_log; - int i; - - UNUSED_PARAM(hca_idx); - - /* if first bind, allocate tranport_info at vendor */ - if (NULL == p_bo->p_vendor->p_transport_info) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osmv_transport_init: first bind() for the vendor\n"); - p_bo->p_vendor->p_transport_info - = (osmv_IBMGT_transport_info_t *) - malloc(sizeof(osmv_IBMGT_transport_info_t)); - if (NULL == p_bo->p_vendor->p_transport_info) { - return IB_INSUFFICIENT_MEMORY; - } - memset(p_bo->p_vendor->p_transport_info, 0, - sizeof(osmv_IBMGT_transport_info_t)); - p_tpot_info = - (osmv_IBMGT_transport_info_t *) (p_bo->p_vendor-> - p_transport_info); - - p_tpot_info->smi_h = 0xffffffff; - p_tpot_info->p_smi_list = NULL; - - p_tpot_info->gsi_h = 0xffffffff; - for (i = 0; i < 15; i++) { - - p_tpot_info->gsi_mgmt_lists[i] = NULL; - } - - } else { - - p_tpot_info = - (osmv_IBMGT_transport_info_t *) (p_bo->p_vendor-> - p_transport_info); - } - - /* Initialize the magic_ptr to the pointer of the p_bo info. - This will be used to signal when the object is being destroyed, so no - real action will be done then. */ - p_bo->magic_ptr = p_bo; - - /* allocate transport mgr */ - p_mgr = malloc(sizeof(osmv_IBMGT_transport_mgr_t)); - if (NULL == p_mgr) { - free(p_tpot_info); - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_transport_init: ERR 7201: " "alloc failed \n"); - return IB_INSUFFICIENT_MEMORY; - } - - memset(p_mgr, 0, sizeof(osmv_IBMGT_transport_mgr_t)); - - p_bo->p_transp_mgr = p_mgr; - - switch (p_info->mad_class) { - case IB_MCLASS_SUBN_LID: - case IB_MCLASS_SUBN_DIR: - mad_type = IB_MGT_SMI; - break; - - case IB_MCLASS_SUBN_ADM: - default: - mad_type = IB_MGT_GSI; - break; - } - - /* we only support one class registration per SMI/GSI !!! */ - switch (mad_type) { - case IB_MGT_SMI: - /* we do not need to bind the handle if already available */ - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osmv_transport_init: SMI bind\n"); - - if (p_tpot_info->smi_h == 0xffffffff) { - ret = IB_MGT_get_handle(hca_id, - p_bo->port_num, - IB_MGT_SMI, - &(p_tpot_info->smi_h)); - if (IB_MGT_OK != ret) { - osm_log(p_log, OSM_LOG_ERROR, - "osmv_transport_init: ERR 7202: " - "IB_MGT_get_handle for smi failed \n"); - st = IB_ERROR; - free(p_mgr); - goto Exit; - } - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osmv_transport_init: got smi handle:%d \n", - p_tpot_info->smi_h); - - ret = IB_MGT_bind_sm(p_tpot_info->smi_h); - if (IB_MGT_OK != ret) { - osm_log(p_log, OSM_LOG_ERROR, - "osmv_transport_init: ERR 7203: " - "IB_MGT_bind_sm failed \n"); - st = IB_ERROR; - free(p_mgr); - goto Exit; - } - - /* init smi list */ - p_tpot_info->p_smi_list = malloc(sizeof(cl_qlist_t)); - if (NULL == p_tpot_info->p_smi_list) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_transport_init: ERR 7204: " - "alloc failed \n"); - IB_MGT_unbind_sm(p_tpot_info->smi_h); - IB_MGT_release_handle(p_tpot_info->smi_h); - free(p_mgr); - return IB_INSUFFICIENT_MEMORY; - } - memset(p_tpot_info->p_smi_list, 0, sizeof(cl_qlist_t)); - cl_qlist_init(p_tpot_info->p_smi_list); - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osmv_transport_init: before reg_cb\n"); - ret = IB_MGT_reg_cb(p_tpot_info->smi_h, - &__osmv_IBMGT_rcv_cb, - p_bo, - &__osmv_IBMGT_send_cb, - p_tpot_info->p_smi_list, - IB_MGT_RCV_CB_MASK | - IB_MGT_SEND_CB_MASK); - if (ret != IB_SUCCESS) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_transport_init: ERR 7205: " - "reg_cb failed with return code:%x \n", - ret); - IB_MGT_unbind_sm(p_tpot_info->smi_h); - IB_MGT_release_handle(p_tpot_info->smi_h); - free(p_tpot_info->p_smi_list); - free(p_mgr); - st = IB_ERROR; - goto Exit; - } - - } - /* insert to list of smi's - for raising callbacks later on */ - p_obj = malloc(sizeof(cl_list_obj_t)); - if (p_obj) - memset(p_obj, 0, sizeof(cl_list_obj_t)); - cl_qlist_set_obj(p_obj, p_bo); - cl_qlist_insert_tail(p_tpot_info->p_smi_list, - &p_obj->list_item); - - break; - - case IB_MGT_GSI: - /* we do not need to bind the handle if already available */ - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osmv_transport_init: ERR 7206: GSI bind\n"); - if (p_tpot_info->gsi_h == 0xffffffff) { - ret = IB_MGT_get_handle(hca_id, - p_bo->port_num, - IB_MGT_GSI, - &(p_tpot_info->gsi_h)); - if (IB_MGT_OK != ret) { - osm_log(p_log, OSM_LOG_ERROR, - "osmv_transport_init: ERR 7207: " - "IB_MGT_get_handle for gsi failed \n"); - st = IB_ERROR; - free(p_mgr); - goto Exit; - } - } - - /* this mgmt class was not binded yet */ - if (p_tpot_info->gsi_mgmt_lists[p_info->mad_class] == NULL) { - ret = - IB_MGT_bind_gsi_class(p_tpot_info->gsi_h, - p_info->mad_class); - if (IB_MGT_OK != ret) { - osm_log(p_log, OSM_LOG_ERROR, - "osmv_transport_init: ERR 7208: " - "IB_MGT_bind_gsi_class failed \n"); - st = IB_ERROR; - free(p_mgr); - goto Exit; - } - - p_tpot_info->gsi_mgmt_lists[p_info->mad_class] = - malloc(sizeof(cl_qlist_t)); - if (NULL == - p_tpot_info->gsi_mgmt_lists[p_info->mad_class]) { - IB_MGT_unbind_gsi_class(p_tpot_info->gsi_h, - p_info->mad_class); - free(p_mgr); - return IB_INSUFFICIENT_MEMORY; - } - memset(p_tpot_info->gsi_mgmt_lists[p_info->mad_class], - 0, sizeof(cl_qlist_t)); - cl_qlist_init(p_tpot_info-> - gsi_mgmt_lists[p_info->mad_class]); - } - /* insert to list of smi's - for raising callbacks later on */ - p_obj = malloc(sizeof(cl_list_obj_t)); - if (p_obj) - memset(p_obj, 0, sizeof(cl_list_obj_t)); - cl_qlist_set_obj(p_obj, p_bo); - cl_qlist_insert_tail(p_tpot_info-> - gsi_mgmt_lists[p_info->mad_class], - &p_obj->list_item); - - p_mgr->mgmt_class = p_info->mad_class; - ret = IB_MGT_reg_cb(p_tpot_info->gsi_h, - &__osmv_IBMGT_rcv_cb, - p_bo, - &__osmv_IBMGT_send_cb, - p_bo, - IB_MGT_RCV_CB_MASK | IB_MGT_SEND_CB_MASK); - - if (ret != IB_SUCCESS) { - IB_MGT_unbind_gsi_class(p_tpot_info->gsi_h, - p_mgr->mgmt_class); - free(p_tpot_info->gsi_mgmt_lists[p_mgr->mgmt_class]); - free(p_mgr); - st = IB_ERROR; - goto Exit; - } - - break; - - default: - osm_log(p_log, OSM_LOG_ERROR, - "osmv_transport_init: ERR 7209: unrecognized mgmt class \n"); - st = IB_ERROR; - free(p_mgr); - goto Exit; - } - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osmv_transport_init: GSI bind\n"); - cl_event_construct(&p_mgr->send_done); - cl_event_init(&p_mgr->send_done, TRUE); - p_mgr->is_send_ok = FALSE; - p_mgr->mad_type = mad_type; - -Exit: - /* OSM_LOG_EXIT(p_log ); */ - return (ib_api_status_t) st; -} - -/* - * NAME - * osmv_transport_send_mad - * - * DESCRIPTION - * Send a single MAD (256 byte) - */ - -ib_api_status_t -osmv_transport_mad_send(IN const osm_bind_handle_t h_bind, - IN void *p_ib_mad, IN const osm_mad_addr_t * p_mad_addr) -{ - - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osmv_IBMGT_transport_info_t *p_tpot_info = - (osmv_IBMGT_transport_info_t *) (p_bo->p_vendor->p_transport_info); - osm_vendor_t const *p_vend = p_bo->p_vendor; - ib_api_status_t status; - IB_ud_av_t av; - IB_MGT_ret_t ret; - ib_mad_t *p_mad = p_ib_mad; - - OSM_LOG_ENTER(p_vend->p_log); - - CL_ASSERT(p_bo->p_vendor->p_transport_info); - - /* - * For all sends other than directed route SM MADs, - * acquire an address vector for the destination. - */ - if (p_mad->mgmt_class != IB_MCLASS_SUBN_DIR) { - __osmv_IBMGT_osm_addr_to_ibmgt_addr(p_mad_addr, - p_mad->mgmt_class == - IB_MCLASS_SUBN_LID, &av); - } else { - /* is a directed route - we need to construct a permissive address */ - memset(&av, 0, sizeof(av)); - /* we do not need port number since it is part of the mad_hndl */ - av.dlid = IB_LID_PERMISSIVE; - } - - /* send it */ - if ((p_mad->mgmt_class == IB_MCLASS_SUBN_DIR) || - (p_mad->mgmt_class == IB_MCLASS_SUBN_LID)) { - - /* SMI CASE */ - if (osm_log_is_active(p_vend->p_log, OSM_LOG_DEBUG)) { - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osmv_transport_mad_send: " - "av.dlid:0x%X, " - "av.static_rate:%d, " - "av.path_bits:%d.\n", - cl_ntoh16(av.dlid), av.static_rate, - av.src_path_bits); - } - - ret = IB_MGT_send_mad(p_tpot_info->smi_h, p_mad, /* actual payload */ - &av, /* address vector */ - (u_int64_t) CAST_P2LONG(p_bo), - IB_MGT_DEFAULT_SEND_TIME); - } else { - /* GSI CASE - Support Remote QP */ - if (osm_log_is_active(p_vend->p_log, OSM_LOG_DEBUG)) { - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "osmv_transport_mad_send: " - "av.dlid:0x%X, av.static_rate:%d, av.path_bits:%d, remote qp:%d \n", - cl_ntoh16(av.dlid), av.static_rate, - av.src_path_bits, - cl_ntoh32(p_mad_addr->addr_type.gsi.remote_qp) - ); - } - - ret = IB_MGT_send_mad_to_qp(p_tpot_info->gsi_h, p_mad, /* actual payload */ - &av, /* address vector */ - (u_int64_t) CAST_P2LONG(p_bo), - IB_MGT_DEFAULT_SEND_TIME, - cl_ntoh32(p_mad_addr->addr_type.gsi. - remote_qp)); - - } - - status = IB_SUCCESS; - if (ret != IB_MGT_OK) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osmv_transport_mad_send: ERR 7210: " - "Error sending mad (%d).\n", ret); - status = IB_ERROR; - } else { - osmv_IBMGT_transport_mgr_t *p_mgr = - (osmv_IBMGT_transport_mgr_t *) (p_bo->p_transp_mgr); - - /* Let the others work when I am sleeping ... */ - osmv_txn_unlock(p_bo); - - cl_event_wait_on(&(p_mgr->send_done), 0xffffffff, TRUE); - - /* Re-acquire the lock */ - osmv_txn_lock(p_bo); - - if (TRUE == p_bo->is_closing) { - - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osmv_transport_mad_send: ERR 7211: " - "The handle %p is being unbound, cannot send.\n", - h_bind); - status = IB_ERROR; - } - - if (p_mgr->is_send_ok == FALSE) { - status = IB_ERROR; - } - } - - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -void osmv_transport_done(IN const osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_log_t *p_log = p_bo->p_vendor->p_log; - osmv_IBMGT_transport_mgr_t *p_mgr; - osmv_IBMGT_transport_info_t *p_tpot_info; - IB_MGT_ret_t ret; - cl_list_obj_t *p_obj = NULL; - cl_list_item_t *p_item, *p_item_tmp; - int i; - cl_qlist_t *p_list = NULL; - - OSM_LOG_ENTER(p_log); - - CL_ASSERT(p_bo); - - /* First of all - zero out the magic_ptr, so if a callback is called - - it'll know that we are currently closing down, and will not handle the - mad. */ - p_bo->magic_ptr = 0; - - p_mgr = (osmv_IBMGT_transport_mgr_t *) (p_bo->p_transp_mgr); - p_tpot_info = - (osmv_IBMGT_transport_info_t *) (p_bo->p_vendor->p_transport_info); - - switch (p_mgr->mad_type) { - case IB_MGT_SMI: - p_list = p_tpot_info->p_smi_list; - - /* remove from the bindings list */ - p_item = cl_qlist_head(p_list); - while (p_item != cl_qlist_end(p_list)) { - p_obj = PARENT_STRUCT(p_item, cl_list_obj_t, list_item); - if (cl_qlist_obj(p_obj) == h_bind) { - break; - } - p_item_tmp = cl_qlist_next(p_item); - p_item = p_item_tmp; - } - - CL_ASSERT(p_item != cl_qlist_end(p_list)); - cl_qlist_remove_item(p_list, p_item); - if (p_obj) - free(p_obj); - - /* no one is binded to smi anymore - we can free the list, unbind & realease the hndl */ - if (cl_is_qlist_empty(p_list) == TRUE) { - free(p_list); - p_list = NULL; - - ret = IB_MGT_unbind_sm(p_tpot_info->smi_h); - if (ret != IB_MGT_OK) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_transport_done: ERR 7212: " - "Failed to unbind sm\n"); - } - - ret = IB_MGT_release_handle(p_tpot_info->smi_h); - if (ret != IB_MGT_OK) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_transport_done: ERR 7213: " - "Failed to release smi handle\n"); - } - p_tpot_info->smi_h = 0xffffffff; - } - break; - - case IB_MGT_GSI: - p_list = p_tpot_info->gsi_mgmt_lists[p_mgr->mgmt_class]; - /* remove from the bindings list */ - p_item = cl_qlist_head(p_list); - while (p_item != cl_qlist_end(p_list)) { - p_obj = PARENT_STRUCT(p_item, cl_list_obj_t, list_item); - if (cl_qlist_obj(p_obj) == h_bind) { - break; - } - p_item_tmp = cl_qlist_next(p_item); - p_item = p_item_tmp; - } - - CL_ASSERT(p_item != cl_qlist_end(p_list)); - cl_qlist_remove_item(p_list, p_item); - if (p_obj) - free(p_obj); - - /* no one is binded to this class anymore - we can free the list and unbind this class */ - if (cl_is_qlist_empty(p_list) == TRUE) { - free(p_list); - p_list = NULL; - - ret = - IB_MGT_unbind_gsi_class(p_tpot_info->gsi_h, - p_mgr->mgmt_class); - if (ret != IB_MGT_OK) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_transport_done: ERR 7214: " - "Failed to unbind gsi class\n"); - } - } - - /* all the mgmt classes are unbinded - release gsi handle */ - for (i = 0; i < 15; i++) { - if (p_tpot_info->gsi_mgmt_lists[i] != NULL) { - break; - } - } - - if (i == 15) { - ret = IB_MGT_release_handle(p_tpot_info->gsi_h); - if (ret != IB_MGT_OK) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_transport_done: ERR 7215: " - "Failed to release gsi handle\n"); - } - p_tpot_info->gsi_h = 0xffffffff; - } - } /* end switch */ - - free(p_mgr); -} - -/********************************************************************** - * IB_MGT Receive callback : invoked after each receive - **********************************************************************/ -void -__osmv_IBMGT_rcv_cb(IN IB_MGT_mad_hndl_t mad_hndl, - IN void *private_ctx_p, - IN void *payload_p, - IN IB_MGT_mad_rcv_desc_t * rcv_remote_info_p) -{ - osmv_bind_obj_t *p_bo; - osm_mad_addr_t mad_addr; - cl_list_item_t *p_item; - cl_list_obj_t *p_obj; - cl_qlist_t *p_list; - ib_mad_t *p_mad = (ib_mad_t *) payload_p; - osm_vendor_t *p_vendor; - osmv_IBMGT_transport_info_t *p_tinfo; - - __osmv_IBMGT_rcv_desc_to_osm_addr(rcv_remote_info_p, - ((p_mad->mgmt_class == - IB_MCLASS_SUBN_LID) - || (p_mad->mgmt_class == - IB_MCLASS_SUBN_DIR)), &mad_addr); - - /* different handling of SMI and GSI */ - if ((p_mad->mgmt_class == IB_MCLASS_SUBN_DIR) || - (p_mad->mgmt_class == IB_MCLASS_SUBN_LID)) { - /* SMI CASE */ - p_bo = (osmv_bind_obj_t *) private_ctx_p; - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return; - - p_vendor = p_bo->p_vendor; - p_tinfo = - (osmv_IBMGT_transport_info_t *) p_vendor->p_transport_info; - p_list = p_tinfo->p_smi_list; - } else { - /* GSI CASE */ - p_bo = (osmv_bind_obj_t *) private_ctx_p; - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return; - - p_vendor = p_bo->p_vendor; - p_tinfo = - (osmv_IBMGT_transport_info_t *) p_vendor->p_transport_info; - p_list = p_tinfo->gsi_mgmt_lists[p_mad->mgmt_class]; - } - - /* go over the bindings list and send the mad, one of them will accept it, - the others will drope - */ - p_item = cl_qlist_head(p_list); - while (p_item != cl_qlist_end(p_list)) { - p_obj = PARENT_STRUCT(p_item, cl_list_obj_t, list_item); - p_bo = cl_qlist_obj(p_obj); - /* give upper layer the mad */ - osmv_dispatch_mad((osm_bind_handle_t) p_bo, payload_p, - &mad_addr); - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return; - - p_item = cl_qlist_next(p_item); - } -} - -/********************************************************************** - * IB_MGT Send callback : invoked after each send - **********************************************************************/ -void -__osmv_IBMGT_send_cb(IN IB_MGT_mad_hndl_t mad_hndl, - IN u_int64_t wrid, - IN IB_comp_status_t status, IN void *private_ctx_p) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) CAST_P2LONG(wrid); - - osmv_IBMGT_transport_mgr_t *p_mgr = - (osmv_IBMGT_transport_mgr_t *) p_bo->p_transp_mgr; - - /* Make sure the p_bo object is still relevant */ - if (p_bo->magic_ptr != p_bo) - return; - - /* we assume that each send on a bind object is synchronized, and no paralel sends - from diffrent threads with same object can be made */ - if (status == IB_COMP_SUCCESS) { - p_mgr->is_send_ok = TRUE; - } else - p_mgr->is_send_ok = FALSE; - cl_event_signal(&p_mgr->send_done); - -} - -/********************************************************************** - * IB_MGT to OSM ADDRESS VECTOR - **********************************************************************/ -static void -__osmv_IBMGT_rcv_desc_to_osm_addr(IN IB_MGT_mad_rcv_desc_t * p_rcv_desc, - IN uint8_t is_smi, - OUT osm_mad_addr_t * p_mad_addr) -{ - /* p_mad_addr->dest_lid = p_osm->subn.sm_base_lid; - for resp we use the dest lid ... */ - p_mad_addr->dest_lid = cl_hton16(p_rcv_desc->remote_lid); - p_mad_addr->static_rate = 0; /* HACK - we do not know the rate ! */ - p_mad_addr->path_bits = p_rcv_desc->local_path_bits; - /* Clear the grh any way to avoid unset fields */ - memset(&p_mad_addr->addr_type.gsi.grh_info, 0, - sizeof(p_mad_addr->addr_type.gsi.grh_info)); - - if (is_smi) { - /* SMI */ - p_mad_addr->addr_type.smi.source_lid = - cl_hton16(p_rcv_desc->remote_lid); - p_mad_addr->addr_type.smi.port_num = 99; /* HACK - if used - should fail */ - } else { - /* GSI */ - /* seems to me there is a IBMGT bug reversing the QPN ... */ - /* Does IBMGT supposed to provide the QPN is network or HOST ? */ - p_mad_addr->addr_type.gsi.remote_qp = cl_hton32(p_rcv_desc->qp); - - p_mad_addr->addr_type.gsi.remote_qkey = IB_QP1_WELL_KNOWN_Q_KEY; - /* we do have the p_mad_addr->pkey_ix but how to get the PKey by index ? */ - /* the only way seems to be to use VAPI_query_hca_pkey_tbl and obtain */ - /* the full PKey table - than go by the index. */ - /* since this does not seem reasonable to me I simply use the default */ - /* There is a TAVOR limitation that only one P_KEY is supported per */ - /* QP - so QP1 must use IB_DEFAULT_PKEY */ - p_mad_addr->addr_type.gsi.pkey_ix = 0; - p_mad_addr->addr_type.gsi.service_level = p_rcv_desc->sl; - - p_mad_addr->addr_type.gsi.global_route = p_rcv_desc->grh_flag; - /* copy the GRH data if relevant */ - if (p_mad_addr->addr_type.gsi.global_route) { - p_mad_addr->addr_type.gsi.grh_info.ver_class_flow = - ib_grh_set_ver_class_flow(p_rcv_desc->grh. - IP_version, - p_rcv_desc->grh. - traffic_class, - p_rcv_desc->grh. - flow_label); - p_mad_addr->addr_type.gsi.grh_info.hop_limit = - p_rcv_desc->grh.hop_limit; - memcpy(&p_mad_addr->addr_type.gsi.grh_info.src_gid.raw, - &p_rcv_desc->grh.sgid, sizeof(ib_net64_t)); - memcpy(&p_mad_addr->addr_type.gsi.grh_info.dest_gid.raw, - p_rcv_desc->grh.dgid, sizeof(ib_net64_t)); - } - } -} - -/********************************************************************** - * OSM ADDR VECTOR TO IB_MGT - **********************************************************************/ -void -__osmv_IBMGT_osm_addr_to_ibmgt_addr(IN const osm_mad_addr_t * p_mad_addr, - IN uint8_t is_smi, OUT IB_ud_av_t * p_av) -{ - - /* For global destination or Multicast address: */ - u_int8_t ver; - - memset(p_av, 0, sizeof(IB_ud_av_t)); - - p_av->src_path_bits = p_mad_addr->path_bits; - p_av->static_rate = p_mad_addr->static_rate; - p_av->dlid = cl_ntoh16(p_mad_addr->dest_lid); - - if (is_smi) { - p_av->sl = 0; /* Just to note we use 0 here. */ - } else { - p_av->sl = p_mad_addr->addr_type.gsi.service_level; - p_av->grh_flag = p_mad_addr->addr_type.gsi.global_route; - - if (p_mad_addr->addr_type.gsi.global_route) { - ib_grh_get_ver_class_flow(p_mad_addr->addr_type.gsi. - grh_info.ver_class_flow, &ver, - &p_av->traffic_class, - &p_av->flow_label); - p_av->hop_limit = - p_mad_addr->addr_type.gsi.grh_info.hop_limit; - p_av->sgid_index = 0; /* we always use source GID 0 */ - memcpy(&p_av->dgid, - &p_mad_addr->addr_type.gsi.grh_info.dest_gid.raw, - sizeof(ib_net64_t)); - - } - } -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_rmpp_ctx.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_rmpp_ctx.c deleted file mode 100644 index 6d2ddd31..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_rmpp_ctx.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include - -#include -#include - -ib_api_status_t -osmv_rmpp_send_ctx_init(osmv_rmpp_send_ctx_t * p_ctx, void *p_arbt_mad, - uint32_t mad_sz, osm_log_t * p_log) -{ - ib_api_status_t st = IB_SUCCESS; - cl_status_t cl_st; - - CL_ASSERT(p_ctx); - if (NULL == p_arbt_mad) { - return IB_INVALID_PARAMETER; - } - - if (osmv_mad_is_sa((ib_mad_t *) p_arbt_mad)) { - p_ctx->is_sa_mad = TRUE; - } else - p_ctx->is_sa_mad = FALSE; - - p_ctx->mad_sz = mad_sz; - - cl_event_construct(&p_ctx->event); - cl_st = cl_event_init(&p_ctx->event, FALSE); - if (cl_st != CL_SUCCESS) { - return IB_ERROR; - } - - st = osmv_rmpp_sar_init(&p_ctx->sar, p_arbt_mad, p_ctx->mad_sz, - p_ctx->is_sa_mad); - if (st == IB_SUCCESS) { - p_ctx->window_first = 1; - p_ctx->window_last = 1; - } - - p_ctx->p_log = p_log; - return st; -} - -void osmv_rmpp_send_ctx_done(IN osmv_rmpp_send_ctx_t * p_ctx) -{ - CL_ASSERT(p_ctx); - cl_event_destroy(&p_ctx->event); - osmv_rmpp_sar_done(&p_ctx->sar); - free(p_ctx); -} - -uint32_t osmv_rmpp_send_ctx_get_num_segs(IN osmv_rmpp_send_ctx_t * p_send_ctx) -{ - uint32_t data_len, data_sz, num; - - CL_ASSERT(p_send_ctx); - - if (p_send_ctx->is_sa_mad) { - data_len = p_send_ctx->mad_sz - IB_SA_MAD_HDR_SIZE; - data_sz = IB_SA_DATA_SIZE; - } else { - data_len = p_send_ctx->mad_sz - MAD_RMPP_HDR_SIZE; - data_sz = MAD_RMPP_DATA_SIZE; - } - - num = data_len / data_sz; - if (0 == data_len || (data_len % data_sz) > 0) { - num++; - } - - return num; -} - -ib_api_status_t -osmv_rmpp_send_ctx_get_seg(IN osmv_rmpp_send_ctx_t * p_send_ctx, - IN uint32_t seg_idx, - IN uint32_t resp_timeout, OUT void *p_buf) -{ - ib_api_status_t st = IB_SUCCESS; - uint32_t num_segs, paylen = 0; - ib_rmpp_mad_t *p_rmpp_mad; - - OSM_LOG_ENTER(p_send_ctx->p_log); - CL_ASSERT(p_send_ctx); - - st = osmv_rmpp_sar_get_mad_seg(&p_send_ctx->sar, seg_idx, p_buf); - if (st != IB_SUCCESS) { - goto Exit; - } - - p_rmpp_mad = (ib_rmpp_mad_t *) p_buf; - /* Set the relevant bits in the RMPP hdr */ - p_rmpp_mad->rmpp_status = IB_RMPP_STATUS_SUCCESS; - p_rmpp_mad->rmpp_flags |= IB_RMPP_FLAG_ACTIVE; - p_rmpp_mad->rmpp_flags |= resp_timeout << 3; - - num_segs = osmv_rmpp_send_ctx_get_num_segs(p_send_ctx); - - if (1 == seg_idx) { - p_rmpp_mad->rmpp_flags |= IB_RMPP_FLAG_FIRST; - - /* This is the first segment - - the reported paylen is the total amount of data. - */ - if (p_send_ctx->is_sa_mad) { - /* sa mad hdr sz */ - paylen = p_send_ctx->mad_sz - IB_SA_MAD_HDR_SIZE; - paylen += - num_segs * (IB_SA_MAD_HDR_SIZE - MAD_RMPP_HDR_SIZE); - } else { - /* mad hdr sz */ - paylen = p_send_ctx->mad_sz - MAD_RMPP_HDR_SIZE; - } - } - - if (seg_idx == num_segs) { - p_rmpp_mad->rmpp_flags |= IB_RMPP_FLAG_LAST; - - /* - This is the last segment - - the reported paylen is only the amount of data left on this segment. - */ - if (p_send_ctx->is_sa_mad) { - paylen = p_send_ctx->mad_sz - IB_SA_MAD_HDR_SIZE; - paylen -= (num_segs - 1) * IB_SA_DATA_SIZE; - paylen += (IB_SA_MAD_HDR_SIZE - MAD_RMPP_HDR_SIZE); - } else { - paylen = p_send_ctx->mad_sz - MAD_RMPP_HDR_SIZE; - paylen -= - (num_segs - 1) * (MAD_BLOCK_SIZE - - MAD_RMPP_HDR_SIZE); - } - } - - p_rmpp_mad->rmpp_type = IB_RMPP_TYPE_DATA; - p_rmpp_mad->rmpp_version = 1; - p_rmpp_mad->paylen_newwin = cl_ntoh32(paylen); - p_rmpp_mad->seg_num = cl_ntoh32(seg_idx); - -Exit: - OSM_LOG_EXIT(p_send_ctx->p_log); - return st; -} - -ib_api_status_t -osmv_rmpp_recv_ctx_init(osmv_rmpp_recv_ctx_t * p_ctx, osm_log_t * p_log) -{ - ib_api_status_t st = IB_SUCCESS; - - CL_ASSERT(p_ctx); - - p_ctx->is_sa_mad = FALSE; - - p_ctx->p_rbuf = malloc(sizeof(cl_qlist_t)); - if (p_ctx->p_rbuf) { - memset(p_ctx->p_rbuf, 0, sizeof(cl_qlist_t)); - cl_qlist_init(p_ctx->p_rbuf); - p_ctx->expected_seg = 1; - } else - st = IB_INSUFFICIENT_MEMORY; - - p_ctx->p_log = p_log; - - return st; -} - -void osmv_rmpp_recv_ctx_done(IN osmv_rmpp_recv_ctx_t * p_ctx) -{ - cl_list_item_t *p_list_item; - cl_list_obj_t *p_obj; - - CL_ASSERT(p_ctx); - - /* go over all the items in the list and remove them */ - p_list_item = cl_qlist_remove_head(p_ctx->p_rbuf); - while (p_list_item != cl_qlist_end(p_ctx->p_rbuf)) { - - p_obj = PARENT_STRUCT(p_list_item, cl_list_obj_t, list_item); - - free(cl_qlist_obj(p_obj)); - free(p_obj); - - p_list_item = cl_qlist_remove_head(p_ctx->p_rbuf); - } - - osmv_rmpp_sar_done(&p_ctx->sar); - - free(p_ctx->p_rbuf); - free(p_ctx); -} - -ib_api_status_t -osmv_rmpp_recv_ctx_store_mad_seg(IN osmv_rmpp_recv_ctx_t * p_recv_ctx, - IN void *p_mad) -{ - cl_list_obj_t *p_obj = NULL; - void *p_list_mad; - - OSM_LOG_ENTER(p_recv_ctx->p_log); - - CL_ASSERT(p_recv_ctx); - p_list_mad = malloc(MAD_BLOCK_SIZE); - if (NULL == p_list_mad) { - return IB_INSUFFICIENT_MEMORY; - } - memset(p_list_mad, 0, MAD_BLOCK_SIZE); - memcpy(p_list_mad, p_mad, MAD_BLOCK_SIZE); - - p_obj = malloc(sizeof(cl_list_obj_t)); - if (NULL == p_obj) { - free(p_list_mad); - return IB_INSUFFICIENT_MEMORY; - } - memset(p_obj, 0, sizeof(cl_list_obj_t)); - cl_qlist_set_obj(p_obj, p_list_mad); - - cl_qlist_insert_tail(p_recv_ctx->p_rbuf, &p_obj->list_item); - - if (osmv_mad_is_sa((ib_mad_t *) p_mad)) { - p_recv_ctx->is_sa_mad = TRUE; - } - - return IB_SUCCESS; - -} - -uint32_t -osmv_rmpp_recv_ctx_get_cur_byte_num(IN osmv_rmpp_recv_ctx_t * p_recv_ctx) -{ - uint32_t num_segs; - - num_segs = cl_qlist_count(p_recv_ctx->p_rbuf); - if (p_recv_ctx->is_sa_mad) - return ((num_segs * IB_SA_DATA_SIZE) + IB_SA_MAD_HDR_SIZE); - else - return ((num_segs * MAD_RMPP_DATA_SIZE) + MAD_RMPP_HDR_SIZE); -} - -uint32_t -osmv_rmpp_recv_ctx_get_byte_num_from_first(IN osmv_rmpp_recv_ctx_t * p_recv_ctx) -{ - cl_list_item_t *p_item; - cl_list_obj_t *p_obj; - void *p_list_mad; - uint32_t num_bytes, num_segs; - - p_item = cl_qlist_head(p_recv_ctx->p_rbuf); - p_obj = PARENT_STRUCT(p_item, cl_list_obj_t, list_item); - p_list_mad = cl_qlist_obj(p_obj); - - /* mad data sz */ - num_bytes = cl_ntoh32(((ib_rmpp_mad_t *) p_list_mad)->paylen_newwin); - if (0 != num_bytes) { - if (p_recv_ctx->is_sa_mad) { - /* sa mad hdr sz */ - num_segs = cl_qlist_count(p_recv_ctx->p_rbuf); - num_bytes -= - num_segs * (IB_SA_MAD_HDR_SIZE - MAD_RMPP_HDR_SIZE); - num_bytes += IB_SA_MAD_HDR_SIZE; - } else { - /* mad hdr sz */ - num_bytes += MAD_RMPP_HDR_SIZE; - } - } - - return num_bytes; -} - -uint32_t -osmv_rmpp_recv_ctx_get_byte_num_from_last(IN osmv_rmpp_recv_ctx_t * p_recv_ctx) -{ - cl_list_item_t *p_item; - cl_list_obj_t *p_obj; - void *p_list_mad; - uint32_t num_bytes, num_segs; - - p_item = cl_qlist_tail(p_recv_ctx->p_rbuf); - p_obj = PARENT_STRUCT(p_item, cl_list_obj_t, list_item); - p_list_mad = cl_qlist_obj(p_obj); - - /* mad data sz */ - num_segs = cl_qlist_count(p_recv_ctx->p_rbuf); - num_bytes = cl_ntoh32(((ib_rmpp_mad_t *) p_list_mad)->paylen_newwin); - - if (0 != num_bytes) { - if (p_recv_ctx->is_sa_mad) { - /* sa mad hdr sz */ - num_bytes += MAD_RMPP_HDR_SIZE; - num_bytes += (num_segs - 1) * IB_SA_DATA_SIZE; - } else { - /* mad hdr sz */ - num_bytes += MAD_RMPP_HDR_SIZE; - num_bytes += (num_segs - 1) * MAD_RMPP_DATA_SIZE; - } - } - - return num_bytes; -} - -/* assuming that the last rmpp pkt arrived so that data member: total_bytes has the right value */ -ib_api_status_t -osmv_rmpp_recv_ctx_reassemble_arbt_mad(IN osmv_rmpp_recv_ctx_t * p_recv_ctx, - IN uint32_t size, IN void *p_arbt_mad) -{ - ib_api_status_t st = IB_SUCCESS; - - CL_ASSERT(p_recv_ctx); - - st = osmv_rmpp_sar_init(&p_recv_ctx->sar, p_arbt_mad, size, - p_recv_ctx->is_sa_mad); - if (st != IB_SUCCESS) { - return st; - } - - st = osmv_rmpp_sar_reassemble_arbt_mad(&p_recv_ctx->sar, - p_recv_ctx->p_rbuf); - - osmv_rmpp_sar_done(&p_recv_ctx->sar); - - return st; -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_sa.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_sa.c deleted file mode 100644 index 461ad27e..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_sa.c +++ /dev/null @@ -1,874 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include - -/* this struct is the internal rep of the bind handle */ -typedef struct _osmv_sa_bind_info { - osm_bind_handle_t h_bind; - osm_log_t *p_log; - osm_vendor_t *p_vendor; - osm_mad_pool_t *p_mad_pool; - uint64_t port_guid; - cl_event_t sync_event; - uint64_t last_lids_update_sec; - uint16_t lid; - uint16_t sm_lid; -} osmv_sa_bind_info_t; - -/* - Call back on new mad received: - - We basically only need to set the context of the query. - Or report an error. - - A pointer to the actual context of the request (a copy of the oriignal - request structure) is attached as the p_madw->context.ni_context.node_guid -*/ -void -__osmv_sa_mad_rcv_cb(IN osm_madw_t * p_madw, - IN void *bind_context, IN osm_madw_t * p_req_madw) -{ - osmv_sa_bind_info_t *p_bind = (osmv_sa_bind_info_t *) bind_context; - osmv_query_req_t *p_query_req_copy = NULL; - osmv_query_res_t query_res; - ib_sa_mad_t *p_sa_mad; - ib_net16_t mad_status; - - OSM_LOG_ENTER(p_bind->p_log); - - if (!p_req_madw) { - osm_log(p_bind->p_log, OSM_LOG_DEBUG, - "__osmv_sa_mad_rcv_cb: " - "Ignoring a non-response mad\n"); - osm_mad_pool_put(p_bind->p_mad_pool, p_madw); - goto Exit; - } - - /* obtain the sent context */ - p_query_req_copy = - (osmv_query_req_t *) (p_req_madw->context.arb_context.context1); - - /* provide the context of the original request in the result */ - query_res.query_context = p_query_req_copy->query_context; - - /* provide the resulting madw */ - query_res.p_result_madw = p_madw; - - /* update the req fields */ - p_sa_mad = (ib_sa_mad_t *) p_madw->p_mad; - - /* if we got a remote error track it in the status */ - mad_status = (ib_net16_t) (p_sa_mad->status & IB_SMP_STATUS_MASK); - if (mad_status != IB_SUCCESS) { - osm_log(p_bind->p_log, OSM_LOG_ERROR, - "__osmv_sa_mad_rcv_cb: ERR 0501: " - "Remote error:0x%04X .\n", mad_status); - query_res.status = IB_REMOTE_ERROR; - } else { - query_res.status = IB_SUCCESS; - } - - /* what if we have got back an empty mad ? */ - if (!p_madw->mad_size) { - osm_log(p_bind->p_log, OSM_LOG_ERROR, - "__osmv_sa_mad_rcv_cb: ERR 0502: " - "Got an empty mad.\n"); - query_res.status = IB_ERROR; - } - - if (IB_SUCCESS == mad_status) { - - /* if we are in not in a method response of an rmpp nature we must get only 1 */ - /* HACK: in the future we might need to be smarter for other methods... */ - if (p_sa_mad->method != IB_MAD_METHOD_GETTABLE_RESP) { - query_res.result_cnt = 1; - } else { -#ifndef VENDOR_RMPP_SUPPORT - if (mad_status != IB_SUCCESS) - query_res.result_cnt = 0; - else - query_res.result_cnt = 1; -#else - /* we used the offset value to calculate the number of - records in here */ - if (ib_get_attr_size(p_sa_mad->attr_offset) == 0) { - query_res.result_cnt = 0; - osm_log(p_bind->p_log, OSM_LOG_DEBUG, - "__osmv_sa_mad_rcv_cb: Count = 0\n"); - } - else { - query_res.result_cnt = - (p_madw->mad_size - IB_SA_MAD_HDR_SIZE) / - ib_get_attr_size(p_sa_mad->attr_offset); - osm_log(p_bind->p_log, OSM_LOG_DEBUG, - "__osmv_sa_mad_rcv_cb: " - "Count = %u = %u / %u (%u)\n", - query_res.result_cnt, - p_madw->mad_size - IB_SA_MAD_HDR_SIZE, - ib_get_attr_size(p_sa_mad->attr_offset), - (p_madw->mad_size - IB_SA_MAD_HDR_SIZE) % - ib_get_attr_size(p_sa_mad->attr_offset)); - } -#endif - } - } - - query_res.query_type = p_query_req_copy->query_type; - - p_query_req_copy->pfn_query_cb(&query_res); - - if ((p_query_req_copy->flags & OSM_SA_FLAGS_SYNC) == OSM_SA_FLAGS_SYNC) - cl_event_signal(&p_bind->sync_event); - -Exit: - - /* free the copied query request if found */ - if (p_query_req_copy) - free(p_query_req_copy); - - /* put back the request madw */ - if (p_req_madw) - osm_mad_pool_put(p_bind->p_mad_pool, p_req_madw); - - OSM_LOG_EXIT(p_bind->p_log); -} - -/* - Send Error Callback: - - Only report the error and get rid of the mad wrapper -*/ -void __osmv_sa_mad_err_cb(IN void *bind_context, IN osm_madw_t * p_madw) -{ - osmv_sa_bind_info_t *p_bind = (osmv_sa_bind_info_t *) bind_context; - osmv_query_req_t *p_query_req_copy = NULL; - osmv_query_res_t query_res; - - OSM_LOG_ENTER(p_bind->p_log); - - /* Obtain the sent context etc */ - p_query_req_copy = - (osmv_query_req_t *) (p_madw->context.arb_context.context1); - - /* provide the context of the original request in the result */ - query_res.query_context = p_query_req_copy->query_context; - - query_res.p_result_madw = p_madw; - - query_res.status = IB_TIMEOUT; - query_res.result_cnt = 0; - query_res.p_result_madw->status = IB_TIMEOUT; - p_madw->status = IB_TIMEOUT; - query_res.query_type = p_query_req_copy->query_type; - - p_query_req_copy->pfn_query_cb(&query_res); - - if ((p_query_req_copy->flags & OSM_SA_FLAGS_SYNC) == OSM_SA_FLAGS_SYNC) - cl_event_signal(&p_bind->sync_event); - - if (p_query_req_copy) - free(p_query_req_copy); - OSM_LOG_EXIT(p_bind->p_log); -} - -/***************************************************************************** - This routine needs to be invoked on every send - since the SM LID and Local - lid might change. To do that without any major perfoermance impact we cache - the results and time they were obtained. Refresh only twice a minute. - To avoid the need to use statics and risk a race - we require the refresh time - to be stored in the context of the results. Also this coveres cases were - we query for multiple guids. - *****************************************************************************/ -ib_api_status_t -__osmv_get_lid_and_sm_lid_by_port_guid(IN osm_vendor_t * const p_vend, - IN ib_net64_t port_guid, - IN OUT uint64_t * p_lids_update_time_sec, - OUT uint16_t * lid, - OUT uint16_t * sm_lid) -{ - - ib_api_status_t status; - ib_port_attr_t *p_attr_array; - uint32_t num_ports; - uint32_t port_num; - - OSM_LOG_ENTER(p_vend->p_log); - - /* use prevous values if current time is close enough to previous query */ - if (cl_get_time_stamp_sec() <= *p_lids_update_time_sec + 30) { - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__osmv_get_lid_and_sm_lid_by_port_guid: " - "Using previously stored lid:0x%04x sm_lid:0x%04x\n", - *lid, *sm_lid); - status = IB_SUCCESS; - goto Exit; - } - - /* obtain the number of available ports */ - num_ports = 0; - status = osm_vendor_get_all_port_attr(p_vend, NULL, &num_ports); - if (status != IB_INSUFFICIENT_MEMORY) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osmv_get_lid_and_sm_lid_by_port_guid: ERR 0503: " - "expected to get the IB_INSUFFICIENT_MEMORY but got: %s\n", - ib_get_err_str(status) - ); - status = IB_ERROR; - goto Exit; - } - - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__osmv_get_lid_and_sm_lid_by_port_guid: " - "Found total of %u ports. Looking for guid:0x%016" PRIx64 "\n", - num_ports, cl_ntoh64(port_guid) - ); - - /* allocate the attributes */ - p_attr_array = - (ib_port_attr_t *) malloc(sizeof(ib_port_attr_t) * num_ports); - - /* obtain the attributes */ - status = osm_vendor_get_all_port_attr(p_vend, p_attr_array, &num_ports); - if (status != IB_SUCCESS) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "__osmv_get_lid_and_sm_lid_by_port_guid: ERR 0504: " - "Fail to get port attributes (error: %s)\n", - ib_get_err_str(status) - ); - free(p_attr_array); - goto Exit; - } - - status = IB_ERROR; - /* find the port requested in the list */ - for (port_num = 0; (port_num < num_ports) && (status == IB_ERROR); - port_num++) { - if (p_attr_array[port_num].port_guid == port_guid) { - *lid = p_attr_array[port_num].lid; - *sm_lid = p_attr_array[port_num].sm_lid; - *p_lids_update_time_sec = cl_get_time_stamp_sec(); - status = IB_SUCCESS; - osm_log(p_vend->p_log, OSM_LOG_DEBUG, - "__osmv_get_lid_and_sm_lid_by_port_guid: " - "Found guid:0x%016" PRIx64 " with idx:%d\n", - cl_ntoh64(port_guid), port_num); - } - } - - free(p_attr_array); - -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -osm_bind_handle_t -osmv_bind_sa(IN osm_vendor_t * const p_vend, - IN osm_mad_pool_t * const p_mad_pool, IN ib_net64_t port_guid) -{ - osm_bind_info_t bind_info; - osm_log_t *p_log = p_vend->p_log; - ib_api_status_t status = IB_SUCCESS; - osmv_sa_bind_info_t *p_sa_bind_info; - cl_status_t cl_status; - - OSM_LOG_ENTER(p_log); - - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_bind_sa: " - "Binding to port 0x%" PRIx64 ".\n", cl_ntoh64(port_guid)); - - bind_info.port_guid = port_guid; - bind_info.mad_class = IB_MCLASS_SUBN_ADM; - bind_info.class_version = 2; - bind_info.is_responder = TRUE; - bind_info.is_trap_processor = FALSE; - bind_info.is_report_processor = TRUE; - bind_info.send_q_size = OSM_SM_DEFAULT_QP1_RCV_SIZE; - bind_info.recv_q_size = OSM_SM_DEFAULT_QP1_SEND_SIZE; - bind_info.timeout = OSM_DEFAULT_TRANS_TIMEOUT_MILLISEC; - bind_info.retries = OSM_DEFAULT_RETRY_COUNT; - - /* allocate the new sa bind info */ - p_sa_bind_info = - (osmv_sa_bind_info_t *) malloc(sizeof(osmv_sa_bind_info_t)); - if (!p_sa_bind_info) { - osm_log(p_log, OSM_LOG_ERROR, - "osmv_bind_sa: ERR 0505: " - "Fail to allocate new bidn structure\n"); - p_sa_bind_info = OSM_BIND_INVALID_HANDLE; - goto Exit; - } - - /* store some important context */ - p_sa_bind_info->p_log = p_log; - p_sa_bind_info->port_guid = port_guid; - p_sa_bind_info->p_mad_pool = p_mad_pool; - p_sa_bind_info->p_vendor = p_vend; - p_sa_bind_info->last_lids_update_sec = 0; - - /* Bind to the lower level */ - p_sa_bind_info->h_bind = osm_vendor_bind(p_vend, &bind_info, p_mad_pool, __osmv_sa_mad_rcv_cb, __osmv_sa_mad_err_cb, p_sa_bind_info); /* context provided to CBs */ - - if (p_sa_bind_info->h_bind == OSM_BIND_INVALID_HANDLE) { - free(p_sa_bind_info); - p_sa_bind_info = OSM_BIND_INVALID_HANDLE; - osm_log(p_log, OSM_LOG_ERROR, - "osmv_bind_sa: ERR 0506: " - "Fail to bind to vendor SMI.\n"); - goto Exit; - } - - /* obtain the sm_lid from the vendor */ - status = - __osmv_get_lid_and_sm_lid_by_port_guid(p_vend, port_guid, - &p_sa_bind_info-> - last_lids_update_sec, - &p_sa_bind_info->lid, - &p_sa_bind_info->sm_lid); - if (status != IB_SUCCESS) { - free(p_sa_bind_info); - p_sa_bind_info = OSM_BIND_INVALID_HANDLE; - osm_log(p_log, OSM_LOG_ERROR, - "osmv_bind_sa: ERR 0507: " - "Fail to obtain the sm lid.\n"); - goto Exit; - } - - /* initialize the sync_event */ - cl_event_construct(&p_sa_bind_info->sync_event); - cl_status = cl_event_init(&p_sa_bind_info->sync_event, TRUE); - if (cl_status != CL_SUCCESS) { - osm_log(p_log, OSM_LOG_ERROR, - "osmv_bind_sa: ERR 0508: " - "cl_init_event failed: %s\n", ib_get_err_str(cl_status) - ); - free(p_sa_bind_info); - p_sa_bind_info = OSM_BIND_INVALID_HANDLE; - } - -Exit: - OSM_LOG_EXIT(p_log); - return (p_sa_bind_info); -} - -/****t* OSM Vendor SA Client/osmv_sa_mad_data - * NAME - * osmv_sa_mad_data - * - * DESCRIPTION - * Extra fields required to perform a mad query - * This struct is passed to the actual send method - * - * SYNOPSIS - */ -typedef struct _osmv_sa_mad_data { - /* MAD data. */ - uint8_t method; - ib_net16_t attr_id; - ib_net16_t attr_offset; - ib_net32_t attr_mod; - ib_net64_t comp_mask; - void *p_attr; -} osmv_sa_mad_data_t; -/* - * method - * The method of the mad to be sent - * - * attr_id - * Attribute ID - * - * attr_offset - * Offset as defined by RMPP - * - * attr_mod - * Attribute modifier - * - * comp_mask - * The component mask of the query - * - * p_attr - * A pointer to the record of the attribute to be sent. - * - *****/ - -/* Send a MAD out on the GSI interface */ -ib_api_status_t -__osmv_send_sa_req(IN osmv_sa_bind_info_t * p_bind, - IN const osmv_sa_mad_data_t * const p_sa_mad_data, - IN const osmv_query_req_t * const p_query_req) -{ - ib_api_status_t status; - ib_mad_t *p_mad_hdr; - ib_sa_mad_t *p_sa_mad; - osm_madw_t *p_madw; - osm_log_t *p_log = p_bind->p_log; - static atomic32_t trans_id; - boolean_t sync; - osmv_query_req_t *p_query_req_copy; - - OSM_LOG_ENTER(p_log); - - /* - since the sm_lid might change we obtain it every send - (actually it is cached in the bind object and refreshed - every 30sec by this proc ) - */ - status = - __osmv_get_lid_and_sm_lid_by_port_guid(p_bind->p_vendor, - p_bind->port_guid, - &p_bind-> - last_lids_update_sec, - &p_bind->lid, - &p_bind->sm_lid); - if (status != IB_SUCCESS) { - osm_log(p_log, OSM_LOG_ERROR, - "__osmv_send_sa_req: ERR 0509: " - "Fail to obtain the sm lid.\n"); - goto Exit; - } - - /* Get a MAD wrapper for the send */ - p_madw = osm_mad_pool_get(p_bind->p_mad_pool, - p_bind->h_bind, MAD_BLOCK_SIZE, NULL); - - if (p_madw == NULL) { - osm_log(p_log, OSM_LOG_ERROR, - "__osmv_send_sa_req: ERR 0510: " - "Unable to acquire MAD.\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - /* Initialize the Sent MAD: */ - - /* Initialize the MAD buffer for the send operation. */ - p_mad_hdr = osm_madw_get_mad_ptr(p_madw); - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - - /* Get a new transaction Id */ - cl_atomic_inc(&trans_id); - - /* Cleanup the MAD from any residue */ - memset(p_sa_mad, 0, MAD_BLOCK_SIZE); - - /* Initialize the standard MAD header. */ - ib_mad_init_new(p_mad_hdr, /* mad pointer */ - IB_MCLASS_SUBN_ADM, /* class */ - (uint8_t) 2, /* version */ - p_sa_mad_data->method, /* method */ - cl_hton64((uint64_t) trans_id), /* tid */ - p_sa_mad_data->attr_id, /* attr id */ - p_sa_mad_data->attr_mod /* attr mod */ - ); - - /* Set the query information. */ - p_sa_mad->sm_key = p_query_req->sm_key; - p_sa_mad->attr_offset = 0; - p_sa_mad->comp_mask = p_sa_mad_data->comp_mask; - if (p_sa_mad->comp_mask) { - memcpy(p_sa_mad->data, p_sa_mad_data->p_attr, - ib_get_attr_size(p_sa_mad_data->attr_offset)); - } - - /* - Provide the address to send to - */ - /* Patch to handle IBAL - host order , where it should take destination lid in network order */ -#ifdef OSM_VENDOR_INTF_AL - p_madw->mad_addr.dest_lid = p_bind->sm_lid; -#else - p_madw->mad_addr.dest_lid = cl_hton16(p_bind->sm_lid); -#endif - p_madw->mad_addr.addr_type.smi.source_lid = cl_hton16(p_bind->lid); - p_madw->mad_addr.addr_type.gsi.remote_qp = CL_HTON32(1); - p_madw->mad_addr.addr_type.gsi.remote_qkey = IB_QP1_WELL_KNOWN_Q_KEY; - p_madw->mad_addr.addr_type.gsi.pkey_ix = 0; - p_madw->resp_expected = TRUE; - p_madw->fail_msg = CL_DISP_MSGID_NONE; - - /* - Provide MAD context such that the call back will know what to do. - We have to keep the entire request structure so we know the CB. - Since we can not rely on the client to keep it arroud until - the response - we duplicate it and will later dispose it (in CB). - To store on the MADW we cast it into what opensm has: - p_madw->context.arb_context.context1 - */ - p_query_req_copy = malloc(sizeof(*p_query_req_copy)); - if (!p_query_req_copy) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0511: " - "Unable to acquire memory for query copy\n"); - osm_mad_pool_put(p_bind->p_mad_pool, p_madw); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - *p_query_req_copy = *p_query_req; - p_madw->context.arb_context.context1 = p_query_req_copy; - - /* we can support async as well as sync calls */ - sync = ((p_query_req->flags & OSM_SA_FLAGS_SYNC) == OSM_SA_FLAGS_SYNC); - - /* send the mad asynchronously */ - status = osm_vendor_send(osm_madw_get_bind_handle(p_madw), - p_madw, p_madw->resp_expected); - - /* if synchronous - wait on the event */ - if (sync) { - osm_log(p_log, OSM_LOG_DEBUG, - "__osmv_send_sa_req: " "Waiting for async event.\n"); - cl_event_wait_on(&p_bind->sync_event, EVENT_NO_TIMEOUT, FALSE); - cl_event_reset(&p_bind->sync_event); - status = p_madw->status; - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -/* - * Query the SA based on the user's request. - */ -ib_api_status_t -osmv_query_sa(IN osm_bind_handle_t h_bind, - IN const osmv_query_req_t * const p_query_req) -{ - union { - ib_service_record_t svc_rec; - ib_node_record_t node_rec; - ib_portinfo_record_t port_info; - ib_path_rec_t path_rec; -#ifdef DUAL_SIDED_RMPP - ib_multipath_rec_t multipath_rec; -#endif - ib_class_port_info_t class_port_info; - } u; - osmv_sa_mad_data_t sa_mad_data; - osmv_sa_bind_info_t *p_bind = (osmv_sa_bind_info_t *) h_bind; - osmv_user_query_t *p_user_query; -#ifdef DUAL_SIDED_RMPP - osmv_multipath_req_t *p_mpr_req; - int i, j; -#endif - osm_log_t *p_log = p_bind->p_log; - ib_api_status_t status; - - OSM_LOG_ENTER(p_log); - - /* Set the request information. */ - sa_mad_data.method = IB_MAD_METHOD_GETTABLE; - sa_mad_data.attr_mod = 0; - - memset((void*)&u, 0, sizeof(u)); - - /* Set the MAD attributes and component mask correctly. */ - switch (p_query_req->query_type) { - - case OSMV_QUERY_USER_DEFINED: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "USER_DEFINED\n"); - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - if (p_user_query->method) - sa_mad_data.method = p_user_query->method; - sa_mad_data.attr_offset = p_user_query->attr_offset; - sa_mad_data.attr_id = p_user_query->attr_id; - sa_mad_data.attr_mod = p_user_query->attr_mod; - sa_mad_data.comp_mask = p_user_query->comp_mask; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_ALL_SVC_RECS: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "SVC_REC_BY_NAME\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_service_record_t)); - sa_mad_data.comp_mask = 0; - sa_mad_data.p_attr = &u.svc_rec; - break; - - case OSMV_QUERY_SVC_REC_BY_NAME: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "SVC_REC_BY_NAME\n"); - sa_mad_data.method = IB_MAD_METHOD_GET; - sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - sa_mad_data.comp_mask = IB_SR_COMPMASK_SNAME; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_service_record_t)); - sa_mad_data.p_attr = &u.svc_rec; - memcpy(u.svc_rec.service_name, p_query_req->p_query_input, - sizeof(ib_svc_name_t)); - break; - - case OSMV_QUERY_SVC_REC_BY_ID: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "SVC_REC_BY_ID\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - sa_mad_data.comp_mask = IB_SR_COMPMASK_SID; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_service_record_t)); - sa_mad_data.p_attr = &u.svc_rec; - u.svc_rec.service_id = - *(ib_net64_t *) (p_query_req->p_query_input); - break; - - case OSMV_QUERY_CLASS_PORT_INFO: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "CLASS_PORT_INFO\n"); - sa_mad_data.method = IB_MAD_METHOD_GET; - sa_mad_data.attr_id = IB_MAD_ATTR_CLASS_PORT_INFO; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_class_port_info_t)); - sa_mad_data.comp_mask = 0; - sa_mad_data.p_attr = &u.class_port_info; - - break; - - case OSMV_QUERY_NODE_REC_BY_NODE_GUID: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "NODE_REC_BY_NODE_GUID\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_NODE_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_node_record_t)); - sa_mad_data.comp_mask = IB_NR_COMPMASK_NODEGUID; - sa_mad_data.p_attr = &u.node_rec; - u.node_rec.node_info.node_guid = - *(ib_net64_t *) (p_query_req->p_query_input); - - break; - - case OSMV_QUERY_PORT_REC_BY_LID: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "PORT_REC_BY_LID\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_PORTINFO_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_portinfo_record_t)); - sa_mad_data.comp_mask = IB_PIR_COMPMASK_LID; - sa_mad_data.p_attr = &u.port_info; - u.port_info.lid = *(ib_net16_t *) (p_query_req->p_query_input); - break; - - case OSMV_QUERY_PORT_REC_BY_LID_AND_NUM: - sa_mad_data.method = IB_MAD_METHOD_GET; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", - "PORT_REC_BY_LID_AND_NUM\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_PORTINFO_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_portinfo_record_t)); - sa_mad_data.comp_mask = - IB_PIR_COMPMASK_LID | IB_PIR_COMPMASK_PORTNUM; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK: - sa_mad_data.method = IB_MAD_METHOD_GET; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", - "OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_VLARB_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_vl_arb_table_record_t)); - sa_mad_data.comp_mask = - IB_VLA_COMPMASK_LID | IB_VLA_COMPMASK_OUT_PORT | - IB_VLA_COMPMASK_BLOCK; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_SLVL_BY_LID_AND_PORTS: - sa_mad_data.method = IB_MAD_METHOD_GET; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", - "OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_SLVL_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_slvl_table_record_t)); - sa_mad_data.comp_mask = - IB_SLVL_COMPMASK_LID | IB_SLVL_COMPMASK_OUT_PORT | - IB_SLVL_COMPMASK_IN_PORT; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_PATH_REC_BY_PORT_GUIDS: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "PATH_REC_BY_PORT_GUIDS\n"); - memset(&u.path_rec, 0, sizeof(ib_path_rec_t)); - sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_path_rec_t)); - sa_mad_data.comp_mask = - (IB_PR_COMPMASK_DGID | IB_PR_COMPMASK_SGID | IB_PR_COMPMASK_NUMBPATH); - u.path_rec.num_path = 0x7f; - sa_mad_data.p_attr = &u.path_rec; - ib_gid_set_default(&u.path_rec.dgid, - ((osmv_guid_pair_t *) (p_query_req-> - p_query_input))->dest_guid); - ib_gid_set_default(&u.path_rec.sgid, - ((osmv_guid_pair_t *) (p_query_req-> - p_query_input))->src_guid); - break; - - case OSMV_QUERY_PATH_REC_BY_GIDS: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "PATH_REC_BY_GIDS\n"); - memset(&u.path_rec, 0, sizeof(ib_path_rec_t)); - sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_path_rec_t)); - sa_mad_data.comp_mask = - (IB_PR_COMPMASK_DGID | IB_PR_COMPMASK_SGID | IB_PR_COMPMASK_NUMBPATH); - u.path_rec.num_path = 0x7f; - sa_mad_data.p_attr = &u.path_rec; - memcpy(&u.path_rec.dgid, - &((osmv_gid_pair_t *) (p_query_req->p_query_input))-> - dest_gid, sizeof(ib_gid_t)); - memcpy(&u.path_rec.sgid, - &((osmv_gid_pair_t *) (p_query_req->p_query_input))-> - src_gid, sizeof(ib_gid_t)); - break; - - case OSMV_QUERY_PATH_REC_BY_LIDS: - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", "PATH_REC_BY_LIDS\n"); - memset(&u.path_rec, 0, sizeof(ib_path_rec_t)); - sa_mad_data.method = IB_MAD_METHOD_GET; - sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_path_rec_t)); - sa_mad_data.comp_mask = - (IB_PR_COMPMASK_DLID | IB_PR_COMPMASK_SLID); - sa_mad_data.p_attr = &u.path_rec; - u.path_rec.dlid = - ((osmv_lid_pair_t *) (p_query_req->p_query_input))-> - dest_lid; - u.path_rec.slid = - ((osmv_lid_pair_t *) (p_query_req->p_query_input))->src_lid; - break; - - case OSMV_QUERY_UD_MULTICAST_SET: - sa_mad_data.method = IB_MAD_METHOD_SET; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", - "OSMV_QUERY_UD_MULTICAST_SET\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_member_rec_t)); - sa_mad_data.comp_mask = p_user_query->comp_mask; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - - case OSMV_QUERY_UD_MULTICAST_DELETE: - sa_mad_data.method = IB_MAD_METHOD_DELETE; - p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; - osm_log(p_log, OSM_LOG_DEBUG, - "osmv_query_sa DBG:001 %s", - "OSMV_QUERY_UD_MULTICAST_DELETE\n"); - sa_mad_data.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_member_rec_t)); - sa_mad_data.comp_mask = p_user_query->comp_mask; - sa_mad_data.p_attr = p_user_query->p_attr; - break; - -#ifdef DUAL_SIDED_RMPP - case OSMV_QUERY_MULTIPATH_REC: - OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 MULTIPATH_REC\n"); - /* Validate sgid/dgid counts against SA client limit */ - p_mpr_req = (osmv_multipath_req_t *) p_query_req->p_query_input; - if (p_mpr_req->sgid_count + p_mpr_req->dgid_count > - IB_MULTIPATH_MAX_GIDS) { - OSM_LOG(p_log, OSM_LOG_ERROR, "DBG:001 MULTIPATH_REC " - "SGID count %d DGID count %d max count %d\n", - p_mpr_req->sgid_count, p_mpr_req->dgid_count, - IB_MULTIPATH_MAX_GIDS); - CL_ASSERT(0); - return IB_ERROR; - } - memset(&u.multipath_rec, 0, sizeof(ib_multipath_rec_t)); - sa_mad_data.method = IB_MAD_METHOD_GETMULTI; - sa_mad_data.attr_id = IB_MAD_ATTR_MULTIPATH_RECORD; - sa_mad_data.attr_offset = - ib_get_attr_offset(sizeof(ib_multipath_rec_t)); - sa_mad_data.p_attr = &u.multipath_rec; - sa_mad_data.comp_mask = p_mpr_req->comp_mask; - u.multipath_rec.num_path = p_mpr_req->num_path; - if (p_mpr_req->reversible) - u.multipath_rec.num_path |= 0x80; - else - u.multipath_rec.num_path &= ~0x80; - u.multipath_rec.pkey = p_mpr_req->pkey; - ib_multipath_rec_set_sl(&u.multipath_rec, p_mpr_req->sl); - ib_multipath_rec_set_qos_class(&u.multipath_rec, 0); - u.multipath_rec.independence = p_mpr_req->independence; - u.multipath_rec.sgid_count = p_mpr_req->sgid_count; - u.multipath_rec.dgid_count = p_mpr_req->dgid_count; - j = 0; - for (i = 0; i < p_mpr_req->sgid_count; i++, j++) - u.multipath_rec.gids[j] = p_mpr_req->gids[j]; - for (i = 0; i < p_mpr_req->dgid_count; i++, j++) - u.multipath_rec.gids[j] = p_mpr_req->gids[j]; - break; -#endif - - default: - osm_log(p_log, OSM_LOG_ERROR, - "osmv_query_sa DBG:001 UNKNOWN 0x%x (%d)\n", - p_query_req->query_type,p_query_req->query_type); - CL_ASSERT(0); - return IB_ERROR; - } - - status = __osmv_send_sa_req(h_bind, &sa_mad_data, p_query_req); - - OSM_LOG_EXIT(p_log); - return status; -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_sar.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_sar.c deleted file mode 100644 index e9444768..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_sar.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include - -ib_api_status_t -osmv_rmpp_sar_init(osmv_rmpp_sar_t * p_sar, void *p_arbt_mad, - uint32_t mad_size, boolean_t is_sa_mad) -{ - CL_ASSERT(p_sar); - p_sar->p_arbt_mad = p_arbt_mad; - if (is_sa_mad) { - p_sar->data_len = mad_size - IB_SA_MAD_HDR_SIZE; - p_sar->hdr_sz = IB_SA_MAD_HDR_SIZE; - p_sar->data_sz = IB_SA_DATA_SIZE; - } else { - p_sar->data_len = mad_size - MAD_RMPP_HDR_SIZE; - p_sar->hdr_sz = MAD_RMPP_HDR_SIZE; - p_sar->data_sz = MAD_RMPP_DATA_SIZE; - } - return IB_SUCCESS; -} - -void osmv_rmpp_sar_done(osmv_rmpp_sar_t * p_sar) -{ - p_sar->p_arbt_mad = NULL; -} - -/* the big mad should be with mad header, rmpp header ( &sa hdr) space */ -ib_api_status_t -osmv_rmpp_sar_get_mad_seg(IN osmv_rmpp_sar_t * p_sar, - IN uint32_t seg_idx, OUT void *p_buf) -{ - void *p_seg; - uint32_t sz_left; - uint32_t num_segs; - - CL_ASSERT(p_sar); - - num_segs = p_sar->data_len / p_sar->data_sz; - if ((p_sar->data_len % p_sar->data_sz) > 0) { - num_segs++; - } - - if ((seg_idx > num_segs) && (seg_idx != 1)) { - return IB_NOT_FOUND; - } - - /* cleanup */ - memset(p_buf, 0, MAD_BLOCK_SIZE); - - /* attach header */ - memcpy(p_buf, p_sar->p_arbt_mad, p_sar->hdr_sz); - - /* fill data */ - p_seg = - (char *)p_sar->p_arbt_mad + p_sar->hdr_sz + - ((seg_idx - 1) * p_sar->data_sz); - sz_left = p_sar->data_len - ((seg_idx - 1) * p_sar->data_sz); - if (sz_left > p_sar->data_sz) - memcpy((char *)p_buf + p_sar->hdr_sz, (char *)p_seg, - p_sar->data_sz); - else - memcpy((char *)p_buf + p_sar->hdr_sz, (char *)p_seg, sz_left); - - return IB_SUCCESS; -} - -/* turns a list of mads to one big mad - including header */ -/* ALSO - deallocates the list */ -ib_api_status_t -osmv_rmpp_sar_reassemble_arbt_mad(osmv_rmpp_sar_t * p_sar, cl_qlist_t * p_bufs) -{ - void *buf_tmp, *p_mad; - cl_list_item_t *p_item; - cl_list_obj_t *p_obj; - uint32_t space_left = p_sar->data_len + p_sar->hdr_sz; - - CL_ASSERT(p_sar); - CL_ASSERT(FALSE == cl_is_qlist_empty(p_bufs)); - - /* attach header */ - p_mad = p_sar->p_arbt_mad; - p_item = cl_qlist_head(p_bufs); - p_obj = PARENT_STRUCT(p_item, cl_list_obj_t, list_item); - buf_tmp = cl_qlist_obj(p_obj); - memcpy(p_mad, buf_tmp, p_sar->hdr_sz); - p_mad = (char *)p_mad + p_sar->hdr_sz; - space_left -= p_sar->hdr_sz; - - /* reassemble data */ - while (FALSE == cl_is_qlist_empty(p_bufs)) { - - p_item = cl_qlist_remove_head(p_bufs); - p_obj = PARENT_STRUCT(p_item, cl_list_obj_t, list_item); - buf_tmp = cl_qlist_obj(p_obj); - - if (FALSE == cl_is_qlist_empty(p_bufs)) { - memcpy((char *)p_mad, (char *)buf_tmp + p_sar->hdr_sz, - p_sar->data_sz); - p_mad = (char *)p_mad + p_sar->data_sz; - space_left -= p_sar->data_sz; - } else { - /* the last mad on the list */ - memcpy((char *)p_mad, (char *)buf_tmp + p_sar->hdr_sz, - space_left); - p_mad = (char *)p_mad + space_left; - } - - free(buf_tmp); - free(p_obj); - } - - return IB_SUCCESS; -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_sender.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_sender.c deleted file mode 100644 index 69d25b37..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_sender.c +++ /dev/null @@ -1,390 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include - -static ib_api_status_t -__osmv_rmpp_send_segment(IN osm_bind_handle_t h_bind, - IN osmv_txn_ctx_t * p_txn, IN uint32_t seg_num); - -/****d* OSM Vendor/osmv_simple_send_madw - * NAME - * osmv_simple_send_madw - * - * DESCRIPTION - * Send a single MAD (256 bytes). - * - * If this MAD requires a response, set the timeout event. - * The function call returns when the MAD's send completion is received. - * - */ - -ib_api_status_t -osmv_simple_send_madw(IN osm_bind_handle_t h_bind, - IN osm_madw_t * const p_madw, - IN osmv_txn_ctx_t * p_txn, IN boolean_t is_retry) -{ - ib_api_status_t ret; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_mad_addr_t *p_mad_addr = osm_madw_get_mad_addr_ptr(p_madw); - uint8_t mad_buf[MAD_BLOCK_SIZE]; - ib_mad_t *p_mad = (ib_mad_t *) mad_buf; - uint64_t key = 0; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - CL_ASSERT(p_madw->mad_size <= MAD_BLOCK_SIZE); - - memset(p_mad, 0, MAD_BLOCK_SIZE); - memcpy(p_mad, osm_madw_get_mad_ptr(p_madw), p_madw->mad_size); - - if (NULL != p_txn) { - /* Push a fake txn id to the MAD */ - key = osmv_txn_get_key(p_txn); - p_mad->trans_id = cl_hton64(key); - } - - /* - Add call for packet drop randomizer. - This is a testing feature. If run_randomizer flag is set to TRUE, - the randomizer will be called, and randomally will drop - a packet. This is used for simulating unstable fabric. - */ - if (p_bo->p_vendor->run_randomizer == TRUE) { - /* Try the randomizer */ - if (osm_pkt_randomizer_mad_drop(p_bo->p_vendor->p_log, - p_bo->p_vendor-> - p_pkt_randomizer, - p_mad) == TRUE) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "The MAD will not be sent. \n"); - ret = IB_SUCCESS; - } else { - ret = - osmv_transport_mad_send(h_bind, p_mad, p_mad_addr); - } - } else { - ret = osmv_transport_mad_send(h_bind, p_mad, p_mad_addr); - } - - if ((IB_SUCCESS == ret) && (NULL != p_txn) && (!is_retry)) { - /* Set the timeout for receiving the response MAD */ - ret = osmv_txn_set_timeout_ev(h_bind, key, - p_bo->p_vendor->resp_timeout); - } - - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - return ret; -} - -/***** OSM Vendor/osmv_rmpp_send_madw - * NAME - * osmv_rmpp_send_madw - * - * DESCRIPTION - * Send a single message (MAD wrapper of arbitrary length). - * Follow the RMPP semantics - * (segmentation, send window, timeouts etc). - * - * The function call returns either when the whole message - * has been acknowledged, or upon error. - * - * ASSUMPTIONS - * The RMPP sender context is set up - */ - -ib_api_status_t -osmv_rmpp_send_madw(IN osm_bind_handle_t h_bind, - IN osm_madw_t * const p_madw, - IN osmv_txn_ctx_t * p_txn, IN boolean_t is_rmpp_ds) -{ - ib_api_status_t ret = IB_SUCCESS; - uint32_t i, total_segs; - - osmv_rmpp_send_ctx_t *p_send_ctx = osmv_txn_get_rmpp_send_ctx(p_txn); - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - total_segs = osmv_rmpp_send_ctx_get_num_segs(p_send_ctx); - CL_ASSERT(total_segs >= 1); - - /* In the double-sided transfer, wait for ACK 0 */ - - for (;;) { - - if (p_send_ctx->window_first > total_segs) { - - /* Every segment is acknowledged */ - break; - } - - /* Send the next burst. */ - for (i = p_send_ctx->window_first; i <= p_send_ctx->window_last; - i++) { - - /* Send a segment and setup a timeout timer */ - ret = __osmv_rmpp_send_segment(h_bind, p_txn, i); - if (IB_SUCCESS != ret) { - goto send_done; - } - } - - /* Set the Response Timeout for the ACK on the last DATA segment */ - ret = osmv_txn_set_timeout_ev(h_bind, osmv_txn_get_key(p_txn), - p_bo->p_vendor->resp_timeout); - if (IB_SUCCESS != ret) { - goto send_done; - } - - /* Going to sleep. Let the others access the transaction DB */ - osmv_txn_unlock(p_bo); - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "RMPP Sender thread (madw=%p) going to sleep ...\n", - p_madw); - - /* Await the next event to happen */ - cl_event_wait_on(&p_send_ctx->event, - EVENT_NO_TIMEOUT, TRUE /* interruptible */ ); - - /* Got a signal from the MAD dispatcher/timeout handler */ - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "RMPP Sender thread (madw=%p) waking up on a signal ...\n", - p_madw); - - /* Let's see what changed... Make this atomic - re-acquire the lock. */ - osmv_txn_lock(p_bo); - - if (TRUE == p_bo->is_closing) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_rmpp_send_madw: ERR 6601: " - "The bind handle %p is being closed. " - "Stopping the RMPP Send of MADW %p\n", - h_bind, p_madw); - - ret = IB_TIMEOUT; - return IB_INTERRUPTED; - } - - /* STOP? ABORT? TIMEOUT? */ - if (IB_SUCCESS != p_send_ctx->status) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_rmpp_send_madw: ERR 6602: " - "An error (%s) happened during the RMPP send of %p. Bailing out.\n", - ib_get_err_str(p_send_ctx->status), p_madw); - ret = p_send_ctx->status; - goto send_done; - } - } - - if (TRUE == is_rmpp_ds) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Double-sided RMPP - switching to be the receiver.\n"); - - ret = osmv_txn_init_rmpp_receiver(h_bind, p_txn, FALSE - /*Send was initiated by me */ - ); - - if (IB_SUCCESS == ret) { - /* Send ACK on the 0 segment */ - ret = __osmv_rmpp_send_segment(h_bind, p_txn, 0); - } - } - -send_done: - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - return ret; -} - -/* - * NAME osmv_rmpp_send_ack - * - * DESCRIPTION - * - */ - -ib_api_status_t -osmv_rmpp_send_ack(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_req_mad, - IN uint32_t seg_num, - IN uint32_t nwl, IN const osm_mad_addr_t * p_mad_addr) -{ - uint8_t resp_mad[MAD_BLOCK_SIZE]; - ib_rmpp_mad_t *p_resp_mad = (ib_rmpp_mad_t *) resp_mad; - -#ifdef OSMV_RANDOM_DROP - if (TRUE == osmv_random_drop()) { - osm_log(((osmv_bind_obj_t *) h_bind)->p_vendor->p_log, - OSM_LOG_DEBUG, - "Error injection - dropping the RMPP ACK\n"); - return IB_SUCCESS; - } -#endif - - memcpy(p_resp_mad, p_req_mad, MAD_BLOCK_SIZE); - - p_resp_mad->common_hdr.method = osmv_invert_method(p_req_mad->method); - p_resp_mad->rmpp_type = IB_RMPP_TYPE_ACK; - p_resp_mad->seg_num = cl_hton32(seg_num); - p_resp_mad->paylen_newwin = cl_hton32(nwl); - p_resp_mad->rmpp_flags = IB_RMPP_FLAG_ACTIVE; - - return osmv_transport_mad_send(h_bind, p_resp_mad, p_mad_addr); -} - -/* - * NAME osmv_rmpp_send_nak - * - * DESCRIPTION Send the RMPP ABORT or STOP packet - */ - -ib_api_status_t -osmv_rmpp_send_nak(IN osm_bind_handle_t h_bind, - IN const ib_mad_t * p_req_mad, - IN const osm_mad_addr_t * p_mad_addr, - IN uint8_t nak_type, IN uint8_t status) -{ - uint8_t resp_mad[MAD_BLOCK_SIZE]; - ib_rmpp_mad_t *p_resp_mad = (ib_rmpp_mad_t *) resp_mad; - - memcpy(p_resp_mad, p_req_mad, MAD_BLOCK_SIZE); - - p_resp_mad->common_hdr.method = osmv_invert_method(p_req_mad->method); - p_resp_mad->rmpp_type = nak_type; - p_resp_mad->rmpp_status = status; - - return osmv_transport_mad_send(h_bind, p_resp_mad, p_mad_addr); -} - -/* - * NAME __osmv_rmpp_send_segment - * - * DESCRIPTION Build a MAD for a specific segment and send it - */ - -static ib_api_status_t -__osmv_rmpp_send_segment(IN osm_bind_handle_t h_bind, - IN osmv_txn_ctx_t * p_txn, IN uint32_t seg_num) -{ - ib_api_status_t ret; - osmv_rmpp_send_ctx_t *p_send_ctx; - uint8_t mad_buf[MAD_BLOCK_SIZE]; - ib_mad_t *p_mad = (ib_mad_t *) mad_buf; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_mad_addr_t *p_mad_addr = - osm_madw_get_mad_addr_ptr(osmv_txn_get_madw(p_txn)); - uint32_t timeout = p_bo->p_vendor->resp_timeout; - uint64_t key; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - -#ifdef OSMV_RANDOM_DROP - if (TRUE == osmv_random_drop()) { - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Error injection - simulating the RMPP segment drop\n"); - return IB_SUCCESS; - } -#endif - - p_send_ctx = osmv_txn_get_rmpp_send_ctx(p_txn); - key = osmv_txn_get_key(p_txn); - - if (0 != seg_num) { - ret = - osmv_rmpp_send_ctx_get_seg(p_send_ctx, seg_num, timeout, - p_mad); - CL_ASSERT(IB_SUCCESS == ret); - - /* Put the segment to the wire ! */ - p_mad->trans_id = cl_hton64(key); - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Sending RMPP segment #%d, on-wire TID=0x%llX\n", - seg_num, p_mad->trans_id); - - /* - Add call for packet drop randomizer. - This is a testing feature. If run_randomizer flag is set to TRUE, - the randomizer will be called, and randomally will drop - a packet. This is used for simulating unstable fabric. - */ - if (p_bo->p_vendor->run_randomizer == TRUE) { - /* Try the randomizer */ - if (osm_pkt_randomizer_mad_drop(p_bo->p_vendor->p_log, - p_bo->p_vendor-> - p_pkt_randomizer, - p_mad) == TRUE) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "The MAD will not be sent. \n"); - ret = IB_SUCCESS; - } else { - ret = - osmv_transport_mad_send((osm_bind_handle_t) - p_bo, p_mad, - p_mad_addr); - } - } else { - ret = - osmv_transport_mad_send((osm_bind_handle_t) p_bo, - p_mad, p_mad_addr); - } - } else { - /* This is an ACK for double-sided handshake. Give it a special treatment. */ - - /* It doesn't really matter which data to put. Only the header matters. */ - ret = osmv_rmpp_send_ctx_get_seg(p_send_ctx, 1, timeout, p_mad); - CL_ASSERT(IB_SUCCESS == ret); - - p_mad->trans_id = cl_hton64(key); - ret = - osmv_rmpp_send_ack((osm_bind_handle_t) p_bo, p_mad, - 0 /* segnum */ , - OSMV_RMPP_RECV_WIN /* NWL */ , - p_mad_addr); - } - - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - return ret; -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_sim.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_sim.c deleted file mode 100644 index 9266198e..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_sim.c +++ /dev/null @@ -1,439 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* AUTHOR Eitan Zahavi - * - * DESCRIPTION - * The lower-level MAD transport interface implementation - * that allows sending a single MAD/receiving a callback - * when a single MAD is received. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -/* the simulator messages definition */ -#include - -typedef struct _osmv_ibms_transport_mgr { - ibms_conn_handle_t conHdl; /* the connection handle we talk to */ - ibms_bind_msg_t filter; /* the bind message defining the filtering */ - cl_thread_t receiver; /* the thread waiting for incomming messages */ -} osmv_ibms_transport_mgr_t; - -static void -__osmv_ibms_mad_addr_to_osm_addr(IN osm_vendor_t const *p_vend, - IN struct _ibms_mad_addr *p_ibms_addr, - IN uint8_t is_smi, - OUT osm_mad_addr_t * p_osm_addr); - -static void -__osmv_ibms_osm_addr_to_mad_addr(IN const osm_mad_addr_t * p_osm_addr, - IN uint8_t is_smi, - OUT struct _ibms_mad_addr *p_ibms_addr); - -/* this is the callback function the "server" will call on incoming - messages */ -void __osmv_ibms_receiver_callback(void *p_ctx, ibms_mad_msg_t * p_mad) -{ - osm_mad_addr_t mad_addr; - osmv_bind_obj_t *const p_bo = (osmv_bind_obj_t *) p_ctx; - ib_api_status_t status = IB_SUCCESS; - - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return; - - { - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - /* some logging */ - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "__osmv_ibms_receiver_callback: " - "MAD QPN:%d SLID:0x%04x class:0x%02x " - "method:0x%02x attr:0x%04x status:0x%04x " - "tid:0x%016" PRIx64 "\n", - p_mad->addr.dqpn, - cl_ntoh16(p_mad->addr.slid), - p_mad->header.mgmt_class, - p_mad->header.method, - cl_ntoh16(p_mad->header.attr_id), - cl_ntoh16(p_mad->header.status), - cl_ntoh64(p_mad->header.trans_id)); - - /* first arrange an address */ - __osmv_ibms_mad_addr_to_osm_addr(p_bo->p_vendor, - &p_mad->addr, - (((ib_mad_t *) & p_mad-> - header)->mgmt_class == - IB_MCLASS_SUBN_LID) - || - (((ib_mad_t *) & p_mad-> - header)->mgmt_class == - IB_MCLASS_SUBN_DIR), - &mad_addr); - - /* call the receiver callback */ - - status = - osmv_dispatch_mad((osm_bind_handle_t) p_bo, - (void *)&p_mad->header, &mad_addr); - - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - } -} - -ib_api_status_t -osm_vendor_get_guid_by_ca_and_port(IN osm_vendor_t * const p_vend, - IN char *hca_id, - IN uint32_t port_num, - OUT uint64_t * p_port_guid); - -/* - * NAME - * osmv_transport_init - * - * DESCRIPTION - * Setup the MAD transport infrastructure (filters, callbacks etc). - */ - -ib_api_status_t -osmv_transport_init(IN osm_bind_info_t * p_info, - IN char hca_id[VENDOR_HCA_MAXNAMES], - IN uint8_t hca_idx, IN osmv_bind_obj_t * p_bo) -{ - ibms_conn_handle_t conHdl; /* the connection we talk to the simulator through */ - osmv_ibms_transport_mgr_t *p_mgr = - malloc(sizeof(osmv_ibms_transport_mgr_t)); - int qpn; - int ibms_status; - uint64_t port_guid; - - if (!p_mgr) { - return IB_INSUFFICIENT_MEMORY; - } - - memset(p_mgr, 0, sizeof(osmv_ibms_transport_mgr_t)); - - /* create the client socket connected to the simulator */ - /* also perform the "connect" message - such that we - validate the target guid */ - if (osm_vendor_get_guid_by_ca_and_port - (p_bo->p_vendor, hca_id, p_bo->port_num, &port_guid)) { - return IB_INVALID_GUID; - } - - conHdl = - ibms_connect(port_guid, __osmv_ibms_receiver_callback, - (void *)p_bo); - if (!conHdl) { - printf("fail to connect to the server.\n"); - exit(1); - } - - /* - * Create the MAD filter on this file handle. - */ - - p_mgr->filter.port = p_bo->port_num; - p_mgr->filter.only_input = 1; - p_mgr->filter.mask = - IBMS_BIND_MASK_PORT | - IBMS_BIND_MASK_INPUT | IBMS_BIND_MASK_QP | IBMS_BIND_MASK_CLASS; - - switch (p_info->mad_class) { - case IB_MCLASS_SUBN_LID: - case IB_MCLASS_SUBN_DIR: - qpn = 0; - p_mgr->filter.qpn = qpn; - p_mgr->filter.mgt_class = IB_MCLASS_SUBN_LID; - ibms_status = ibms_bind(conHdl, &p_mgr->filter); - if (ibms_status) { - return IB_ERROR; - } - - p_mgr->filter.mgt_class = IB_MCLASS_SUBN_DIR; - ibms_status = ibms_bind(conHdl, &p_mgr->filter); - if (ibms_status) { - return IB_ERROR; - } - - break; - - case IB_MCLASS_SUBN_ADM: - default: - qpn = 1; - p_mgr->filter.qpn = qpn; - p_mgr->filter.mgt_class = p_info->mad_class; - ibms_status = ibms_bind(conHdl, &p_mgr->filter); - if (ibms_status) { - return IB_ERROR; - } - break; - } - - p_mgr->conHdl = conHdl; - - p_bo->p_transp_mgr = p_mgr; - - /* Initialize the magic_ptr to the pointer of the p_bo info. - This will be used to signal when the object is being destroyed, so no - real action will be done then. */ - p_bo->magic_ptr = p_bo; - - return IB_SUCCESS; -} - -/* - * NAME - * osmv_transport_send_mad - * - * DESCRIPTION - * Send a single MAD (256 byte) - */ - -ib_api_status_t -osmv_transport_mad_send(IN const osm_bind_handle_t h_bind, - IN void *p_mad, IN const osm_mad_addr_t * p_mad_addr) -{ - - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_vendor_t const *p_vend = p_bo->p_vendor; - int ret; - ibms_mad_msg_t mad_msg; - ib_api_status_t status; - - const ib_mad_t *p_mad_hdr = p_mad; - - OSM_LOG_ENTER(p_vend->p_log); - - memset(&mad_msg, 0, sizeof(mad_msg)); - - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return IB_INVALID_CALLBACK; - - /* - * Copy the MAD over to the sent mad - */ - memcpy(&mad_msg.header, p_mad_hdr, MAD_BLOCK_SIZE); - - /* - * For all sends other than directed route SM MADs, - * acquire an address vector for the destination. - */ - if (p_mad_hdr->mgmt_class != IB_MCLASS_SUBN_DIR) { - - __osmv_ibms_osm_addr_to_mad_addr(p_mad_addr, - p_mad_hdr->mgmt_class == - IB_MCLASS_SUBN_LID, - &mad_msg.addr); - } else { - /* is a directed route - we need to construct a permissive address */ - /* we do not need port number since it is part of the mad_hndl */ - mad_msg.addr.dlid = IB_LID_PERMISSIVE; - mad_msg.addr.slid = IB_LID_PERMISSIVE; - mad_msg.addr.sqpn = 0; - mad_msg.addr.dqpn = 0; - } - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osmv_transport_mad_send: " - "Sending QPN:%d DLID:0x%04x class:0x%02x " - "method:0x%02x attr:0x%04x status:0x%04x " - "tid:0x%016" PRIx64 "\n", - mad_msg.addr.dqpn, - cl_ntoh16(mad_msg.addr.dlid), - mad_msg.header.mgmt_class, - mad_msg.header.method, - cl_ntoh16(mad_msg.header.attr_id), - cl_ntoh16(mad_msg.header.status), - cl_ntoh64(mad_msg.header.trans_id) - ); - - /* send it */ - ret = - ibms_send(((osmv_ibms_transport_mgr_t *) (p_bo->p_transp_mgr))-> - conHdl, &mad_msg); - if (ret) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osmv_transport_mad_send: ERR 5304: " - "Error sending mad (%d).\n", ret); - status = IB_ERROR; - goto Exit; - } - - status = IB_SUCCESS; - -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -void osmv_transport_done(IN const osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osmv_ibms_transport_mgr_t *p_tpot_mgr = - (osmv_ibms_transport_mgr_t *) (p_bo->p_transp_mgr); - - CL_ASSERT(p_bo); - - /* First of all - zero out the magic_ptr, so if a callback is called - - it'll know that we are currently closing down, and will not handle the - mad. */ - p_bo->magic_ptr = 0; - /* usleep(3000000); */ - - ibms_disconnect(p_tpot_mgr->conHdl); - - /* seems the only way to abort a blocking read is to make it read something */ - free(p_tpot_mgr); -} - -static void -__osmv_ibms_osm_addr_to_mad_addr(IN const osm_mad_addr_t * p_osm_addr, - IN uint8_t is_smi, - OUT struct _ibms_mad_addr *p_ibms_addr) -{ - - /* For global destination or Multicast address: */ - p_ibms_addr->dlid = cl_ntoh16(p_osm_addr->dest_lid); - p_ibms_addr->sl = p_osm_addr->addr_type.gsi.service_level; - if (is_smi) { - p_ibms_addr->sqpn = 0; - p_ibms_addr->dqpn = 0; - } else { - p_ibms_addr->sqpn = 1; - p_ibms_addr->dqpn = - cl_ntoh32(p_osm_addr->addr_type.gsi.remote_qp); - } - /* - HACK we limit to the first PKey Index assuming it will - always be the default PKey - */ - p_ibms_addr->pkey_index = 0; -} - -static void -__osmv_ibms_mad_addr_to_osm_addr(IN osm_vendor_t const *p_vend, - IN struct _ibms_mad_addr *p_ibms_addr, - IN uint8_t is_smi, - OUT osm_mad_addr_t * p_osm_addr) -{ - memset(p_osm_addr, 0, sizeof(osm_mad_addr_t)); - p_osm_addr->dest_lid = cl_hton16(p_ibms_addr->slid); - p_osm_addr->static_rate = 0; - p_osm_addr->path_bits = 0; - if (is_smi) { - /* SMI */ - p_osm_addr->addr_type.smi.source_lid = - cl_hton16(p_ibms_addr->slid); - p_osm_addr->addr_type.smi.port_num = 1; /* TODO add if required p_ibms_addr->port; */ - } else { - /* GSI */ - p_osm_addr->addr_type.gsi.remote_qp = - cl_ntoh32(p_ibms_addr->sqpn); - p_osm_addr->addr_type.gsi.remote_qkey = IB_QP1_WELL_KNOWN_Q_KEY; - p_osm_addr->addr_type.gsi.pkey_ix = p_ibms_addr->pkey_index; - p_osm_addr->addr_type.gsi.service_level = p_ibms_addr->sl; - - p_osm_addr->addr_type.gsi.global_route = FALSE; - /* copy the GRH data if relevant - TopSpin imp doesnt relate to GRH!!! */ - /* - if (p_osm_addr->addr_type.gsi.global_route) - { - p_osm_addr->addr_type.gsi.grh_info.ver_class_flow = - ib_grh_set_ver_class_flow(p_rcv_desc->grh.IP_version, - p_rcv_desc->grh.traffic_class, - p_rcv_desc->grh.flow_label); - p_osm_addr->addr_type.gsi.grh_info.hop_limit = p_rcv_desc->grh.hop_limit; - memcpy(&p_osm_addr->addr_type.gsi.grh_info.src_gid.raw, - &p_rcv_desc->grh.sgid, sizeof(ib_net64_t)); - memcpy(&p_osm_addr->addr_type.gsi.grh_info.dest_gid.raw, - p_rcv_desc->grh.dgid, sizeof(ib_net64_t)); - } - */ - } -} - -/* - * NAME osm_vendor_set_sm - * - * DESCRIPTION Modifies the port info for the bound port to set the "IS_SM" bit - * according to the value given (TRUE or FALSE). - */ - -void osm_vendor_set_sm(IN osm_bind_handle_t h_bind, IN boolean_t is_sm_val) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_vendor_t const *p_vend = p_bo->p_vendor; - int ret; - ibms_cap_msg_t cap_msg; - - OSM_LOG_ENTER(p_vend->p_log); - - cap_msg.mask = IB_PORT_CAP_IS_SM; - if (is_sm_val) - cap_msg.capabilities = IB_PORT_CAP_IS_SM; - else - cap_msg.capabilities = 0; - - ret = ibms_set_cap(((osmv_ibms_transport_mgr_t *) (p_bo-> - p_transp_mgr))-> - conHdl, &cap_msg); - - if (ret) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_set_sm: ERR 5312: " - "Unable set 'IS_SM' bit to:%u in port attributes.\n", - is_sm_val); - } - OSM_LOG_EXIT(p_vend->p_log); -} diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_ts.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_ts.c deleted file mode 100644 index 3966aacf..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_ts.c +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* AUTHOR Edward Bortnikov - * - * DESCRIPTION - * The lower-level MAD transport interface implementation - * that allows sending a single MAD/receiving a callback - * when a single MAD is received. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -typedef struct _osmv_TOPSPIN_transport_mgr_ { - int device_fd; - osm_ts_user_mad_filter filter; - cl_thread_t receiver; -} osmv_TOPSPIN_transport_mgr_t; - -static void -__osmv_TOPSPIN_mad_addr_to_osm_addr(IN osm_vendor_t const *p_vend, - IN struct ib_mad *p_mad, - IN uint8_t is_smi, - OUT osm_mad_addr_t * p_mad_addr); - -static void -__osmv_TOPSPIN_osm_addr_to_mad_addr(IN const osm_mad_addr_t * p_mad_addr, - IN uint8_t is_smi, - OUT struct ib_mad *p_mad); - -void __osmv_TOPSPIN_receiver_thr(void *p_ctx) -{ - int ts_ret_code; - struct ib_mad mad; - osm_mad_addr_t mad_addr; - osmv_bind_obj_t *const p_bo = (osmv_bind_obj_t *) p_ctx; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return; - - /* we set the type of cancelation for this thread */ - /* pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); */ - - while (1) { - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return; - - /* we read one mad at a time and pass it to the read callback function */ - ts_ret_code = - read(((osmv_TOPSPIN_transport_mgr_t *) (p_bo-> - p_transp_mgr))-> - device_fd, &mad, sizeof(mad)); - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return; - - if (ts_ret_code != sizeof(mad)) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_TOPSPIN_receiver_thr: ERR 6803: " - "error with read, bytes = %d, errno = %d\n", - ts_ret_code, errno); - break; - } else { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "__osmv_TOPSPIN_receiver_thr: " - "MAD QPN:%d SLID:0x%04x class:0x%02x " - "method:0x%02x attr:0x%04x status:0x%04x " - "tid:0x%016" PRIx64 "\n", - mad.dqpn, - cl_ntoh16(mad.slid), - mad.mgmt_class, - mad.r_method, - cl_ntoh16(mad.attribute_id), - cl_ntoh16(mad.status), - cl_ntoh64(mad.transaction_id)); - - /* first arrange an address */ - __osmv_TOPSPIN_mad_addr_to_osm_addr(p_bo->p_vendor, - &mad, - (((ib_mad_t *) & - mad)-> - mgmt_class == - IB_MCLASS_SUBN_LID) - || - (((ib_mad_t *) & - mad)-> - mgmt_class == - IB_MCLASS_SUBN_DIR), - &mad_addr); - - /* call the receiver callback */ - - status = - osmv_dispatch_mad((osm_bind_handle_t) p_bo, - (void *)&mad, &mad_addr); - - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return; - - if (IB_INTERRUPTED == status) { - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "__osmv_TOPSPIN_receiver_thr: " - "The bind handle %p is being closed. " - "Breaking the loop.\n", p_bo); - break; - } - } - } - - OSM_LOG_EXIT(p_bo->p_vendor->p_log); -} - -/* - * NAME - * osmv_transport_init - * - * DESCRIPTION - * Setup the MAD transport infrastructure (filters, callbacks etc). - */ - -ib_api_status_t -osmv_transport_init(IN osm_bind_info_t * p_info, - IN char hca_id[VENDOR_HCA_MAXNAMES], - IN uint8_t hca_idx, IN osmv_bind_obj_t * p_bo) -{ - cl_status_t cl_st; - char device_file[16]; - int device_fd; - int ts_ioctl_ret; - osmv_TOPSPIN_transport_mgr_t *p_mgr = - malloc(sizeof(osmv_TOPSPIN_transport_mgr_t)); - int qpn; - - if (!p_mgr) { - return IB_INSUFFICIENT_MEMORY; - } - - memset(p_mgr, 0, sizeof(osmv_TOPSPIN_transport_mgr_t)); - - /* open TopSpin file device */ - /* HACK: assume last char in hostid is the HCA index */ - sprintf(device_file, "/dev/ts_ua%u", hca_idx); - device_fd = open(device_file, O_RDWR); - if (device_fd < 0) { - fprintf(stderr, "Fatal: Fail to open the file:%s err:%d\n", - device_file, errno); - return IB_ERROR; - } - - /* - * Create the MAD filter on this file handle. - */ - - p_mgr->filter.port = p_bo->port_num; - p_mgr->filter.direction = TS_IB_MAD_DIRECTION_IN; - p_mgr->filter.mask = - TS_IB_MAD_FILTER_DIRECTION | - TS_IB_MAD_FILTER_PORT | - TS_IB_MAD_FILTER_QPN | TS_IB_MAD_FILTER_MGMT_CLASS; - - switch (p_info->mad_class) { - case IB_MCLASS_SUBN_LID: - case IB_MCLASS_SUBN_DIR: - qpn = 0; - p_mgr->filter.qpn = qpn; - p_mgr->filter.mgmt_class = IB_MCLASS_SUBN_LID; - ts_ioctl_ret = - ioctl(device_fd, TS_IB_IOCSMADFILTADD, &p_mgr->filter); - if (ts_ioctl_ret < 0) { - return IB_ERROR; - } - - p_mgr->filter.mgmt_class = IB_MCLASS_SUBN_DIR; - ts_ioctl_ret = - ioctl(device_fd, TS_IB_IOCSMADFILTADD, &p_mgr->filter); - if (ts_ioctl_ret < 0) { - return IB_ERROR; - } - - break; - - case IB_MCLASS_SUBN_ADM: - default: - qpn = 1; - p_mgr->filter.qpn = qpn; - p_mgr->filter.mgmt_class = p_info->mad_class; - ts_ioctl_ret = - ioctl(device_fd, TS_IB_IOCSMADFILTADD, &p_mgr->filter); - if (ts_ioctl_ret < 0) { - return IB_ERROR; - } - break; - } - - p_mgr->device_fd = device_fd; - - p_bo->p_transp_mgr = p_mgr; - - /* Initialize the magic_ptr to the pointer of the p_bo info. - This will be used to signal when the object is being destroyed, so no - real action will be done then. */ - p_bo->magic_ptr = p_bo; - - /* init receiver thread */ - cl_st = - cl_thread_init(&p_mgr->receiver, __osmv_TOPSPIN_receiver_thr, - (void *)p_bo, "osmv TOPSPIN rcv thr"); - - return (ib_api_status_t) cl_st; -} - -/* - * NAME - * osmv_transport_send_mad - * - * DESCRIPTION - * Send a single MAD (256 byte) - */ - -ib_api_status_t -osmv_transport_mad_send(IN const osm_bind_handle_t h_bind, - IN void *p_mad, IN const osm_mad_addr_t * p_mad_addr) -{ - - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_vendor_t const *p_vend = p_bo->p_vendor; - struct ib_mad ts_mad; - int ret; - ib_api_status_t status; - - const ib_mad_t *p_mad_hdr = p_mad; - - OSM_LOG_ENTER(p_vend->p_log); - - memset(&ts_mad, 0, sizeof(ts_mad)); - - /* Make sure the p_bo object is still relevant */ - if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing) - return IB_INVALID_CALLBACK; - - /* - * Copy the MAD over to the sent mad - */ - memcpy(&ts_mad, p_mad_hdr, MAD_BLOCK_SIZE); - - /* - * For all sends other than directed route SM MADs, - * acquire an address vector for the destination. - */ - if (p_mad_hdr->mgmt_class != IB_MCLASS_SUBN_DIR) { - - __osmv_TOPSPIN_osm_addr_to_mad_addr(p_mad_addr, - p_mad_hdr->mgmt_class == - IB_MCLASS_SUBN_LID, - &ts_mad); - } else { - /* is a directed route - we need to construct a permissive address */ - /* we do not need port number since it is part of the mad_hndl */ - ts_mad.dlid = IB_LID_PERMISSIVE; - ts_mad.slid = IB_LID_PERMISSIVE; - ts_mad.sqpn = 0; - ts_mad.dqpn = 0; - } - - ts_mad.port = p_bo->port_num; - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "osmv_transport_mad_send: " - "Sending QPN:%d DLID:0x%04x class:0x%02x " - "method:0x%02x attr:0x%04x status:0x%04x " - "tid:0x%016" PRIx64 "\n", - ts_mad.dqpn, - cl_ntoh16(ts_mad.dlid), - ts_mad.mgmt_class, - ts_mad.r_method, - cl_ntoh16(ts_mad.attribute_id), - cl_ntoh16(ts_mad.status), cl_ntoh64(ts_mad.transaction_id) - ); - - /* send it */ - ret = - write(((osmv_TOPSPIN_transport_mgr_t *) (p_bo->p_transp_mgr))-> - device_fd, &ts_mad, sizeof(ts_mad)); - - if (ret != sizeof(ts_mad)) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osmv_transport_mad_send: ERR 6804: " - "Error sending mad (%d).\n", ret); - status = IB_ERROR; - goto Exit; - } - - status = IB_SUCCESS; - -Exit: - OSM_LOG_EXIT(p_vend->p_log); - return (status); -} - -/* - register a new mad type to the opened device file - and send a mad through - the main idea is to make - the filter catch it such that the read unblocks -*/ -void __osm_transport_gen_dummy_mad(osmv_bind_obj_t * p_bo) -{ - struct ib_mad ts_mad; - osmv_TOPSPIN_transport_mgr_t *p_mgr = - (osmv_TOPSPIN_transport_mgr_t *) (p_bo->p_transp_mgr); - struct ib_get_port_info_ioctl port_data; - int ts_ioctl_ret; - - /* prepare the mad fields following the stored filter on the bind */ - memset(&ts_mad, 0, sizeof(ts_mad)); - ts_mad.format_version = 1; - ts_mad.mgmt_class = p_mgr->filter.mgmt_class; - ts_mad.attribute_id = 0x2; - ts_mad.class_version = 1; - ts_mad.r_method = cl_ntoh16(0x2); - ts_mad.port = p_bo->port_num; - ts_mad.sqpn = p_mgr->filter.qpn; - ts_mad.dqpn = p_mgr->filter.qpn; - ts_mad.slid = 0xffff; - /* we must send to our local lid ... */ - port_data.port = p_bo->port_num; - ts_ioctl_ret = ioctl(p_mgr->device_fd, TS_IB_IOCGPORTINFO, &port_data); - ts_mad.dlid = port_data.port_info.lid; - ts_mad.transaction_id = 0x9999; - write(p_mgr->device_fd, &ts_mad, sizeof(ts_mad)); -} - -void osmv_transport_done(IN const osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osmv_TOPSPIN_transport_mgr_t *p_tpot_mgr = - (osmv_TOPSPIN_transport_mgr_t *) (p_bo->p_transp_mgr); - - CL_ASSERT(p_bo); - - /* First of all - zero out the magic_ptr, so if a callback is called - - it'll know that we are currently closing down, and will not handle the - mad. */ - p_bo->magic_ptr = 0; - /* usleep(3000000); */ - - /* seems the only way to abort a blocking read is to make it read something */ - __osm_transport_gen_dummy_mad(p_bo); - cl_thread_destroy(&(p_tpot_mgr->receiver)); - free(p_tpot_mgr); -} - -static void -__osmv_TOPSPIN_osm_addr_to_mad_addr(IN const osm_mad_addr_t * p_mad_addr, - IN uint8_t is_smi, OUT struct ib_mad *p_mad) -{ - - /* For global destination or Multicast address: */ - p_mad->dlid = cl_ntoh16(p_mad_addr->dest_lid); - p_mad->sl = p_mad_addr->addr_type.gsi.service_level; - if (is_smi) { - p_mad->sqpn = 0; - p_mad->dqpn = 0; - } else { - p_mad->sqpn = 1; - p_mad->dqpn = cl_ntoh32(p_mad_addr->addr_type.gsi.remote_qp); - } - /* - HACK we limit to the first PKey Index assuming it will - always be the default PKey - */ - p_mad->pkey_index = 0; -} - -static void -__osmv_TOPSPIN_mad_addr_to_osm_addr(IN osm_vendor_t const *p_vend, - IN struct ib_mad *p_mad, - IN uint8_t is_smi, - OUT osm_mad_addr_t * p_mad_addr) -{ - p_mad_addr->dest_lid = cl_hton16(p_mad->slid); - p_mad_addr->static_rate = 0; - p_mad_addr->path_bits = 0; - if (is_smi) { - /* SMI */ - p_mad_addr->addr_type.smi.source_lid = cl_hton16(p_mad->slid); - p_mad_addr->addr_type.smi.port_num = p_mad->port; - } else { - /* GSI */ - p_mad_addr->addr_type.gsi.remote_qp = cl_ntoh32(p_mad->sqpn); - p_mad_addr->addr_type.gsi.remote_qkey = IB_QP1_WELL_KNOWN_Q_KEY; - /* There is a TAVOR limitation that only one P_KEY is supported per */ - /* QP - so QP1 must use IB_DEFAULT_PKEY */ - p_mad_addr->addr_type.gsi.pkey_ix = p_mad->pkey_index; - p_mad_addr->addr_type.gsi.service_level = p_mad->sl; - - p_mad_addr->addr_type.gsi.global_route = FALSE; - /* copy the GRH data if relevant - TopSpin imp doesnt relate to GRH!!! */ - /* - if (p_mad_addr->addr_type.gsi.global_route) - { - p_mad_addr->addr_type.gsi.grh_info.ver_class_flow = - ib_grh_set_ver_class_flow(p_rcv_desc->grh.IP_version, - p_rcv_desc->grh.traffic_class, - p_rcv_desc->grh.flow_label); - p_mad_addr->addr_type.gsi.grh_info.hop_limit = p_rcv_desc->grh.hop_limit; - memcpy(&p_mad_addr->addr_type.gsi.grh_info.src_gid.raw, - &p_rcv_desc->grh.sgid, sizeof(ib_net64_t)); - memcpy(&p_mad_addr->addr_type.gsi.grh_info.dest_gid.raw, - p_rcv_desc->grh.dgid, sizeof(ib_net64_t)); - } - */ - } -} - -/* - * NAME osm_vendor_set_sm - * - * DESCRIPTION Modifies the port info for the bound port to set the "IS_SM" bit - * according to the value given (TRUE or FALSE). - */ -#if (defined(OSM_VENDOR_INTF_TS_NO_VAPI) || defined(OSM_VENDOR_INTF_TS)) - -void osm_vendor_set_sm(IN osm_bind_handle_t h_bind, IN boolean_t is_sm_val) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - osm_vendor_t const *p_vend = p_bo->p_vendor; - int ts_ioctl_ret; - int device_fd = - ((osmv_TOPSPIN_transport_mgr_t *) (p_bo->p_transp_mgr))->device_fd; - struct ib_set_port_info_ioctl set_port_data; - - OSM_LOG_ENTER(p_vend->p_log); - - memset(&set_port_data, 0, sizeof(set_port_data)); - - set_port_data.port = p_bo->port_num; - set_port_data.port_info.valid_fields = IB_PORT_IS_SM; - set_port_data.port_info.is_sm = is_sm_val; - ts_ioctl_ret = ioctl(device_fd, TS_IB_IOCSPORTINFO, &set_port_data); - if (ts_ioctl_ret < 0) { - osm_log(p_vend->p_log, OSM_LOG_ERROR, - "osm_vendor_set_sm: ERR 6805: " - "Unable set 'IS_SM' bit to:%u in port attributes (%d).\n", - is_sm_val, ts_ioctl_ret); - } - - OSM_LOG_EXIT(p_vend->p_log); -} - -#endif diff --git a/branches/opensm_3/user/libvendor/osm_vendor_mlx_txn.c b/branches/opensm_3/user/libvendor/osm_vendor_mlx_txn.c deleted file mode 100644 index 55c312a3..00000000 --- a/branches/opensm_3/user/libvendor/osm_vendor_mlx_txn.c +++ /dev/null @@ -1,680 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include - -#include -#include -#include -#include -#include - -static ib_api_status_t -__osmv_txnmgr_lookup(IN osmv_txn_mgr_t * p_tx_mgr, - IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn); - -static ib_api_status_t -__osmv_txnmgr_insert_txn(IN osmv_txn_mgr_t * p_tx_mgr, - IN osmv_txn_ctx_t * p_txn, IN uint64_t key); - -static ib_api_status_t -__osmv_txnmgr_remove_txn(IN osmv_txn_mgr_t * p_tx_mgr, - IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn); - -static void __osmv_txn_all_done(osm_bind_handle_t h_bind); - -static uint64_t -__osmv_txn_timeout_cb(IN uint64_t key, - IN uint32_t num_regs, IN void *cb_context); - -ib_api_status_t -osmv_txn_init(IN osm_bind_handle_t h_bind, - IN uint64_t tid, IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn) -{ - ib_api_status_t st; - osmv_txn_ctx_t *p_txn; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - CL_ASSERT(NULL != h_bind && NULL != pp_txn); - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Starting transaction 0x%016" PRIx64 - " (key=0x%016" PRIx64 ")\n", tid, key); - - p_txn = malloc(sizeof(osmv_txn_ctx_t)); - if (!p_txn) { - return IB_INSUFFICIENT_MEMORY; - } - - memset(p_txn, 0, sizeof(osmv_txn_ctx_t)); - p_txn->p_log = p_bo->txn_mgr.p_log; - p_txn->tid = tid; - p_txn->key = key; - p_txn->p_madw = NULL; - p_txn->rmpp_txfr.rmpp_state = OSMV_TXN_RMPP_NONE; - - /* insert into transaction manager DB */ - st = __osmv_txnmgr_insert_txn(&p_bo->txn_mgr, p_txn, key); - if (IB_SUCCESS != st) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "osmv_txn_init: ERR 6703: " - "Failed to insert to transaction 0x%016" PRIx64 - " (key=0x%016" PRIx64 ") to manager DB\n", - tid, key); - goto insert_txn_failed; - } - - *pp_txn = p_txn; - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - return IB_SUCCESS; - -insert_txn_failed: - free(p_txn); - - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - return st; -} - -ib_api_status_t -osmv_txn_init_rmpp_sender(IN osm_bind_handle_t h_bind, - IN osmv_txn_ctx_t * p_txn, IN osm_madw_t * p_madw) -{ - ib_api_status_t st; - - CL_ASSERT(p_txn); - - /* Double-Sided RMPP Direction Switch */ - osmv_txn_remove_timeout_ev(h_bind, osmv_txn_get_key(p_txn)); - - p_txn->rmpp_txfr.rmpp_state = OSMV_TXN_RMPP_SENDER; - p_txn->rmpp_txfr.p_rmpp_send_ctx = malloc(sizeof(osmv_rmpp_send_ctx_t)); - - if (!p_txn->rmpp_txfr.p_rmpp_send_ctx) { - return IB_INSUFFICIENT_MEMORY; - } - - memset(p_txn->rmpp_txfr.p_rmpp_send_ctx, 0, - sizeof(osmv_rmpp_send_ctx_t)); - - st = osmv_rmpp_send_ctx_init(p_txn->rmpp_txfr.p_rmpp_send_ctx, - (void *)p_madw->p_mad, - p_madw->mad_size, p_txn->p_log); - return st; -} - -ib_api_status_t -osmv_txn_init_rmpp_receiver(IN osm_bind_handle_t h_bind, - IN osmv_txn_ctx_t * p_txn, - IN boolean_t is_init_by_peer) -{ - ib_api_status_t st; - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - uint64_t key = osmv_txn_get_key(p_txn); - - CL_ASSERT(p_txn); - - /* Double-Sided RMPP Direction Switch */ - osmv_txn_remove_timeout_ev(h_bind, key); - - /* Set the Transaction Timeout value */ - st = osmv_txn_set_timeout_ev(h_bind, key, - p_bo->p_vendor->ttime_timeout); - if (IB_SUCCESS != st) { - - return st; - } - - p_txn->rmpp_txfr.rmpp_state = OSMV_TXN_RMPP_RECEIVER; - p_txn->rmpp_txfr.is_rmpp_init_by_peer = is_init_by_peer; - - p_txn->rmpp_txfr.p_rmpp_recv_ctx = malloc(sizeof(osmv_rmpp_recv_ctx_t)); - - if (!p_txn->rmpp_txfr.p_rmpp_recv_ctx) { - - osmv_txn_remove_timeout_ev(h_bind, key); - return IB_INSUFFICIENT_MEMORY; - } - - memset(p_txn->rmpp_txfr.p_rmpp_recv_ctx, 0, - sizeof(osmv_rmpp_recv_ctx_t)); - - st = osmv_rmpp_recv_ctx_init(p_txn->rmpp_txfr.p_rmpp_recv_ctx, - p_txn->p_log); - - return st; -} - -/* - * NAME - * osmv_txn_set_timeout_ev - * - * DESCRIPTION - * - * SEE ALSO - * - */ -ib_api_status_t -osmv_txn_set_timeout_ev(IN osm_bind_handle_t h_bind, - IN uint64_t key, IN uint64_t msec) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - cl_event_wheel_t *p_event_wheel = p_bo->txn_mgr.p_event_wheel; - cl_status_t status; - - status = cl_event_wheel_reg(p_event_wheel, key, cl_get_time_stamp() + 1000 * msec, /* TTL */ - __osmv_txn_timeout_cb, - p_bo /* The context */ ); - - return (ib_api_status_t) status; -} - -/* - * NAME - * osmv_txn_remove_timeout_ev - * - * DESCRIPTION - - * SEE ALSO - * - */ -void osmv_txn_remove_timeout_ev(IN osm_bind_handle_t h_bind, IN uint64_t key) -{ - cl_event_wheel_t *p_event_wheel = - ((osmv_bind_obj_t *) h_bind)->txn_mgr.p_event_wheel; - cl_event_wheel_unreg(p_event_wheel, key); -} - -void -osmv_txn_done(IN osm_bind_handle_t h_bind, - IN uint64_t key, IN boolean_t is_in_cb) -{ - osmv_txn_ctx_t *p_ctx; - osmv_bind_obj_t *const p_bo = (osmv_bind_obj_t *) h_bind; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - CL_ASSERT(h_bind); - - /* Cancel the (single) timeout possibly outstanding for this txn - * Don't do this if you are in the callback context, for 2 reasons: - * (1) The event wheel will remove the context itself. - * (2) If we try to, there is a deadlock in the event wheel - */ - if (FALSE == is_in_cb) { - osmv_txn_remove_timeout_ev(h_bind, key); - } - - /* Remove from DB */ - if (IB_NOT_FOUND == - __osmv_txnmgr_remove_txn(&p_bo->txn_mgr, key, &p_ctx)) { - return; - } - - /* Destroy the transaction's RMPP contexts - * (can be more than one in the case of double sided transfer) - */ - - if (p_ctx->rmpp_txfr.p_rmpp_send_ctx) { - osmv_rmpp_send_ctx_done(p_ctx->rmpp_txfr.p_rmpp_send_ctx); - } - - if (p_ctx->rmpp_txfr.p_rmpp_recv_ctx) { - osmv_rmpp_recv_ctx_done(p_ctx->rmpp_txfr.p_rmpp_recv_ctx); - } - - free(p_ctx); - - OSM_LOG_EXIT(p_bo->p_vendor->p_log); -} - -ib_api_status_t -osmv_txn_lookup(IN osm_bind_handle_t h_bind, - IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn) -{ - return __osmv_txnmgr_lookup(&(((osmv_bind_obj_t *) h_bind)->txn_mgr), - key, pp_txn); -} - -void osmv_txn_abort_rmpp_txns(osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - cl_map_item_t *p_item; - cl_map_obj_t *p_obj; - osmv_txn_ctx_t *p_txn; - osmv_rmpp_send_ctx_t *p_send_ctx; - cl_qmap_t *p_map = p_bo->txn_mgr.p_txn_map; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - while (FALSE == cl_is_qmap_empty(p_map)) { - - p_item = cl_qmap_head(p_map); - p_obj = PARENT_STRUCT(p_item, cl_map_obj_t, item); - p_txn = (osmv_txn_ctx_t *) cl_qmap_obj(p_obj); - p_send_ctx = osmv_txn_get_rmpp_send_ctx(p_txn); - - if (NULL != p_send_ctx) { - - p_send_ctx->status = IB_INTERRUPTED; - - /* Wake up the sender thread to let it break out */ - cl_event_signal(&p_send_ctx->event); - } - - cl_qmap_remove_item(p_map, p_item); - } - - OSM_LOG_EXIT(p_bo->p_vendor->p_log); -} - -ib_api_status_t -osmv_txnmgr_init(IN osmv_txn_mgr_t * p_tx_mgr, - IN osm_log_t * p_log, IN cl_spinlock_t * p_lock) -{ - cl_status_t cl_st = CL_SUCCESS; - - p_tx_mgr->p_event_wheel = malloc(sizeof(cl_event_wheel_t)); - if (!p_tx_mgr->p_event_wheel) { - return IB_INSUFFICIENT_MEMORY; - } - - memset(p_tx_mgr->p_event_wheel, 0, sizeof(cl_event_wheel_t)); - - cl_event_wheel_construct(p_tx_mgr->p_event_wheel); - - /* NOTE! We are using an extended constructor. - * We tell the Event Wheel run in a non-protected manner in the reg/unreg calls, - * and acquire an external lock in the asynchronous callback. - */ - cl_st = cl_event_wheel_init_ex(p_tx_mgr->p_event_wheel, p_lock); - if (cl_st != CL_SUCCESS) { - free(p_tx_mgr->p_event_wheel); - return (ib_api_status_t) cl_st; - } - - p_tx_mgr->p_txn_map = malloc(sizeof(cl_qmap_t)); - if (!p_tx_mgr->p_txn_map) { - cl_event_wheel_destroy(p_tx_mgr->p_event_wheel); - free(p_tx_mgr->p_event_wheel); - return IB_INSUFFICIENT_MEMORY; - } - - memset(p_tx_mgr->p_txn_map, 0, sizeof(cl_qmap_t)); - - cl_qmap_init(p_tx_mgr->p_txn_map); - p_tx_mgr->p_log = p_log; - - return cl_st; -} - -void osmv_txnmgr_done(IN osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - - __osmv_txn_all_done(h_bind); - free(p_bo->txn_mgr.p_txn_map); - - cl_event_wheel_destroy(p_bo->txn_mgr.p_event_wheel); - free(p_bo->txn_mgr.p_event_wheel); -} - -ib_api_status_t -__osmv_txnmgr_lookup(IN osmv_txn_mgr_t * p_tx_mgr, - IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn) -{ - ib_api_status_t status = IB_SUCCESS; - cl_map_item_t *p_item; - cl_map_obj_t *p_obj; - - uint64_t tmp_key; - - OSM_LOG_ENTER(p_tx_mgr->p_log); - - CL_ASSERT(p_tx_mgr); - CL_ASSERT(pp_txn); - - osm_log(p_tx_mgr->p_log, OSM_LOG_DEBUG, - "__osmv_txnmgr_lookup: " - "Looking for key: 0x%016" PRIx64 " in map ptr:%p\n", key, - p_tx_mgr->p_txn_map); - - p_item = cl_qmap_head(p_tx_mgr->p_txn_map); - while (p_item != cl_qmap_end(p_tx_mgr->p_txn_map)) { - tmp_key = cl_qmap_key(p_item); - osm_log(p_tx_mgr->p_log, OSM_LOG_DEBUG, - "__osmv_txnmgr_lookup: " - "Found key 0x%016" PRIx64 "\n", tmp_key); - p_item = cl_qmap_next(p_item); - } - - p_item = cl_qmap_get(p_tx_mgr->p_txn_map, key); - if (cl_qmap_end(p_tx_mgr->p_txn_map) == p_item) { - status = IB_NOT_FOUND; - } else { - p_obj = PARENT_STRUCT(p_item, cl_map_obj_t, item); - *pp_txn = cl_qmap_obj(p_obj); - } - - OSM_LOG_EXIT(p_tx_mgr->p_log); - return status; -} - -ib_api_status_t -__osmv_txnmgr_insert_txn(IN osmv_txn_mgr_t * p_tx_mgr, - IN osmv_txn_ctx_t * p_txn, IN uint64_t key) -{ - cl_map_obj_t *p_obj = NULL; - cl_map_item_t *p_item; - uint64_t tmp_key; - - CL_ASSERT(p_tx_mgr); - CL_ASSERT(p_txn); - - key = osmv_txn_get_key(p_txn); - p_obj = malloc(sizeof(cl_map_obj_t)); - if (NULL == p_obj) - return IB_INSUFFICIENT_MEMORY; - - osm_log(p_tx_mgr->p_log, OSM_LOG_DEBUG, - "__osmv_txnmgr_insert_txn: " - "Inserting key: 0x%016" PRIx64 " to map ptr:%p\n", key, - p_tx_mgr->p_txn_map); - - memset(p_obj, 0, sizeof(cl_map_obj_t)); - - cl_qmap_set_obj(p_obj, p_txn); - /* assuming lookup with this key was made and the result was IB_NOT_FOUND */ - cl_qmap_insert(p_tx_mgr->p_txn_map, key, &p_obj->item); - - p_item = cl_qmap_head(p_tx_mgr->p_txn_map); - while (p_item != cl_qmap_end(p_tx_mgr->p_txn_map)) { - tmp_key = cl_qmap_key(p_item); - osm_log(p_tx_mgr->p_log, OSM_LOG_DEBUG, - "__osmv_txnmgr_insert_txn: " - "Found key 0x%016" PRIx64 "\n", tmp_key); - p_item = cl_qmap_next(p_item); - } - - return IB_SUCCESS; -} - -ib_api_status_t -__osmv_txnmgr_remove_txn(IN osmv_txn_mgr_t * p_tx_mgr, - IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn) -{ - cl_map_obj_t *p_obj; - cl_map_item_t *p_item; - - OSM_LOG_ENTER(p_tx_mgr->p_log); - - CL_ASSERT(p_tx_mgr); - CL_ASSERT(pp_txn); - - p_item = cl_qmap_remove(p_tx_mgr->p_txn_map, key); - - if (p_item == cl_qmap_end(p_tx_mgr->p_txn_map)) { - - osm_log(p_tx_mgr->p_log, OSM_LOG_ERROR, - "__osmv_txnmgr_remove_txn: ERR 6701: " - "Could not remove the transaction 0x%016" PRIx64 " - " - "something is really wrong!\n", key); - OSM_LOG_EXIT(p_tx_mgr->p_log); - return IB_NOT_FOUND; - } - - p_obj = PARENT_STRUCT(p_item, cl_map_obj_t, item); - *pp_txn = cl_qmap_obj(p_obj); - - free(p_obj); - - OSM_LOG_EXIT(p_tx_mgr->p_log); - return IB_SUCCESS; -} - -void __osmv_txn_all_done(osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - cl_map_item_t *p_item; - cl_map_obj_t *p_obj; - osmv_txn_ctx_t *p_txn; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - p_item = cl_qmap_head(p_bo->txn_mgr.p_txn_map); - while (p_item != cl_qmap_end(p_bo->txn_mgr.p_txn_map)) { - - p_obj = PARENT_STRUCT(p_item, cl_map_obj_t, item); - p_txn = (osmv_txn_ctx_t *) cl_qmap_obj(p_obj); - osmv_txn_done(h_bind, osmv_txn_get_key(p_txn), FALSE); - free(p_obj); - /* assuming osmv_txn_done has removed the txn from the map */ - p_item = cl_qmap_head(p_bo->txn_mgr.p_txn_map); - } - - OSM_LOG_EXIT(p_bo->p_vendor->p_log); -} - -/******************************************************************************/ - -void osmv_txn_lock(IN osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "--> Acquiring lock %p on bind handle %p\n", &p_bo->lock, p_bo); - - cl_spinlock_acquire(&p_bo->lock); - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "--> Acquired lock %p on bind handle %p\n", &p_bo->lock, p_bo); -} - -void osmv_txn_unlock(IN osm_bind_handle_t h_bind) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind; - cl_spinlock_t *p_lock = &p_bo->lock; - osm_log_t *p_log = p_bo->p_vendor->p_log; - - osm_log(p_log, OSM_LOG_DEBUG, - "<-- Releasing lock %p on bind handle %p\n", p_lock, p_bo); - - cl_spinlock_release(&p_bo->lock); - - /* We'll use the saved ptrs, since now the p_bo can be destroyed already */ - osm_log(p_log, OSM_LOG_DEBUG, - "<-- Released lock %p on bind handle %p\n", p_lock, p_bo); - -} - -static uint64_t -__osmv_txn_timeout_cb(IN uint64_t key, - IN uint32_t num_regs, IN void *cb_context) -{ - osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) cb_context; - uint64_t ret = 0; - osmv_txn_ctx_t *p_txn; - osmv_rmpp_send_ctx_t *p_send_ctx; - osm_madw_t *p_madw = NULL; - ib_mad_t *p_mad; - osm_mad_addr_t *p_mad_addr; - boolean_t invoke_err_cb = FALSE; - - OSM_LOG_ENTER(p_bo->p_vendor->p_log); - - /* Don't try to acquire a lock on the Bind Object - - * it's taken by the mechanism that drives the timeout based events! - * (Recall the special constructor that the Event Wheel is applied with) - */ - if (p_bo->is_closing) { - goto txn_done; - } - - ret = osmv_txn_lookup(p_bo, key, &p_txn); - if (IB_NOT_FOUND == ret) { - /* Prevent a race - the transaction is already destroyed */ - goto txn_done; - } - - p_madw = p_txn->p_madw; - - switch (osmv_txn_get_rmpp_state(p_txn)) { - - case OSMV_TXN_RMPP_NONE: - if (num_regs <= OSM_DEFAULT_RETRY_COUNT) { - /* We still did not exceed the limit of retransmissions. - * Set the next timeout's value. - */ - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "__osmv_txn_timeout_cb: " - "The transaction request (tid=0x%016" PRIx64 ")" - " timed out %d times. Retrying the send.\n", - osmv_txn_get_tid(p_txn), num_regs); - - /* resend this mad */ - ret = osmv_simple_send_madw((osm_bind_handle_t *) p_bo, - p_madw, p_txn, TRUE); - if (ret != IB_SUCCESS) { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_txn_timeout_cb: " - "Fail to send retry for transaction" - "request (tid=0x%016" PRIx64 ").\n", - osmv_txn_get_tid(p_txn)); - - osmv_txn_done((osm_bind_handle_t) p_bo, key, - TRUE /*in timeout callback */ ); - - /* This is a requester. Always apply the callback */ - invoke_err_cb = TRUE; - } else { - uint64_t next_timeout_ms; - next_timeout_ms = - p_bo->p_vendor->resp_timeout * (num_regs + - 1) * - (num_regs + 1); - /* when do we need to timeout again */ - ret = - cl_get_time_stamp() + - (uint64_t) (1000 * next_timeout_ms); - - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "__osmv_txn_timeout_cb: " - "Retry request timout in : %lu [msec].\n", - next_timeout_ms); - } - } else { - osm_log(p_bo->p_vendor->p_log, OSM_LOG_ERROR, - "__osmv_txn_timeout_cb: ERR 6702: " - "The transaction request (0x%016" PRIx64 ") " - "timed out (after %d retries). " - "Invoking the error callback.\n", - osmv_txn_get_tid(p_txn), num_regs); - - osmv_txn_done((osm_bind_handle_t) p_bo, key, - TRUE /*in timeout callback */ ); - - /* This is a requester. Always apply the callback */ - invoke_err_cb = TRUE; - } - break; - - case OSMV_TXN_RMPP_SENDER: - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "RMPP sender (tid=0x%016" PRIx64 ") did not receive ACK " - "on every segment in the current send window.\n", - osmv_txn_get_tid(p_txn)); - - p_send_ctx = osmv_txn_get_rmpp_send_ctx(p_txn); - if (num_regs <= OSM_DEFAULT_RETRY_COUNT) { - /* We still did not exceed the limit of retransmissions. - * Set the next timeout's value. - */ - ret = - cl_get_time_stamp() + - 1000 * p_bo->p_vendor->resp_timeout; - } else { - p_send_ctx->status = IB_TIMEOUT; - - p_mad = osm_madw_get_mad_ptr(p_madw); - p_mad_addr = osm_madw_get_mad_addr_ptr(p_madw); - - /* Send an ABORT to the other side */ - osmv_rmpp_send_nak((osm_bind_handle_t) p_bo, p_mad, - p_mad_addr, IB_RMPP_TYPE_ABORT, - IB_RMPP_STATUS_T2L); - } - - /* Wake the RMPP sender thread up */ - cl_event_signal(&p_send_ctx->event); - break; - - case OSMV_TXN_RMPP_RECEIVER: - osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG, - "Transaction timeout on an RMPP receiver " - "(tid=0x%016" PRIx64 "). Dropping the transaction.\n", - osmv_txn_get_tid(p_txn)); - - osmv_txn_done((osm_bind_handle_t) p_bo, key, - TRUE /*in timeout callback */ ); - - if (FALSE == osmv_txn_is_rmpp_init_by_peer(p_txn)) { - /* This is a requester, still waiting for the reply. Apply the callback */ - invoke_err_cb = TRUE; - } - - break; - - default: - CL_ASSERT(FALSE); - } - - if (TRUE == invoke_err_cb) { - CL_ASSERT(NULL != p_madw); - /* update the status in the p_madw */ - p_madw->status = IB_TIMEOUT; - p_bo->send_err_cb(p_bo->cb_context, p_madw); - /* no re-registration */ - ret = 0; - } - -txn_done: - OSM_LOG_EXIT(p_bo->p_vendor->p_log); - return ret; -} diff --git a/branches/opensm_3/user/libvendor/osmv_ibal.exports b/branches/opensm_3/user/libvendor/osmv_ibal.exports deleted file mode 100644 index f77a1e92..00000000 --- a/branches/opensm_3/user/libvendor/osmv_ibal.exports +++ /dev/null @@ -1,34 +0,0 @@ -#if DBG -LIBRARY osmv_ibald.lib -#else -LIBRARY osmv_ibal.lib -#endif - - -EXPORTS -osm_vendor_set_debug -cl_disp_init -cl_disp_destroy -cl_disp_shutdown -cl_event_wheel_init -cl_event_wheel_destroy -cl_event_wheel_construct -cl_event_wheel_reg -cl_event_wheel_num_regs -umad_receiver -osm_vendor_init -osm_vendor_new -osm_vendor_delete -osm_vendor_get_all_port_attr -osm_vendor_bind -osm_vendor_unbind -osm_vendor_get -osm_vendor_put -osm_vendor_send -osm_vendor_local_lid_change -osm_vendor_set_sm -osm_vendor_set_debug -osmv_bind_sa -osmv_query_sa -osm_vendor_get_guid_ca_and_port -getopt_long_only diff --git a/branches/opensm_3/user/libvendor/osmv_openib.exports b/branches/opensm_3/user/libvendor/osmv_openib.exports deleted file mode 100644 index 1bb39faf..00000000 --- a/branches/opensm_3/user/libvendor/osmv_openib.exports +++ /dev/null @@ -1,33 +0,0 @@ -#if DBG -LIBRARY osmv_openibd.lib -#else -LIBRARY osmv_openib.lib -#endif - - -EXPORTS -osm_vendor_set_debug -cl_disp_init -cl_disp_destroy -cl_disp_shutdown -cl_event_wheel_init -cl_event_wheel_destroy -cl_event_wheel_construct -cl_event_wheel_reg -cl_event_wheel_num_regs -umad_receiver -osm_vendor_init -osm_vendor_new -osm_vendor_delete -osm_vendor_get_all_port_attr -osm_vendor_bind -osm_vendor_unbind -osm_vendor_get -osm_vendor_put -osm_vendor_send -osm_vendor_local_lid_change -osm_vendor_set_sm -osm_vendor_set_debug -osmv_bind_sa -osmv_query_sa -osm_vendor_get_guid_ca_and_port diff --git a/branches/opensm_3/user/libvendor/vendor-ibal.inc b/branches/opensm_3/user/libvendor/vendor-ibal.inc deleted file mode 100644 index 473e9f8f..00000000 --- a/branches/opensm_3/user/libvendor/vendor-ibal.inc +++ /dev/null @@ -1,6 +0,0 @@ -# vendor IBAL -VENDOR_LIB=osmv_ibal -VENDOR_IF=OSM_VENDOR_INTF_AL -VENDOR_SRC=osm_vendor_al.c osm_vendor_mlx_sa.c -VENDOR_INC= - diff --git a/branches/opensm_3/user/libvendor/vendor-umad.inc b/branches/opensm_3/user/libvendor/vendor-umad.inc deleted file mode 100644 index b927e797..00000000 --- a/branches/opensm_3/user/libvendor/vendor-umad.inc +++ /dev/null @@ -1,5 +0,0 @@ -# Vendor UMAD -VENDOR_LIB=osmv_openib -VENDOR_IF=OSM_VENDOR_INTF_OPENIB -VENDOR_SRC=osm_vendor_ibumad.c osm_vendor_ibumad_sa.c -VENDOR_INC=$(WINIBHOME)\ulp\libibmad\include; $(WINIBHOME)\ulp\libibumad\include; diff --git a/branches/opensm_3/user/libvendor/winosm_common.c b/branches/opensm_3/user/libvendor/winosm_common.c deleted file mode 100644 index 517ef543..00000000 --- a/branches/opensm_3/user/libvendor/winosm_common.c +++ /dev/null @@ -1,209 +0,0 @@ - -#include -#include -#include -#include -#include -#include - -#include <..\..\..\..\etc\user\inet.c> - -/* - * Just like fopen() except the filename string is env var expanded prior - * to opening the file. Allows %TEMP%\osm.log to work. - */ -#undef fopen - -FILE *Fopen( - const char *filename, - const char *mode ) -{ - FILE *pFile; - char *fname; - - fname = strdup_expand(filename); - pFile = fopen(fname,mode); - free(fname); - return pFile; -} - -#define OSM_MAX_LOG_NAME_SIZE 512 - -static char *syslog_fname; -static FILE *syslog_file; -static char *syslog_id; - -void openlog(char *ident, int option, int facility) -{ - if (!syslog_fname) - syslog_fname = strdup(OSM_DEFAULT_TMP_DIR "osm.syslog"); - - if (!syslog_file) { - syslog_file = Fopen(syslog_fname,"w"); - if (syslog_file) - syslog_id = strdup(ident); - } -} - -void closelog(void) -{ - if (syslog_file) { - fprintf(syslog_file, "\n[%s] Closing syslog\n",syslog_id); - fflush(syslog_file); - fclose(syslog_file); - syslog_file = NULL; - if (syslog_id) { - free((void*)syslog_id); - syslog_id = NULL; - } - if (syslog_fname) { - free((void*)syslog_fname); - syslog_fname = NULL; - } - } -} - -/* output to user-mode DebugView monitor if running */ - -void syslog(int prio, char *fmt, ... ) -{ - char Buffer[1024]; - SYSTEMTIME st; - uint32_t pid = GetCurrentThreadId(); - va_list args; - - va_start(args,fmt); - _vsnprintf(Buffer, 1024, (LPSTR)fmt, args); - va_end(args); - - if (!syslog_file) { - OutputDebugStringA(Buffer); - return; - } - - GetLocalTime(&st); - fprintf(syslog_file, "[%s][%02d:%02d:%02d:%03d][%04X] %s", syslog_id, - st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, pid, - Buffer); - fflush(syslog_file); -} - - -#if 0 -/* Mellanox specific WinIB_HOME env var override of %TEMP% from previous - * openSM port; Not currently utilized pending feedback. - */ - -char* -GetOsmTempPath(void) -{ - char* temp_path; - int length; - - temp_path = (char*)cl_malloc(OSM_MAX_LOG_NAME_SIZE); - if (!temp_path) - return temp_path; - - length = GetTempPath(OSM_MAX_LOG_NAME_SIZE,temp_path); - if (length > OSM_MAX_LOG_NAME_SIZE) - { - cl_free(temp_path); - temp_path = (char*)cl_malloc(length+1); - GetTempPath(length+1,temp_path); - } - return temp_path; -} - -char* -GetOsmCachePath(void) -{ - char* cache_path; - char* tmp_file_name; - char* winib_home, tmp; - HANDLE hFile; - - winib_home = getenv("WinIB_HOME"); - if (winib_home == NULL) - { - /* The WinIB_HOME variable isn't defined. Use the - default temp path */ - return GetOsmTempPath(); - } - cache_path = (char*)cl_malloc(OSM_MAX_LOG_NAME_SIZE); - strcpy(cache_path, winib_home); - - strcat(cache_path, "\\etc\\"); - tmp_file_name = (char*)cl_malloc(OSM_MAX_LOG_NAME_SIZE); - strcpy(tmp_file_name, cache_path); - strcat(tmp_file_name, "opensm.opts"); - hFile = CreateFile(tmp_file_name, - GENERIC_READ, - 0, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - if (hFile == INVALID_HANDLE_VALUE) - { - cl_free(cache_path); - return GetOsmTempPath(); - } - /* Such file exists. This means the directory is usable */ - CloseHandle(hFile); - - return cache_path; -} -#endif - - -/* - * Like _strdup() with Environment varible expansion. - * Example: str '%windir%\temp\osm.log' --> 'C:\windows\temp\osm.log' - * Multiple Env vars are supported. - */ - -char *strdup_expand(const char *base) -{ - char *str,*p,*s,*es,*xs,*rc,*n; - char p_env[80]; - - str = _strdup(base); - - while( (s = strchr(str,'%')) ) - { - p = strchr((++s),'%'); - if (!p) - return str; - - memcpy(p_env,s,p-s); - p_env[p-s] = '\0'; - - es = getenv(p_env); - if (!es) - return str; - - xs = (char*)malloc(strlen(str)+strlen(es)); - for(rc=str,n=xs; rc < (s-1);rc++) *n++ = *rc; - *n='\0'; - strcat(n,es); - strcat(n,(p+1)); - free(str); - str = xs; - } - return str; -} - - -/****************************************************************************/ - -#include <..\..\..\etc\user\getopt.c> - -int getopt_long_only(int argc, char *const*argv, const char *optstring, - const struct option *longopts, int *longindex) -{ - return getopt_long( argc, argv, optstring, longopts, longindex ); -} - -/* getimeofday() */ -#include <..\..\..\etc\user\gtod.c> - diff --git a/branches/opensm_3/user/mad-vendor.inc b/branches/opensm_3/user/mad-vendor.inc deleted file mode 100644 index b5fc9208..00000000 --- a/branches/opensm_3/user/mad-vendor.inc +++ /dev/null @@ -1,6 +0,0 @@ - -# include only 'one' mad vendor. - -!INCLUDE vendor-ibal.inc - -#!INCLUDE vendor-umad.inc diff --git a/branches/opensm_3/user/man/opensm.8 b/branches/opensm_3/user/man/opensm.8 deleted file mode 100644 index a45d6786..00000000 --- a/branches/opensm_3/user/man/opensm.8 +++ /dev/null @@ -1,1105 +0,0 @@ -.TH OPENSM 8 "October 22, 2009" "OpenIB" "OpenIB Management" - -.SH NAME -opensm \- InfiniBand subnet manager and administration (SM/SA) - -.SH SYNOPSIS -.B opensm -[\-\-version]] -[\-F | \-\-config ] -[\-c(reate-config) ] -[\-g(uid) ] -[\-l(mc) ] -[\-p(riority) ] -[\-smkey ] -[\-\-sm_sl ] -[\-r(eassign_lids)] -[\-R | \-\-routing_engine ] -[\-\-do_mesh_analysis] -[\-\-lash_start_vl ] -[\-A | \-\-ucast_cache] -[\-z | \-\-connect_roots] -[\-M | \-\-lid_matrix_file ] -[\-U | \-\-lfts_file ] -[\-S | \-\-sadb_file ] -[\-a | \-\-root_guid_file ] -[\-u | \-\-cn_guid_file ] -[\-G | \-\-io_guid_file ] -[\-H | \-\-max_reverse_hops ] -[\-X | \-\-guid_routing_order_file ] -[\-m | \-\-ids_guid_file ] -[\-o(nce)] -[\-s(weep) ] -[\-t(imeout) ] -[\-\-retries ] -[\-maxsmps ] -[\-console [off | local | socket | loopback]] -[\-console-port ] -[\-i(gnore-guids) ] -[\-w | \-\-hop_weights_file ] -[\-f | \-\-log_file ] -[\-L | \-\-log_limit ] [\-e(rase_log_file)] -[\-P(config) ] -[\-N | \-\-no_part_enforce] -[\-Q | \-\-qos [\-Y | \-\-qos_policy_file ]] -[\-y | \-\-stay_on_fatal] -[\-B | \-\-daemon] -[\-I | \-\-inactive] -[\-\-perfmgr] -[\-\-perfmgr_sweep_time_s ] -[\-\-prefix_routes_file ] -[\-\-consolidate_ipv6_snm_req] -[\-v(erbose)] [\-V] [\-D ] [\-d(ebug) ] -[\-h(elp)] [\-?] - -.SH DESCRIPTION -.PP -opensm is an InfiniBand compliant Subnet Manager and Administration, -and runs on top of OpenIB. - -opensm provides an implementation of an InfiniBand Subnet Manager and -Administration. Such a software entity is required to run for in order -to initialize the InfiniBand hardware (at least one per each -InfiniBand subnet). - -opensm also now contains an experimental version of a performance -manager as well. - -opensm defaults were designed to meet the common case usage on clusters with up to a few hundred nodes. Thus, in this default mode, opensm will scan the IB -fabric, initialize it, and sweep occasionally for changes. - -opensm attaches to a specific IB port on the local machine and configures only -the fabric connected to it. (If the local machine has other IB ports, -opensm will ignore the fabrics connected to those other ports). If no port is -specified, it will select the first "best" available port. - -opensm can present the available ports and prompt for a port number to -attach to. - -By default, the run is logged to two files: /var/log/messages and /var/log/opensm.log. -The first file will register only general major events, whereas the second -will include details of reported errors. All errors reported in this second -file should be treated as indicators of IB fabric health issues. -(Note that when a fatal and non-recoverable error occurs, opensm will exit.) -Both log files should include the message "SUBNET UP" if opensm was able to -setup the subnet correctly. - -.SH OPTIONS - -.PP -.TP -\fB\-\-version\fR -Prints OpenSM version and exits. -.TP -\fB\-F\fR, \fB\-\-config\fR -The name of the OpenSM config file. When not specified -\fB\% /usr/local/etc/opensm/opensm.conf\fP will be used (if exists). -.TP -\fB\-c\fR, \fB\-\-create-config\fR -OpenSM will dump its configuration to the specified file and exit. -This is a way to generate OpenSM configuration file template. -.TP -\fB\-g\fR, \fB\-\-guid\fR -This option specifies the local port GUID value -with which OpenSM should bind. OpenSM may be -bound to 1 port at a time. -If GUID given is 0, OpenSM displays a list -of possible port GUIDs and waits for user input. -Without -g, OpenSM tries to use the default port. -.TP -\fB\-l\fR, \fB\-\-lmc\fR -This option specifies the subnet's LMC value. -The number of LIDs assigned to each port is 2^LMC. -The LMC value must be in the range 0-7. -LMC values > 0 allow multiple paths between ports. -LMC values > 0 should only be used if the subnet -topology actually provides multiple paths between -ports, i.e. multiple interconnects between switches. -Without -l, OpenSM defaults to LMC = 0, which allows -one path between any two ports. -.TP -\fB\-p\fR, \fB\-\-priority\fR -This option specifies the SM\'s PRIORITY. -This will effect the handover cases, where master -is chosen by priority and GUID. Range goes from 0 -(default and lowest priority) to 15 (highest). -.TP -\fB\-smkey\fR -This option specifies the SM\'s SM_Key (64 bits). -This will effect SM authentication. -Note that OpenSM version 3.2.1 and below used the default value '1' -in a host byte order, it is fixed now but you may need this option to -interoperate with old OpenSM running on a little endian machine. -.TP -\fB\-\-sm_sl\fR -This option sets the SL to use for communication with the SM/SA. -Defaults to 0. -.TP -\fB\-r\fR, \fB\-\-reassign_lids\fR -This option causes OpenSM to reassign LIDs to all -end nodes. Specifying -r on a running subnet -may disrupt subnet traffic. -Without -r, OpenSM attempts to preserve existing -LID assignments resolving multiple use of same LID. -.TP -\fB\-R\fR, \fB\-\-routing_engine\fR -This option chooses routing engine(s) to use instead of Min Hop -algorithm (default). Multiple routing engines can be specified -separated by commas so that specific ordering of routing algorithms -will be tried if earlier routing engines fail. -Supported engines: minhop, updn, file, ftree, lash, dor -.TP -\fB\-\-do_mesh_analysis\fR -This option enables additional analysis for the lash routing engine to -precondition switch port assignments in regular cartesian meshes which -may reduce the number of SLs required to give a deadlock free routing. -.TP -\fB\-\-lash_start_vl\fR -This option sets the starting VL to use for the lash routing algorithm. -Defaults to 0. -.TP -\fB\-A\fR, \fB\-\-ucast_cache\fR -This option enables unicast routing cache and prevents routing -recalculation (which is a heavy task in a large cluster) when -there was no topology change detected during the heavy sweep, or -when the topology change does not require new routing calculation, -e.g. when one or more CAs/RTRs/leaf switches going down, or one or -more of these nodes coming back after being down. -A very common case that is handled by the unicast routing cache -is host reboot, which otherwise would cause two full routing -recalculations: one when the host goes down, and the other when -the host comes back online. -.TP -\fB\-z\fR, \fB\-\-connect_roots\fR -This option enforces routing engines (up/down and -fat-tree) to make connectivity between root switches and in -this way to be fully IBA complaint. In many cases this can -violate "pure" deadlock free algorithm, so use it carefully. -.TP -\fB\-M\fR, \fB\-\-lid_matrix_file\fR -This option specifies the name of the lid matrix dump file -from where switch lid matrices (min hops tables will be -loaded. -.TP -\fB\-U\fR, \fB\-\-lfts_file\fR -This option specifies the name of the LFTs file -from where switch forwarding tables will be loaded. -.TP -\fB\-S\fR, \fB\-\-sadb_file\fR -This option specifies the name of the SA DB dump file -from where SA database will be loaded. -.TP -\fB\-a\fR, \fB\-\-root_guid_file\fR -Set the root nodes for the Up/Down or Fat-Tree routing -algorithm to the guids provided in the given file (one to a line). -.TP -\fB\-u\fR, \fB\-\-cn_guid_file\fR -Set the compute nodes for the Fat-Tree routing algorithm -to the guids provided in the given file (one to a line). -.TP -\fB\-G\fR, \fB\-\-io_guid_file\fR -Set the I/O nodes for the Fat-Tree routing algorithm -to the guids provided in the given file (one to a line). -I/O nodes are non-CN nodes allowed to use up to max_reverse_hops switches -the wrong way around to improve connectivity. -.TP -\fB\-H\fR, \fB\-\-max_reverse_hops\fR -Set the maximum number of reverse hops an I/O node is allowed -to make. A reverse hop is the use of a switch the wrong way around. -.TP -\fB\-m\fR, \fB\-\-ids_guid_file\fR -Name of the map file with set of the IDs which will be used -by Up/Down routing algorithm instead of node GUIDs -(format: per line). -.TP -\fB\-X\fR, \fB\-\-guid_routing_order_file\fR -Set the order port guids will be routed for the MinHop -and Up/Down routing algorithms to the guids provided in the -given file (one to a line). -.TP -\fB\-o\fR, \fB\-\-once\fR -This option causes OpenSM to configure the subnet -once, then exit. Ports remain in the ACTIVE state. -.TP -\fB\-s\fR, \fB\-\-sweep\fR -This option specifies the number of seconds between -subnet sweeps. Specifying -s 0 disables sweeping. -Without -s, OpenSM defaults to a sweep interval of -10 seconds. -.TP -\fB\-t\fR, \fB\-\-timeout\fR -This option specifies the time in milliseconds -used for transaction timeouts. -Specifying -t 0 disables timeouts. -Without -t, OpenSM defaults to a timeout value of -200 milliseconds. -.TP -\fB\-\-retries\fR -This option specifies the number of retries used -for transactions. -Without --retries, OpenSM defaults to 3 retries -for transactions. -.TP -\fB\-maxsmps\fR -This option specifies the number of VL15 SMP MADs -allowed on the wire at any one time. -Specifying -maxsmps 0 allows unlimited outstanding -SMPs. -Without -maxsmps, OpenSM defaults to a maximum of -4 outstanding SMPs. -.TP -\fB\-console [off | local | socket | loopback]\fR -This option brings up the OpenSM console (default off). -Note that the socket and loopback options will only be available -if OpenSM was built with --enable-console-socket. -.TP -\fB\-console-port\fR -Specify an alternate telnet port for the socket console (default 10000). -Note that this option only appears if OpenSM was built with ---enable-console-socket. -.TP -\fB\-i\fR, \fB\-ignore-guids\fR -This option provides the means to define a set of ports -(by node guid and port number) that will be ignored by the link load -equalization algorithm. -.TP -\fB\-w\fR, \fB\-\-hop_weights_file\fR -This option provides weighting factors per port representing a hop cost in -computing the lid matrix. The file consists of lines containing a switch port -GUID (specified as a 64 bit hex number, with leading 0x), output port number, -and weighting factor. Any port not listed in the file defaults to a weighting -factor of 1. Lines starting with # are comments. Weights affect only the -output route from the port, so many useful configurations will require weights -to be specified in pairs. -.TP -\fB\-x\fR, \fB\-\-honor_guid2lid\fR -This option forces OpenSM to honor the guid2lid file, -when it comes out of Standby state, if such file exists -under OSM_CACHE_DIR, and is valid. -By default, this is FALSE. -.TP -\fB\-f\fR, \fB\-\-log_file\fR -This option defines the log to be the given file. -By default, the log goes to /var/log/opensm.log. -For the log to go to standard output use -f stdout. -.TP -\fB\-L\fR, \fB\-\-log_limit\fR -This option defines maximal log file size in MB. When -specified the log file will be truncated upon reaching -this limit. -.TP -\fB\-e\fR, \fB\-\-erase_log_file\fR -This option will cause deletion of the log file -(if it previously exists). By default, the log file -is accumulative. -.TP -\fB\-P\fR, \fB\-\-Pconfig\fR -This option defines the optional partition configuration file. -The default name is \fB\%/usr/local/etc/opensm/partitions.conf\fP. -.TP -\fB\-\-prefix_routes_file\fR -Prefix routes control how the SA responds to path record queries for -off-subnet DGIDs. By default, the SA fails such queries. The -.B PREFIX ROUTES -section below describes the format of the configuration file. -The default path is \fB\%/usr/local/etc/opensm/prefix\-routes.conf\fP. -.TP -\fB\-Q\fR, \fB\-\-qos\fR -This option enables QoS setup. It is disabled by default. -.TP -\fB\-Y\fR, \fB\-\-qos_policy_file\fR -This option defines the optional QoS policy file. The default -name is \fB\%/usr/local/etc/opensm/qos-policy.conf\fP. See -QoS_management_in_OpenSM.txt in opensm doc for more information on -configuring QoS policy via this file. -.TP -\fB\-N\fR, \fB\-\-no_part_enforce\fR -This option disables partition enforcement on switch external ports. -.TP -\fB\-y\fR, \fB\-\-stay_on_fatal\fR -This option will cause SM not to exit on fatal initialization -issues: if SM discovers duplicated guids or a 12x link with -lane reversal badly configured. -By default, the SM will exit on these errors. -.TP -\fB\-B\fR, \fB\-\-daemon\fR -Run in daemon mode - OpenSM will run in the background. -.TP -\fB\-I\fR, \fB\-\-inactive\fR -Start SM in inactive rather than init SM state. This -option can be used in conjunction with the perfmgr so as to -run a standalone performance manager without SM/SA. However, -this is NOT currently implemented in the performance manager. -.TP -\fB\-perfmgr\fR -Enable the perfmgr. Only takes effect if --enable-perfmgr was specified at -configure time. See performance-manager-HOWTO.txt in opensm doc for -more information on running perfmgr. -.TP -\fB\-perfmgr_sweep_time_s\fR -Specify the sweep time for the performance manager in seconds -(default is 180 seconds). Only takes -effect if --enable-perfmgr was specified at configure time. -.TP -.BI --consolidate_ipv6_snm_req -Use shared MLID for IPv6 Solicited Node Multicast groups per MGID scope -and P_Key. -.TP -\fB\-v\fR, \fB\-\-verbose\fR -This option increases the log verbosity level. -The -v option may be specified multiple times -to further increase the verbosity level. -See the -D option for more information about -log verbosity. -.TP -\fB\-V\fR -This option sets the maximum verbosity level and -forces log flushing. -The -V option is equivalent to \'-D 0xFF -d 2\'. -See the -D option for more information about -log verbosity. -.TP -\fB\-D\fR -This option sets the log verbosity level. -A flags field must follow the -D option. -A bit set/clear in the flags enables/disables a -specific log level as follows: - - BIT LOG LEVEL ENABLED - ---- ----------------- - 0x01 - ERROR (error messages) - 0x02 - INFO (basic messages, low volume) - 0x04 - VERBOSE (interesting stuff, moderate volume) - 0x08 - DEBUG (diagnostic, high volume) - 0x10 - FUNCS (function entry/exit, very high volume) - 0x20 - FRAMES (dumps all SMP and GMP frames) - 0x40 - ROUTING (dump FDB routing information) - 0x80 - currently unused. - -Without -D, OpenSM defaults to ERROR + INFO (0x3). -Specifying -D 0 disables all messages. -Specifying -D 0xFF enables all messages (see -V). -High verbosity levels may require increasing -the transaction timeout with the -t option. -.TP -\fB\-d\fR, \fB\-\-debug\fR -This option specifies a debug option. -These options are not normally needed. -The number following -d selects the debug -option to enable as follows: - - OPT Description - --- ----------------- - -d0 - Ignore other SM nodes - -d1 - Force single threaded dispatching - -d2 - Force log flushing after each log message - -d3 - Disable multicast support -.TP -\fB\-h\fR, \fB\-\-help\fR -Display this usage info then exit. -.TP -\fB\-?\fR -Display this usage info then exit. - -.SH ENVIRONMENT VARIABLES -.PP -The following environment variables control opensm behavior: - -OSM_TMP_DIR - controls the directory in which the temporary files generated by -opensm are created. These files are: opensm-subnet.lst, opensm.fdbs, and -opensm.mcfdbs. By default, this directory is /var/log. - -OSM_CACHE_DIR - opensm stores certain data to the disk such that subsequent -runs are consistent. The default directory used is /var/cache/opensm. -The following file is included in it: - - guid2lid - stores the LID range assigned to each GUID - -.SH NOTES -.PP -When opensm receives a HUP signal, it starts a new heavy sweep as if a trap was received or a topology change was found. -.PP -Also, SIGUSR1 can be used to trigger a reopen of /var/log/opensm.log for -logrotate purposes. - -.SH PARTITION CONFIGURATION -.PP -The default name of OpenSM partitions configuration file is -\fB\%/usr/local/etc/opensm/partitions.conf\fP. The default may be changed -by using the --Pconfig (-P) option with OpenSM. - -The default partition will be created by OpenSM unconditionally even -when partition configuration file does not exist or cannot be accessed. - -The default partition has P_Key value 0x7fff. OpenSM\'s port will always -have full membership in default partition. All other end ports will have -full membership if the partition configuration file is not found or cannot -be accessed, or limited membership if the file exists and can be accessed -but there is no rule for the Default partition. - -Effectively, this amounts to the same as if one of the following rules -below appear in the partition configuration file. - -In the case of no rule for the Default partition: - -Default=0x7fff : ALL=limited, SELF=full ; - -In the case of no partition configuration file or file cannot be accessed: - -Default=0x7fff : ALL=full ; - - -File Format - -Comments: - -Line content followed after \'#\' character is comment and ignored by -parser. - -General file format: - -: ; - -Partition Definition: - -[PartitionName][=PKey][,flag[=value]][,defmember=full|limited] - - PartitionName - string, will be used with logging. When omitted - empty string will be used. - PKey - P_Key value for this partition. Only low 15 bits will - be used. When omitted will be autogenerated. - flag - used to indicate IPoIB capability of this partition. - defmember=full|limited - specifies default membership for port guid - list. Default is limited. - -Currently recognized flags are: - - ipoib - indicates that this partition may be used for IPoIB, as - result IPoIB capable MC group will be created. - rate= - specifies rate for this IPoIB MC group - (default is 3 (10GBps)) - mtu= - specifies MTU for this IPoIB MC group - (default is 4 (2048)) - sl= - specifies SL for this IPoIB MC group - (default is 0) - scope= - specifies scope for this IPoIB MC group - (default is 2 (link local)). Multiple scope settings - are permitted for a partition. - -Note that values for rate, mtu, and scope should be specified as -defined in the IBTA specification (for example, mtu=4 for 2048). - -PortGUIDs list: - - PortGUID - GUID of partition member EndPort. Hexadecimal - numbers should start from 0x, decimal numbers - are accepted too. - full or limited - indicates full or limited membership for this - port. When omitted (or unrecognized) limited - membership is assumed. - -There are two useful keywords for PortGUID definition: - - - 'ALL' means all end ports in this subnet. - - 'ALL_CAS' means all Channel Adapter end ports in this subnet. - - 'ALL_SWITCHES' means all Switch end ports in this subnet. - - 'ALL_ROUTERS' means all Router end ports in this subnet. - - 'SELF' means subnet manager's port. - -Empty list means no ports in this partition. - -Notes: - -White space is permitted between delimiters ('=', ',',':',';'). - -The line can be wrapped after ':' followed after Partition Definition and -between. - -PartitionName does not need to be unique, PKey does need to be unique. -If PKey is repeated then those partition configurations will be merged -and first PartitionName will be used (see also next note). - -It is possible to split partition configuration in more than one -definition, but then PKey should be explicitly specified (otherwise -different PKey values will be generated for those definitions). - -Examples: - - Default=0x7fff : ALL, SELF=full ; - Default=0x7fff : ALL, ALL_SWITCHES=full, SELF=full ; - - NewPartition , ipoib : 0x123456=full, 0x3456789034=limi, 0x2134af2306 ; - - YetAnotherOne = 0x300 : SELF=full ; - YetAnotherOne = 0x300 : ALL=limited ; - - ShareIO = 0x80 , defmember=full : 0x123451, 0x123452; - # 0x123453, 0x123454 will be limited - ShareIO = 0x80 : 0x123453, 0x123454, 0x123455=full; - # 0x123456, 0x123457 will be limited - ShareIO = 0x80 : defmember=limited : 0x123456, 0x123457, 0x123458=full; - ShareIO = 0x80 , defmember=full : 0x123459, 0x12345a; - ShareIO = 0x80 , defmember=full : 0x12345b, 0x12345c=limited, 0x12345d; - - -Note: - -The following rule is equivalent to how OpenSM used to run prior to the -partition manager: - - Default=0x7fff,ipoib:ALL=full; - -.SH QOS CONFIGURATION -.PP -There are a set of QoS related low-level configuration parameters. -All these parameter names are prefixed by "qos_" string. Here is a full -list of these parameters: - - qos_max_vls - The maximum number of VLs that will be on the subnet - qos_high_limit - The limit of High Priority component of VL - Arbitration table (IBA 7.6.9) - qos_vlarb_low - Low priority VL Arbitration table (IBA 7.6.9) - template - qos_vlarb_high - High priority VL Arbitration table (IBA 7.6.9) - template - Both VL arbitration templates are pairs of - VL and weight - qos_sl2vl - SL2VL Mapping table (IBA 7.6.6) template. It is - a list of VLs corresponding to SLs 0-15 (Note - that VL15 used here means drop this SL) - -Typical default values (hard-coded in OpenSM initialization) are: - - qos_max_vls 15 - qos_high_limit 0 - qos_vlarb_low 0:0,1:4,2:4,3:4,4:4,5:4,6:4,7:4,8:4,9:4,10:4,11:4,12:4,13:4,14:4 - qos_vlarb_high 0:4,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0 - qos_sl2vl 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7 - -The syntax is compatible with rest of OpenSM configuration options and -values may be stored in OpenSM config file (cached options file). - -In addition to the above, we may define separate QoS configuration -parameters sets for various target types. As targets, we currently support -CAs, routers, switch external ports, and switch's enhanced port 0. The -names of such specialized parameters are prefixed by "qos__" -string. Here is a full list of the currently supported sets: - - qos_ca_ - QoS configuration parameters set for CAs. - qos_rtr_ - parameters set for routers. - qos_sw0_ - parameters set for switches' port 0. - qos_swe_ - parameters set for switches' external ports. - -Examples: - qos_sw0_max_vls=2 - qos_ca_sl2vl=0,1,2,3,5,5,5,12,12,0, - qos_swe_high_limit=0 - -.SH PREFIX ROUTES -.PP -Prefix routes control how the SA responds to path record queries for -off-subnet DGIDs. By default, the SA fails such queries. -Note that IBA does not specify how the SA should obtain off-subnet path -record information. -The prefix routes configuration is meant as a stop-gap until the -specification is completed. -.PP -Each line in the configuration file is a 64-bit prefix followed by a -64-bit GUID, separated by white space. -The GUID specifies the router port on the local subnet that will -handle the prefix. -Blank lines are ignored, as is anything between a \fB#\fP character -and the end of the line. -The prefix and GUID are both in hex, the leading 0x is optional. -Either, or both, can be wild-carded by specifying an -asterisk instead of an explicit prefix or GUID. -.PP -When responding to a path record query for an off-subnet DGID, -opensm searches for the first prefix match in the configuration file. -Therefore, the order of the lines in the configuration file is important: -a wild-carded prefix at the beginning of the configuration file renders -all subsequent lines useless. -If there is no match, then opensm fails the query. -It is legal to repeat prefixes in the configuration file, -opensm will return the path to the first available matching router. -A configuration file with a single line where both prefix and GUID -are wild-carded means that a path record query specifying any -off-subnet DGID should return a path to the first available router. -This configuration yields the same behavior formerly achieved by -compiling opensm with -DROUTER_EXP which has been obsoleted. - -.SH ROUTING -.PP -OpenSM now offers five routing engines: - -1. Min Hop Algorithm - based on the minimum hops to each node where the -path length is optimized. - -2. UPDN Unicast routing algorithm - also based on the minimum hops to each -node, but it is constrained to ranking rules. This algorithm should be chosen -if the subnet is not a pure Fat Tree, and deadlock may occur due to a -loop in the subnet. - -3. Fat Tree Unicast routing algorithm - this algorithm optimizes routing -for congestion-free "shift" communication pattern. -It should be chosen if a subnet is a symmetrical or almost symmetrical -fat-tree of various types, not just K-ary-N-Trees: non-constant K, not -fully staffed, any Constant Bisectional Bandwidth (CBB) ratio. -Similar to UPDN, Fat Tree routing is constrained to ranking rules. - -4. LASH unicast routing algorithm - uses Infiniband virtual layers -(SL) to provide deadlock-free shortest-path routing while also -distributing the paths between layers. LASH is an alternative -deadlock-free topology-agnostic routing algorithm to the non-minimal -UPDN algorithm avoiding the use of a potentially congested root node. - -5. DOR Unicast routing algorithm - based on the Min Hop algorithm, but -avoids port equalization except for redundant links between the same -two switches. This provides deadlock free routes for hypercubes when -the fabric is cabled as a hypercube and for meshes when cabled as a -mesh (see details below). - -OpenSM also supports a file method which -can load routes from a table. See \'Modular Routing Engine\' for more -information on this. - -The basic routing algorithm is comprised of two stages: - -1. MinHop matrix calculation - How many hops are required to get from each port to each LID ? - The algorithm to fill these tables is different if you run standard -(min hop) or Up/Down. - For standard routing, a "relaxation" algorithm is used to propagate -min hop from every destination LID through neighbor switches - For Up/Down routing, a BFS from every target is used. The BFS tracks link -direction (up or down) and avoid steps that will perform up after a down -step was used. - -2. Once MinHop matrices exist, each switch is visited and for each target LID a -decision is made as to what port should be used to get to that LID. - This step is common to standard and Up/Down routing. Each port has a -counter counting the number of target LIDs going through it. - When there are multiple alternative ports with same MinHop to a LID, -the one with less previously assigned ports is selected. - If LMC > 0, more checks are added: Within each group of LIDs assigned to -same target port, - a. use only ports which have same MinHop - b. first prefer the ones that go to different systemImageGuid (then -the previous LID of the same LMC group) - c. if none - prefer those which go through another NodeGuid - d. fall back to the number of paths method (if all go to same node). - -Effect of Topology Changes - -OpenSM will preserve existing routing in any case where there is no change in -the fabric switches unless the -r (--reassign_lids) option is specified. - --r -.br ---reassign_lids - This option causes OpenSM to reassign LIDs to all - end nodes. Specifying -r on a running subnet - may disrupt subnet traffic. - Without -r, OpenSM attempts to preserve existing - LID assignments resolving multiple use of same LID. - -If a link is added or removed, OpenSM does not recalculate -the routes that do not have to change. A route has to change -if the port is no longer UP or no longer the MinHop. When routing changes -are performed, the same algorithm for balancing the routes is invoked. - -In the case of using the file based routing, any topology changes are -currently ignored The 'file' routing engine just loads the LFTs from the file -specified, with no reaction to real topology. Obviously, this will not be able -to recheck LIDs (by GUID) for disconnected nodes, and LFTs for non-existent -switches will be skipped. Multicast is not affected by 'file' routing engine -(this uses min hop tables). - - -Min Hop Algorithm - -The Min Hop algorithm is invoked by default if no routing algorithm is -specified. It can also be invoked by specifying '-R minhop'. - -The Min Hop algorithm is divided into two stages: computation of -min-hop tables on every switch and LFT output port assignment. Link -subscription is also equalized with the ability to override based on -port GUID. The latter is supplied by: - --i -.br --ignore-guids - This option provides the means to define a set of ports - (by guid) that will be ignored by the link load - equalization algorithm. Note that only endports (CA, - switch port 0, and router ports) and not switch external - ports are supported. - -LMC awareness routes based on (remote) system or switch basis. - - -Purpose of UPDN Algorithm - -The UPDN algorithm is designed to prevent deadlocks from occurring in loops -of the subnet. A loop-deadlock is a situation in which it is no longer -possible to send data between any two hosts connected through the loop. As -such, the UPDN routing algorithm should be used if the subnet is not a pure -Fat Tree, and one of its loops may experience a deadlock (due, for example, -to high pressure). - -The UPDN algorithm is based on the following main stages: - -1. Auto-detect root nodes - based on the CA hop length from any switch in -the subnet, a statistical histogram is built for each switch (hop num vs -number of occurrences). If the histogram reflects a specific column (higher -than others) for a certain node, then it is marked as a root node. Since -the algorithm is statistical, it may not find any root nodes. The list of -the root nodes found by this auto-detect stage is used by the ranking -process stage. - - Note 1: The user can override the node list manually. - Note 2: If this stage cannot find any root nodes, and the user did - not specify a guid list file, OpenSM defaults back to the - Min Hop routing algorithm. - -2. Ranking process - All root switch nodes (found in stage 1) are assigned -a rank of 0. Using the BFS algorithm, the rest of the switch nodes in the -subnet are ranked incrementally. This ranking aids in the process of enforcing -rules that ensure loop-free paths. - -3. Min Hop Table setting - after ranking is done, a BFS algorithm is run from -each (CA or switch) node in the subnet. During the BFS process, the FDB table -of each switch node traversed by BFS is updated, in reference to the starting -node, based on the ranking rules and guid values. - -At the end of the process, the updated FDB tables ensure loop-free paths -through the subnet. - -Note: Up/Down routing does not allow LID routing communication between -switches that are located inside spine "switch systems". -The reason is that there is no way to allow a LID route between them -that does not break the Up/Down rule. -One ramification of this is that you cannot run SM on switches other -than the leaf switches of the fabric. - - -UPDN Algorithm Usage - -Activation through OpenSM - -Use '-R updn' option (instead of old '-u') to activate the UPDN algorithm. -Use '-a ' for adding an UPDN guid file that contains the -root nodes for ranking. -If the `-a' option is not used, OpenSM uses its auto-detect root nodes -algorithm. - -Notes on the guid list file: - -1. A valid guid file specifies one guid in each line. Lines with an invalid -format will be discarded. -.br -2. The user should specify the root switch guids. However, it is also -possible to specify CA guids; OpenSM will use the guid of the switch (if -it exists) that connects the CA to the subnet as a root node. - - -Fat-tree Routing Algorithm - -The fat-tree algorithm optimizes routing for "shift" communication pattern. -It should be chosen if a subnet is a symmetrical or almost symmetrical -fat-tree of various types. -It supports not just K-ary-N-Trees, by handling for non-constant K, -cases where not all leafs (CAs) are present, any CBB ratio. -As in UPDN, fat-tree also prevents credit-loop-deadlocks. - -If the root guid file is not provided ('-a' or '--root_guid_file' options), -the topology has to be pure fat-tree that complies with the following rules: - - Tree rank should be between two and eight (inclusively) - - Switches of the same rank should have the same number - of UP-going port groups*, unless they are root switches, - in which case the shouldn't have UP-going ports at all. - - Switches of the same rank should have the same number - of DOWN-going port groups, unless they are leaf switches. - - Switches of the same rank should have the same number - of ports in each UP-going port group. - - Switches of the same rank should have the same number - of ports in each DOWN-going port group. - - All the CAs have to be at the same tree level (rank). - -If the root guid file is provided, the topology doesn't have to be pure -fat-tree, and it should only comply with the following rules: - - Tree rank should be between two and eight (inclusively) - - All the Compute Nodes** have to be at the same tree level (rank). - Note that non-compute node CAs are allowed here to be at different - tree ranks. - -* ports that are connected to the same remote switch are referenced as -\'port group\'. - -** list of compute nodes (CNs) can be specified by \'-u\' or \'--cn_guid_file\' -OpenSM options. - -Topologies that do not comply cause a fallback to min hop routing. -Note that this can also occur on link failures which cause the topology -to no longer be "pure" fat-tree. - -Note that although fat-tree algorithm supports trees with non-integer CBB -ratio, the routing will not be as balanced as in case of integer CBB ratio. -In addition to this, although the algorithm allows leaf switches to have any -number of CAs, the closer the tree is to be fully populated, the more -effective the "shift" communication pattern will be. -In general, even if the root list is provided, the closer the topology to a -pure and symmetrical fat-tree, the more optimal the routing will be. - -The algorithm also dumps compute node ordering file (opensm-ftree-ca-order.dump) -in the same directory where the OpenSM log resides. This ordering file provides -the CN order that may be used to create efficient communication pattern, that -will match the routing tables. - -Routing between non-CN nodes - -The use of the cn_guid_file option allows non-CN nodes to be located on different levels in the fat tree. -In such case, it is not guaranteed that the Fat Tree algorithm will route between two non-CN nodes. -To solve this problem, a list of non-CN nodes can be specified by \'-G\' or \'--io_guid_file\' option. -Theses nodes will be allowed to use switches the wrong way round a specific number of times (specified by \'-H\' or \'--max_reverse_hops\'. -With the proper max_reverse_hops and io_guid_file values, you can ensure full connectivity in the Fat Tree. - -Please note that using max_reverse_hops creates routes that use the switch in a counter-stream way. -This option should never be used to connect nodes with high bandwidth traffic between them ! It should only be used -to allow connectivity for HA purposes or similar. -Also having routes the other way around can in theory cause credit loops. - -Use these options with extreme care ! - -Activation through OpenSM - -Use '-R ftree' option to activate the fat-tree algorithm. -Use '-a ' to provide root nodes for ranking. If the `-a' option -is not used, routing algorithm will detect roots automatically. -Use '-u ' to provide the list of compute nodes. If the `-u' option -is not used, all the CAs are considered as compute nodes. - -Note: LMC > 0 is not supported by fat-tree routing. If this is -specified, the default routing algorithm is invoked instead. - - -LASH Routing Algorithm - -LASH is an acronym for LAyered SHortest Path Routing. It is a -deterministic shortest path routing algorithm that enables topology -agnostic deadlock-free routing within communication networks. - -When computing the routing function, LASH analyzes the network -topology for the shortest-path routes between all pairs of sources / -destinations and groups these paths into virtual layers in such a way -as to avoid deadlock. - -Note LASH analyzes routes and ensures deadlock freedom between switch -pairs. The link from HCA between and switch does not need virtual -layers as deadlock will not arise between switch and HCA. - -In more detail, the algorithm works as follows: - -1) LASH determines the shortest-path between all pairs of source / -destination switches. Note, LASH ensures the same SL is used for all -SRC/DST - DST/SRC pairs and there is no guarantee that the return -path for a given DST/SRC will be the reverse of the route SRC/DST. - -2) LASH then begins an SL assignment process where a route is assigned -to a layer (SL) if the addition of that route does not cause deadlock -within that layer. This is achieved by maintaining and analysing a -channel dependency graph for each layer. Once the potential addition -of a path could lead to deadlock, LASH opens a new layer and continues -the process. - -3) Once this stage has been completed, it is highly likely that the -first layers processed will contain more paths than the latter ones. -To better balance the use of layers, LASH moves paths from one layer -to another so that the number of paths in each layer averages out. - -Note, the implementation of LASH in opensm attempts to use as few layers -as possible. This number can be less than the number of actual layers -available. - -In general LASH is a very flexible algorithm. It can, for example, -reduce to Dimension Order Routing in certain topologies, it is topology -agnostic and fares well in the face of faults. - -It has been shown that for both regular and irregular topologies, LASH -outperforms Up/Down. The reason for this is that LASH distributes the -traffic more evenly through a network, avoiding the bottleneck issues -related to a root node and always routes shortest-path. - -The algorithm was developed by Simula Research Laboratory. - - -Use '-R lash -Q ' option to activate the LASH algorithm. - -Note: QoS support has to be turned on in order that SL/VL mappings are -used. - -Note: LMC > 0 is not supported by the LASH routing. If this is -specified, the default routing algorithm is invoked instead. - -For open regular cartesian meshes the DOR algorithm is the ideal -routing algorithm. For toroidal meshes on the other hand there -are routing loops that can cause deadlocks. LASH can be used to -route these cases. The performance of LASH can be improved by -preconditioning the mesh in cases where there are multiple links -connecting switches and also in cases where the switches are not -cabled consistently. An option exists for LASH to do this. To -invoke this use '-R lash -Q --do_mesh_analysis'. This will -add an additional phase that analyses the mesh to try to determine -the dimension and size of a mesh. If it determines that the mesh -looks like an open or closed cartesian mesh it reorders the ports -in dimension order before the rest of the LASH algorithm runs. - -DOR Routing Algorithm - -The Dimension Order Routing algorithm is based on the Min Hop -algorithm and so uses shortest paths. Instead of spreading traffic -out across different paths with the same shortest distance, it chooses -among the available shortest paths based on an ordering of dimensions. -Each port must be consistently cabled to represent a hypercube -dimension or a mesh dimension. Paths are grown from a destination -back to a source using the lowest dimension (port) of available paths -at each step. This provides the ordering necessary to avoid deadlock. -When there are multiple links between any two switches, they still -represent only one dimension and traffic is balanced across them -unless port equalization is turned off. In the case of hypercubes, -the same port must be used throughout the fabric to represent the -hypercube dimension and match on both ends of the cable. In the case -of meshes, the dimension should consistently use the same pair of -ports, one port on one end of the cable, and the other port on the -other end, continuing along the mesh dimension. - -Use '-R dor' option to activate the DOR algorithm. - - -Routing References - -To learn more about deadlock-free routing, see the article -"Deadlock Free Message Routing in Multiprocessor Interconnection Networks" -by William J Dally and Charles L Seitz (1985). - -To learn more about the up/down algorithm, see the article -"Effective Strategy to Compute Forwarding Tables for InfiniBand Networks" -by Jose Carlos Sancho, Antonio Robles, and Jose Duato at the -Universidad Politecnica de Valencia. - -To learn more about LASH and the flexibility behind it, the requirement -for layers, performance comparisons to other algorithms, see the -following articles: - -"Layered Routing in Irregular Networks", Lysne et al, IEEE -Transactions on Parallel and Distributed Systems, VOL.16, No12, -December 2005. - -"Routing for the ASI Fabric Manager", Solheim et al. IEEE -Communications Magazine, Vol.44, No.7, July 2006. - -"Layered Shortest Path (LASH) Routing in Irregular System Area -Networks", Skeie et al. IEEE Computer Society Communication -Architecture for Clusters 2002. - - -Modular Routine Engine - -Modular routing engine structure allows for the ease of -"plugging" new routing modules. - -Currently, only unicast callbacks are supported. Multicast -can be added later. - -One existing routing module is up-down "updn", which may be -activated with '-R updn' option (instead of old '-u'). - -General usage is: -$ opensm -R 'module-name' - -There is also a trivial routing module which is able -to load LFT tables from a file. - -Main features: - - - this will load switch LFTs and/or LID matrices (min hops tables) - - this will load switch LFTs according to the path entries introduced - in the file - - no additional checks will be performed (such as "is port connected", - etc.) - - in case when fabric LIDs were changed this will try to reconstruct - LFTs correctly if endport GUIDs are represented in the file - (in order to disable this, GUIDs may be removed from the file - or zeroed) - -The file format is compatible with output of 'ibroute' util and for -whole fabric can be generated with dump_lfts.sh script. - -To activate file based routing module, use: - - opensm -R file -U /path/to/lfts_file - -If the lfts_file is not found or is in error, the default routing -algorithm is utilized. - -The ability to dump switch lid matrices (aka min hops tables) to file and -later to load these is also supported. - -The usage is similar to unicast forwarding tables loading from a lfts -file (introduced by 'file' routing engine), but new lid matrix file -name should be specified by -M or --lid_matrix_file option. For example: - - opensm -R file -M ./opensm-lid-matrix.dump - -The dump file is named \'opensm-lid-matrix.dump\' and will be generated -in standard opensm dump directory (/var/log by default) when -OSM_LOG_ROUTING logging flag is set. - -When routing engine 'file' is activated, but the lfts file is not specified -or not cannot be open default lid matrix algorithm will be used. - -There is also a switch forwarding tables dumper which generates -a file compatible with dump_lfts.sh output. This file can be used -as input for forwarding tables loading by 'file' routing engine. -Both or one of options -U and -M can be specified together with \'-R file\'. - -.SH FILES -.TP -.B /usr/local/etc/opensm/opensm.conf -default OpenSM config file. - -.TP -.B /usr/local/etc/opensm/ib-node-name-map -default node name map file. See ibnetdiscover for more information on format. - -.TP -.B /usr/local/etc/opensm/partitions.conf -default partition config file - -.TP -.B /usr/local/etc/opensm/qos-policy.conf -default QOS policy config file - -.TP -.B /usr/local/etc/opensm/prefix-routes.conf -default prefix routes file. - -.SH AUTHORS -.TP -Hal Rosenstock -.RI < hal.rosenstock@gmail.com > -.TP -Sasha Khapyorsky -.RI < sashak@voltaire.com > -.TP -Eitan Zahavi -.RI < eitan@mellanox.co.il > -.TP -Yevgeny Kliteynik -.RI < kliteyn@mellanox.co.il > -.TP -Thomas Sodring -.RI < tsodring@simula.no > -.TP -Ira Weiny -.RI < weiny2@llnl.gov > diff --git a/branches/opensm_3/user/man/osmtest.8 b/branches/opensm_3/user/man/osmtest.8 deleted file mode 100644 index a9d29eb8..00000000 --- a/branches/opensm_3/user/man/osmtest.8 +++ /dev/null @@ -1,191 +0,0 @@ -.TH OSMTEST 8 "August 31, 2009" "OpenIB" "OpenIB Management" - -.SH NAME -osmtest \- InfiniBand subnet manager and administration (SM/SA) test program - -.SH SYNOPSIS -.B osmtest -[\-f(low) ] [\-w(ait) ] [\-d(ebug) ] -[\-m(ax_lid) ] [\-g(uid)[=]] [-p(ort)] -[\-i(nventory) ] [\-s(tress)] [\-M(ulticast_Mode)] -[\-t(imeout) ] [\-l | \-\-log_file] [\-v] [\-vf ] -[\-h(elp)] - -.SH DESCRIPTION -.PP -osmtest is a test program to validate InfiniBand subnet manager and -administration (SM/SA). - -Default is to run all flows with the exception of the QoS flow. - -osmtest provides a test suite for opensm. - -osmtest has the following capabilities and testing flows: - -It creates an inventory file of all available Nodes, Ports, and PathRecords, -including all their fields. -It verifies the existing inventory, with all the object fields, and matches it -to a pre-saved one. -A Multicast Compliancy test. -An Event Forwarding test. -A Service Record registration test. -An RMPP stress test. -A Small SA Queries stress test. - -It is recommended that after installing opensm, the user should run -"osmtest -f c" to generate the inventory file, and -immediately afterwards run "osmtest -f a" to test OpenSM. - -Another recommendation for osmtest usage is to create the inventory when the -IB fabric is stable, and occasionally -run "osmtest -v" to verify that nothing has changed. - -.SH OPTIONS - -.PP -.TP -\fB\-f\fR, \fB\-\-flow\fR -This option directs osmtest to run a specific flow: - FLOW DESCRIPTION - c = create an inventory file with all nodes, ports and paths - a = run all validation tests (expecting an input inventory) - v = only validate the given inventory file - s = run service registration, deregistration, and lease test - e = run event forwarding test - f = flood the SA with queries according to the stress mode - m = multicast flow - q = QoS info: dump VLArb and SLtoVL tables - t = run trap 64/65 flow (this flow requires running of external tool) - (default is all flows except QoS) -.TP -\fB\-w\fR, \fB\-\-wait\fR -This option specifies the wait time for trap 64/65 in seconds -It is used only when running -f t - the trap 64/65 flow -(default to 10 sec) -.TP -\fB\-d\fR, \fB\-\-debug\fR -This option specifies a debug option. -These options are not normally needed. -The number following -d selects the debug -option to enable as follows: - - OPT Description - --- ----------------- - -d0 - Ignore other SM nodes - -d1 - Force single threaded dispatching - -d2 - Force log flushing after each log message - -d3 - Disable multicast support -.TP -\fB\-m\fR, \fB\-\-max_lid\fR -This option specifies the maximal LID number to be searched -for during inventory file build (default to 100) -.TP -\fB\-g\fR, \fB\-\-guid\fR -This option specifies the local port GUID value -with which OpenSM should bind. OpenSM may be -bound to 1 port at a time. -If GUID given is 0, OpenSM displays a list -of possible port GUIDs and waits for user input. -Without -g, OpenSM trys to use the default port. -.TP -\fB\-p\fR, \fB\-\-port\fR -This option displays a menu of possible local port GUID values -with which osmtest could bind -.TP -\fB\-i\fR, \fB\-\-inventory\fR -This option specifies the name of the inventory file -Normally, osmtest expects to find an inventory file, -which osmtest uses to validate real-time information -received from the SA during testing -If -i is not specified, osmtest defaults to the file -\'osmtest.dat\' -See -c option for related information -.TP -\fB\-s\fR, \fB\-\-stress\fR -This option runs the specified stress test instead -of the normal test suite -Stress test options are as follows: - - OPT Description - --- ----------------- - -s1 - Single-MAD (RMPP) response SA queries - -s2 - Multi-MAD (RMPP) response SA queries - -s3 - Multi-MAD (RMPP) Path Record SA queries - -s4 - Single-MAD (non RMPP) get Path Record SA queries - -Without -s, stress testing is not performed -.TP -\fB\-M\fR, \fB\-\-Multicast_Mode\fR -This option specify length of Multicast test: - - OPT Description - --- ----------------- - -M1 - Short Multicast Flow (default) - single mode - -M2 - Short Multicast Flow - multiple mode - -M3 - Long Multicast Flow - single mode - -M4 - Long Multicast Flow - multiple mode - -Single mode - Osmtest is tested alone, with no other -apps that interact with OpenSM MC - -Multiple mode - Could be run with other apps using MC with -OpenSM. Without -M, default flow testing is performed -.TP -\fB\-t\fR, \fB\-\-timeout\fR -This option specifies the time in milliseconds -used for transaction timeouts. -Specifying -t 0 disables timeouts. -Without -t, OpenSM defaults to a timeout value of -200 milliseconds. -.TP -\fB\-l\fR, \fB\-\-log_file\fR -This option defines the log to be the given file. -By default the log goes to stdout. -.TP -\fB\-v\fR, \fB\-\-verbose\fR -This option increases the log verbosity level. -The -v option may be specified multiple times -to further increase the verbosity level. -See the -vf option for more information about. -log verbosity. -.TP -\fB\-V\fR -This option sets the maximum verbosity level and -forces log flushing. -The -V is equivalent to '-vf 0xFF -d 2'. -See the -vf option for more information about. -log verbosity. -.TP -\fB\-vf\fR -This option sets the log verbosity level. -A flags field must follow the -D option. -A bit set/clear in the flags enables/disables a -specific log level as follows: - - BIT LOG LEVEL ENABLED - ---- ----------------- - 0x01 - ERROR (error messages) - 0x02 - INFO (basic messages, low volume) - 0x04 - VERBOSE (interesting stuff, moderate volume) - 0x08 - DEBUG (diagnostic, high volume) - 0x10 - FUNCS (function entry/exit, very high volume) - 0x20 - FRAMES (dumps all SMP and GMP frames) - 0x40 - ROUTING (dump FDB routing information) - 0x80 - currently unused. - -Without -vf, osmtest defaults to ERROR + INFO (0x3) -Specifying -vf 0 disables all messages -Specifying -vf 0xFF enables all messages (see -V) -High verbosity levels may require increasing -the transaction timeout with the -t option -.TP -\fB\-h\fR, \fB\-\-help\fR -Display this usage info then exit. - -.SH AUTHORS -.TP -Hal Rosenstock -.RI < hal.rosenstock@gmail.com > -.TP -Eitan Zahavi -.RI < eitan@mellanox.co.il > diff --git a/branches/opensm_3/user/opensm/Makefile b/branches/opensm_3/user/opensm/Makefile deleted file mode 100644 index a0c06273..00000000 --- a/branches/opensm_3/user/opensm/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source -# file to this component. This file merely indirects to the real make file -# that is shared by all the driver components of the OpenIB Windows project. -# - -!INCLUDE ..\..\..\..\inc\openib.def diff --git a/branches/opensm_3/user/opensm/SOURCES b/branches/opensm_3/user/opensm/SOURCES deleted file mode 100644 index 1f0ad940..00000000 --- a/branches/opensm_3/user/opensm/SOURCES +++ /dev/null @@ -1,72 +0,0 @@ - -TARGETNAME=opensm - -!if !defined(WINIBHOME) -WINIBHOME=..\..\..\.. -!endif - -LIBPATH=$(WINIBHOME)\bin\user\obj$(BUILD_ALT_DIR) - -!if defined(OSM_TARGET) -TARGETPATH=$(OSM_TARGET)\bin\user\obj$(BUILD_ALT_DIR) -!else -TARGETPATH=$(LIBPATH) -!endif - -!include ..\mad-vendor.inc - -TARGETTYPE=PROGRAM -UMTYPE=console -UMENTRY=main -USE_MSVCRT=1 - -SOURCES=\ - osm.mc \ - opensm.rc \ - osm_qos_parser_y.c \ - osm_qos_parser_l.c \ - osm_sa_mcmember_record.c \ - osm_sa_path_record.c \ - osm_files.c - -OSM_HOME=.. - -TARGETLIBS= \ - $(SDK_LIB_PATH)\kernel32.lib \ - $(SDK_LIB_PATH)\ws2_32.lib \ -!if $(FREEBUILD) - $(VENDOR_LIBS) \ - $(LIBPATH)\*\complib.lib \ - $(LIBPATH)\*\ibal.lib -!else - $(VENDOR_LIBSD) \ - $(LIBPATH)\*\complibd.lib \ - $(LIBPATH)\*\ibald.lib -!endif - -INCLUDES= \ - $(WINIBHOME)\inc; \ - $(WINIBHOME)\inc\user; \ - $(WINIBHOME)\inc\user\linux; \ - $(VENDOR_INC) \ - $(OSM_HOME); \ - $(OSM_HOME)\include; - -# Could be any special flag needed for this project -#USER_C_FLAGS=$(USER_C_FLAGS) /MD - -#Add preproccessor definitions -C_DEFINES=$(C_DEFINES) -D__WIN__ -DHAVE_CONFIG_H -D$(VENDOR_IF) - -C_DEFINES=$(C_DEFINES) -DWINVER=$(_NT_TARGET_VERSION) - -!if !$(FREEBUILD) -C_DEFINES=$(C_DEFINES) -D_DEBUG -DDEBUG -DDBG -!endif - -LINKER_FLAGS= $(LINKER_FLAGS) - -MSC_WARNING_LEVEL= /W2 /wd4090 /wd4242 /wd4334 /wd4007 - -#MSC_OPTIMIZATION= /O0 - diff --git a/branches/opensm_3/user/opensm/dlfcn.h b/branches/opensm_3/user/opensm/dlfcn.h deleted file mode 100644 index 025b10fa..00000000 --- a/branches/opensm_3/user/opensm/dlfcn.h +++ /dev/null @@ -1,14 +0,0 @@ - - -#define RTLD_LAZY 1 - -void *dlopen(char *lib, int flags) { return (void*)0; } - -void *dlsym(void *hdl, char *sym) -{ - return (void*)0; // always fail. -} - -char * dlerror(void) { return NULL; } - -void dlclose(void *hdl) { } diff --git a/branches/opensm_3/user/opensm/libopensm.map b/branches/opensm_3/user/opensm/libopensm.map deleted file mode 100644 index 00992558..00000000 --- a/branches/opensm_3/user/opensm/libopensm.map +++ /dev/null @@ -1,60 +0,0 @@ -OPENSM_1.5 { - global: - osm_log; - osm_log_msg_box; - osm_is_debug; - osm_log_init; - osm_log_init_v2; - osm_log_reopen_file; - osm_mad_pool_construct; - osm_mad_pool_destroy; - osm_mad_pool_init; - osm_mad_pool_get; - osm_mad_pool_put; - osm_mad_pool_get_wrapper; - osm_mad_pool_get_wrapper_raw; - ib_get_sa_method_str; - ib_get_sm_method_str; - ib_get_sm_attr_str; - ib_get_sa_attr_str; - ib_get_trap_str; - ib_zero_gid; - osm_dump_port_info; - osm_dump_portinfo_record; - osm_dump_guidinfo_record; - osm_dump_node_info; - osm_dump_node_record; - osm_dump_path_record; - osm_dump_multipath_record; - osm_dump_mc_record; - osm_dump_service_record; - osm_dump_inform_info; - osm_dump_inform_info_record; - osm_dump_link_record; - osm_dump_switch_info; - osm_dump_switch_info_record; - osm_dump_pkey_table; - osm_dump_slvl_map_table; - osm_dump_vl_arb_table; - osm_dump_sm_info; - osm_dump_sm_info_record; - osm_dump_notice; - osm_dump_dr_smp; - osm_dump_sa_mad; - osm_dump_dr_path; - osm_dump_smp_dr_path; - osm_dump_pkey_block; - osm_log_raw; - osm_get_sm_state_str; - osm_get_sm_signal_str; - osm_get_disp_msg_str; - osm_get_port_state_str_fixed_width; - osm_get_node_type_str_fixed_width; - osm_get_manufacturer_str; - osm_get_mtu_str; - osm_get_lwa_str; - osm_get_lsa_str; - osm_get_sm_mgr_signal_str; - osm_get_sm_mgr_state_str; - local: *; -}; diff --git a/branches/opensm_3/user/opensm/libopensm.ver b/branches/opensm_3/user/opensm/libopensm.ver deleted file mode 100644 index a04beb5c..00000000 --- a/branches/opensm_3/user/opensm/libopensm.ver +++ /dev/null @@ -1,9 +0,0 @@ -# In this file we track the current API version -# of the opensm common interface (and libraries) -# The version is built of the following -# tree numbers: -# API_REV:RUNNING_REV:AGE -# API_REV - advance on any added API -# RUNNING_REV - advance any change to the vendor files -# AGE - number of backward versions the API still supports -LIBVERSION=4:0:0 diff --git a/branches/opensm_3/user/opensm/main.c b/branches/opensm_3/user/opensm/main.c deleted file mode 100644 index b377dd03..00000000 --- a/branches/opensm_3/user/opensm/main.c +++ /dev/null @@ -1,1532 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * Copyright (c) 2009 System Fabric Works, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Command line interface for opensm. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -volatile unsigned int osm_exit_flag = 0; - -static volatile unsigned int osm_hup_flag = 0; -static volatile unsigned int osm_usr1_flag = 0; - -#define MAX_LOCAL_IBPORTS 64 -#define INVALID_GUID (0xFFFFFFFFFFFFFFFFULL) - -#ifndef __WIN__ - -static void mark_exit_flag(int signum) -{ - if (!osm_exit_flag) - printf("OpenSM: Got signal %d - exiting...\n", signum); - osm_exit_flag = 1; -} - -static void mark_hup_flag(int signum) -{ - osm_hup_flag = 1; -} - -static void mark_usr1_flag(int signum) -{ - osm_usr1_flag = 1; -} - -static sigset_t saved_sigset; - -static void block_signals() -{ - sigset_t set; - - sigemptyset(&set); - sigaddset(&set, SIGINT); - sigaddset(&set, SIGTERM); - sigaddset(&set, SIGHUP); -#ifndef HAVE_OLD_LINUX_THREADS - sigaddset(&set, SIGUSR1); -#endif - pthread_sigmask(SIG_SETMASK, &set, &saved_sigset); -} - -static void setup_signals() -{ - struct sigaction act; - - sigemptyset(&act.sa_mask); - act.sa_handler = mark_exit_flag; - act.sa_flags = 0; - sigaction(SIGINT, &act, NULL); - sigaction(SIGTERM, &act, NULL); - act.sa_handler = mark_hup_flag; - sigaction(SIGHUP, &act, NULL); - sigaction(SIGCONT, &act, NULL); -#ifndef HAVE_OLD_LINUX_THREADS - act.sa_handler = mark_usr1_flag; - sigaction(SIGUSR1, &act, NULL); -#endif - pthread_sigmask(SIG_SETMASK, &saved_sigset, NULL); -} - -#else /* __WIN__ */ - -#ifdef complib_exit -#undef complib_exit -#endif -#define complib_exit() g_service_state = SERVICE_STATE_START_FAILED - -#define block_signals() -#define setup_signals() -#define cl_is_debug osm_is_debug - -HANDLE osm_exit_event = NULL; - -typedef struct _osm_main_args_t -{ - int argc; - char** argv; - boolean_t is_service; -} osm_main_args_t; - -static osm_main_args_t osm_main_args; - -enum service_state { - SERVICE_STATE_STARTING, - SERVICE_STATE_STARTED_OK, - SERVICE_STATE_START_FAILED -}; - -enum service_state g_service_state = SERVICE_STATE_STARTING; - -SERVICE_STATUS OsmServiceStatus; -SERVICE_STATUS_HANDLE OsmServiceStatusHandle; - -void SvcDebugOut(LPSTR String, ... ); -static char *WinErrorStr(DWORD err); -void WINAPI OsmServiceCtrlHandler (DWORD opcode); - -BOOL WINAPI OsmServiceStart (DWORD argc, LPTSTR *argv); - -DWORD OsmServiceInitialization (DWORD argc, LPTSTR *argv, DWORD *specificError); -#endif /* __WIN__ */ - - -/********************************************************************** - **********************************************************************/ - -static void show_usage(void) -{ - printf("\n------- OpenSM - Usage and options ----------------------\n"); - printf("Usage: opensm [options]\n"); - printf("Options:\n"); - printf("--version\n Prints OpenSM version and exits.\n\n"); - printf("--config, -F \n" - " The name of the OpenSM config file. When not specified\n" - " " OSM_DEFAULT_CONFIG_FILE - " will be used (if exists).\n\n"); - printf("--create-config, -c \n" - " OpenSM will dump its configuration to the specified file and exit.\n" - " This is a way to generate OpenSM configuration file template.\n\n"); - printf("--guid, -g \n" - " This option specifies the local port GUID value\n" - " with which OpenSM should bind. OpenSM may be\n" - " bound to 1 port at a time.\n" - " If GUID given is 0, OpenSM displays a list\n" - " of possible port GUIDs and waits for user input.\n" - " Without -g, OpenSM tries to use the default port.\n\n"); - printf("--lmc, -l \n" - " This option specifies the subnet's LMC value.\n" - " The number of LIDs assigned to each port is 2^LMC.\n" - " The LMC value must be in the range 0-7.\n" - " LMC values > 0 allow multiple paths between ports.\n" - " LMC values > 0 should only be used if the subnet\n" - " topology actually provides multiple paths between\n" - " ports, i.e. multiple interconnects between switches.\n" - " Without -l, OpenSM defaults to LMC = 0, which allows\n" - " one path between any two ports.\n\n"); - printf("--priority, -p \n" - " This option specifies the SM's PRIORITY.\n" - " This will effect the handover cases, where master\n" - " is chosen by priority and GUID. Range goes\n" - " from 0 (lowest priority) to 15 (highest).\n\n"); - printf("--smkey, -k \n" - " This option specifies the SM's SM_Key (64 bits).\n" - " This will effect SM authentication.\n" - " Note that OpenSM version 3.2.1 and below used the\n" - " default value '1' in a host byte order, it is fixed\n" - " now but you may need this option to interoperate\n" - " with old OpenSM running on a little endian machine.\n\n"); - printf("--reassign_lids, -r\n" - " This option causes OpenSM to reassign LIDs to all\n" - " end nodes. Specifying -r on a running subnet\n" - " may disrupt subnet traffic.\n" - " Without -r, OpenSM attempts to preserve existing\n" - " LID assignments resolving multiple use of same LID.\n\n"); - printf("--routing_engine, -R \n" - " This option chooses routing engine(s) to use instead of default\n" - " Min Hop algorithm. Multiple routing engines can be specified\n" - " separated by commas so that specific ordering of routing\n" - " algorithms will be tried if earlier routing engines fail.\n" - " Supported engines: updn, file, ftree, lash, dor\n\n"); - printf("--do_mesh_analysis\n" - " This option enables additional analysis for the lash\n" - " routing engine to precondition switch port assignments\n" - " in regular cartesian meshes which may reduce the number\n" - " of SLs required to give a deadlock free routing\n\n"); - printf("--lash_start_vl \n" - " Sets the starting VL to use for the lash routing algorithm.\n" - " Defaults to 0.\n"); - printf("--sm_sl \n" - " Sets the SL to use to communicate with the SM/SA. Defaults to 0.\n\n"); - printf("--connect_roots, -z\n" - " This option enforces routing engines (up/down and \n" - " fat-tree) to make connectivity between root switches\n" - " and in this way be IBA compliant. In many cases,\n" - " this can violate \"pure\" deadlock free algorithm, so\n" - " use it carefully.\n\n"); - printf("--ucast_cache, -A\n" - " This option enables unicast routing cache to prevent\n" - " routing recalculation (which is a heavy task in a\n" - " large cluster) when there was no topology change\n" - " detected during the heavy sweep, or when the topology\n" - " change does not require new routing calculation,\n" - " e.g. in case of host reboot.\n" - " This option becomes very handy when the cluster size\n" - " is thousands of nodes.\n\n"); - printf("--lid_matrix_file, -M \n" - " This option specifies the name of the lid matrix dump file\n" - " from where switch lid matrices (min hops tables will be\n" - " loaded.\n\n"); - printf("--lfts_file, -U \n" - " This option specifies the name of the LFTs file\n" - " from where switch forwarding tables will be loaded.\n\n"); - printf("--sadb_file, -S \n" - " This option specifies the name of the SA DB dump file\n" - " from where SA database will be loaded.\n\n"); - printf("--root_guid_file, -a \n" - " Set the root nodes for the Up/Down or Fat-Tree routing\n" - " algorithm to the guids provided in the given file (one\n" - " to a line)\n" "\n"); - printf("--cn_guid_file, -u \n" - " Set the compute nodes for the Fat-Tree routing algorithm\n" - " to the guids provided in the given file (one to a line)\n\n"); - printf("--io_guid_file, -G \n" - " Set the I/O nodes for the Fat-Tree routing algorithm\n" - " to the guids provided in the given file (one to a line)\n\n"); - printf("--max_reverse_hops, -H \n" - " Set the max number of hops the wrong way around\n" - " an I/O node is allowed to do (connectivity for I/O nodes on top swithces)\n\n"); - printf("--ids_guid_file, -m \n" - " Name of the map file with set of the IDs which will be used\n" - " by Up/Down routing algorithm instead of node GUIDs\n" - " (format: per line)\n\n"); - printf("--guid_routing_order_file, -X \n" - " Set the order port guids will be routed for the MinHop\n" - " and Up/Down routing algorithms to the guids provided in the\n" - " given file (one to a line)\n\n"); - printf("--once, -o\n" - " This option causes OpenSM to configure the subnet\n" - " once, then exit. Ports remain in the ACTIVE state.\n\n"); - printf("--sweep, -s \n" - " This option specifies the number of seconds between\n" - " subnet sweeps. Specifying -s 0 disables sweeping.\n" - " Without -s, OpenSM defaults to a sweep interval of\n" - " 10 seconds.\n\n"); - printf("--timeout, -t \n" - " This option specifies the time in milliseconds\n" - " used for transaction timeouts.\n" - " Specifying -t 0 disables timeouts.\n" - " Without -t, OpenSM defaults to a timeout value of\n" - " 200 milliseconds.\n\n"); - printf("--retries \n" - " This option specifies the number of retries used\n" - " for transactions.\n" - " Without --retries, OpenSM defaults to %u retries\n" - " for transactions.\n\n", OSM_DEFAULT_RETRY_COUNT); - printf("--maxsmps, -n \n" - " This option specifies the number of VL15 SMP MADs\n" - " allowed on the wire at any one time.\n" - " Specifying --maxsmps 0 allows unlimited outstanding\n" - " SMPs.\n" - " Without --maxsmps, OpenSM defaults to a maximum of\n" - " 4 outstanding SMPs.\n\n"); - printf("--console, -q [off|local" -#ifdef ENABLE_OSM_CONSOLE_SOCKET - "|socket|loopback" -#endif - "]\n This option activates the OpenSM console (default off).\n\n"); -#ifdef ENABLE_OSM_CONSOLE_SOCKET - printf("--console-port, -C \n" - " Specify an alternate telnet port for the console (default %d).\n\n", - OSM_DEFAULT_CONSOLE_PORT); -#endif - printf("--ignore-guids, -i \n" - " This option provides the means to define a set of ports\n" - " (by guid) that will be ignored by the link load\n" - " equalization algorithm.\n\n"); - printf("--hop_weights_file, -w \n" - " This option provides the means to define a weighting\n" - " factor per port for customizing the least weight\n" - " hops for the routing.\n\n"); - printf("--dimn_ports_file, -O \n" - " This option provides the means to define a mapping\n" - " between ports and dimension (Order) for controlling\n" - " Dimension Order Routing (DOR).\n\n"); - printf("--honor_guid2lid, -x\n" - " This option forces OpenSM to honor the guid2lid file,\n" - " when it comes out of Standby state, if such file exists\n" - " under OSM_CACHE_DIR, and is valid. By default, this is FALSE.\n\n"); - printf("--log_file, -f \n" - " This option defines the log to be the given file.\n" - " By default, the log goes to /var/log/opensm.log.\n" - " For the log to go to standard output use -f stdout.\n\n"); - printf("--log_limit, -L \n" - " This option defines maximal log file size in MB. When\n" - " specified the log file will be truncated upon reaching\n" - " this limit.\n\n"); - printf("--erase_log_file, -e\n" - " This option will cause deletion of the log file\n" - " (if it previously exists). By default, the log file\n" - " is accumulative.\n\n"); - printf("--Pconfig, -P \n" - " This option defines the optional partition configuration file.\n" - " The default name is \'" - OSM_DEFAULT_PARTITION_CONFIG_FILE "\'.\n\n"); - printf("--no_part_enforce, -N\n" - " This option disables partition enforcement on switch external ports.\n\n"); - printf("--qos, -Q\n" " This option enables QoS setup.\n\n"); - printf("--qos_policy_file, -Y \n" - " This option defines the optional QoS policy file.\n" - " The default name is \'" OSM_DEFAULT_QOS_POLICY_FILE - "\'.\n\n"); - printf("--stay_on_fatal, -y\n" - " This option will cause SM not to exit on fatal initialization\n" - " issues: if SM discovers duplicated guids or 12x link with\n" - " lane reversal badly configured.\n" - " By default, the SM will exit on these errors.\n\n"); - printf("--daemon, -B\n" - " Run in daemon mode - OpenSM will run in the background.\n\n"); - printf("--inactive, -I\n" - " Start SM in inactive rather than normal init SM state.\n\n"); -#ifdef ENABLE_OSM_PERF_MGR - printf("--perfmgr\n" " Start with PerfMgr enabled.\n\n"); - printf("--perfmgr_sweep_time_s \n" - " PerfMgr sweep interval in seconds.\n\n"); -#endif - printf("--prefix_routes_file \n" - " This option specifies the prefix routes file.\n" - " Prefix routes control how the SA responds to path record\n" - " queries for off-subnet DGIDs. Default file is:\n" - " " OSM_DEFAULT_PREFIX_ROUTES_FILE "\n\n"); - printf("--consolidate_ipv6_snm_req\n" - " Use shared MLID for IPv6 Solicited Node Multicast groups\n" - " per MGID scope and P_Key.\n\n"); - printf("--log_prefix \n" - " Prefix to syslog messages from OpenSM.\n\n"); - printf("--verbose, -v\n" - " This option increases the log verbosity level.\n" - " The -v option may be specified multiple times\n" - " to further increase the verbosity level.\n" - " See the -D option for more information about\n" - " log verbosity.\n\n"); - printf("--V, -V\n" - " This option sets the maximum verbosity level and\n" - " forces log flushing.\n" - " The -V is equivalent to '-D 0xFF -d 2'.\n" - " See the -D option for more information about\n" - " log verbosity.\n\n"); - printf("--D, -D \n" - " This option sets the log verbosity level.\n" - " A flags field must follow the -D option.\n" - " A bit set/clear in the flags enables/disables a\n" - " specific log level as follows:\n" - " BIT LOG LEVEL ENABLED\n" - " ---- -----------------\n" - " 0x01 - ERROR (error messages)\n" - " 0x02 - INFO (basic messages, low volume)\n" - " 0x04 - VERBOSE (interesting stuff, moderate volume)\n" - " 0x08 - DEBUG (diagnostic, high volume)\n" - " 0x10 - FUNCS (function entry/exit, very high volume)\n" - " 0x20 - FRAMES (dumps all SMP and GMP frames)\n" - " 0x40 - ROUTING (dump FDB routing information)\n" - " 0x80 - currently unused.\n" - " Without -D, OpenSM defaults to ERROR + INFO (0x3).\n" - " Specifying -D 0 disables all messages.\n" - " Specifying -D 0xFF enables all messages (see -V).\n" - " High verbosity levels may require increasing\n" - " the transaction timeout with the -t option.\n\n"); - printf("--debug, -d \n" - " This option specifies a debug option.\n" - " These options are not normally needed.\n" - " The number following -d selects the debug\n" - " option to enable as follows:\n" - " OPT Description\n" - " --- -----------------\n" - " -d0 - Ignore other SM nodes\n" - " -d1 - Force single threaded dispatching\n" - " -d2 - Force log flushing after each log message\n" - " -d3 - Disable multicast support\n" - " -d10 - Put OpenSM in testability mode\n" - " Without -d, no debug options are enabled\n\n"); - printf("--help, -h, -?\n" - " Display this usage info then exit.\n\n"); -#ifdef __WIN__ - printf("\nExtended OpenSM Service Control:\n"); - printf(" 'sc control OpenSM 128' Clear OSM Log file.\n"); - printf(" 'sc control OpenSM 129' Start a Heavy Sweep.\n"); -#endif - fflush(stdout); - exit(2); -} - -static ib_net64_t get_port_guid(IN osm_opensm_t * p_osm, uint64_t port_guid) -{ - ib_port_attr_t attr_array[MAX_LOCAL_IBPORTS]; - uint32_t num_ports = MAX_LOCAL_IBPORTS; - uint32_t i, choice = 0; - ib_api_status_t status; - - for (i = 0; i < num_ports; i++) { - attr_array[i].num_pkeys = 0; - attr_array[i].p_pkey_table = NULL; - } - - /* Call the transport layer for a list of local port GUID values */ - status = osm_vendor_get_all_port_attr(p_osm->p_vendor, attr_array, - &num_ports); - if (status != IB_SUCCESS) { - printf("\nError from osm_vendor_get_all_port_attr (%x)\n", - status); - return 0; - } - - /* if num_ports is 0 - return 0 */ - if (num_ports == 0) { - printf("\nNo local ports detected!\n"); - return 0; - } - /* If num_ports is 1, then there is only one possible port to use. - * Use it. */ - if (num_ports == 1) { - printf("Using default GUID 0x%" PRIx64 "\n", - cl_hton64(attr_array[0].port_guid)); - return attr_array[0].port_guid; - } - /* If port_guid is 0 - use the first connected port */ - if (port_guid == 0) { - for (i = 0; i < num_ports; i++) - if (attr_array[i].link_state > IB_LINK_DOWN) - break; - if (i == num_ports) - i = 0; - printf("Using default GUID 0x%" PRIx64 "\n", - cl_hton64(attr_array[i].port_guid)); - return attr_array[i].port_guid; - } - - if (p_osm->subn.opt.daemon) - return 0; - - /* More than one possible port - list all ports and let the user - * to choose. */ - while (1) { - printf("\nChoose a local port number with which to bind:\n\n"); - for (i = 0; i < num_ports; i++) - /* Print the index + 1 since by convention, port - * numbers start with 1 on host channel adapters. */ - printf("\t%u: GUID 0x%" PRIx64 ", lid %u, state %s\n", - i + 1, cl_ntoh64(attr_array[i].port_guid), - attr_array[i].lid, - ib_get_port_state_str(attr_array[i].link_state)); - printf("\n\t0: Exit\n"); - printf("\nEnter choice (0-%u): ", i); - fflush(stdout); - if (scanf("%u", &choice) <= 0) { - char junk[128]; - if (scanf("%s", junk) <= 0) - printf("\nError: Cannot scan!\n"); - } else if (choice == 0) - return 0; - else if (choice <= num_ports) - break; - printf("\nError: Lame choice! Please try again.\n"); - } - choice--; - printf("Choice guid=0x%" PRIx64 "\n", - cl_ntoh64(attr_array[choice].port_guid)); - return attr_array[choice].port_guid; -} - -#ifndef __WIN__ - -static int daemonize(osm_opensm_t * osm) -{ - pid_t pid; - int fd; - - fd = open("/dev/null", O_WRONLY); - if (fd < 0) { - perror("open"); - return -1; - } - - if ((pid = fork()) < 0) { - perror("fork"); - exit(-1); - } else if (pid > 0) - exit(0); - - setsid(); - - if ((pid = fork()) < 0) { - perror("fork"); - exit(-1); - } else if (pid > 0) - exit(0); - - close(0); - close(1); - close(2); - - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - - return 0; -} - -#else /* __WIN__ */ - -static int daemonize(osm_opensm_t * osm) -{ - return 0; -} - -#endif /* ndef __WIN__ */ - -/********************************************************************** - **********************************************************************/ -int osm_manager_loop(osm_subn_opt_t * p_opt, osm_opensm_t * p_osm) -{ - int console_init_flag = 0; - - if (is_console_enabled(p_opt)) { - if (!osm_console_init(p_opt, &p_osm->console, &p_osm->log)) - console_init_flag = 1; - } - - /* - Sit here forever - dwell or do console i/o & cmds - */ - while (!osm_exit_flag) { - if (console_init_flag) { - if (osm_console(p_osm)) - console_init_flag = 0; - } else - cl_thread_suspend(10000); - - if (osm_usr1_flag) { - osm_usr1_flag = 0; - osm_log_reopen_file(&(p_osm->log)); - } - if (osm_hup_flag) { - osm_hup_flag = 0; - /* a HUP signal should only start a new heavy sweep */ - p_osm->subn.force_heavy_sweep = TRUE; - osm_opensm_sweep(p_osm); - } - } - if (is_console_enabled(p_opt)) - osm_console_exit(&p_osm->console, &p_osm->log); - return 0; -} - -#define SET_STR_OPT(opt, val) do { \ - opt = val ? strdup(val) : NULL ; \ -} while (0) - - -int -opensm_main(void *OsmMainArgs) -{ - int argc = ((osm_main_args_t*)OsmMainArgs)->argc; - char** argv = ((osm_main_args_t*)OsmMainArgs)->argv; - osm_opensm_t osm = {0}; - osm_subn_opt_t opt; - ib_net64_t sm_key = 0; - ib_api_status_t status; - int32_t temp; - uint32_t dbg_lvl; - boolean_t run_once_flag = FALSE; - int32_t vendor_debug = 0; - int next_option; - char *conf_template = NULL, *config_file = NULL; - uint32_t val; - const char *const short_option = -#ifdef __WIN__ - "?" -#endif - "F:c:i:w:O:f:ed:D:g:l:L:s:t:a:u:m:X:R:zM:U:S:P:Y:ANBIQvVhoryxp:n:q:k:C:G:H:"; - - /* - In the array below, the 2nd parameter specifies the number - of arguments as follows: - 0: no arguments - 1: argument - 2: optional - */ - const struct option long_option[] = { - {"version", 0, NULL, 12}, - {"config", 1, NULL, 'F'}, - {"create-config", 1, NULL, 'c'}, - {"debug", 1, NULL, 'd'}, - {"guid", 1, NULL, 'g'}, - {"ignore_guids", 1, NULL, 'i'}, - {"hop_weights_file", 1, NULL, 'w'}, - {"dimn_ports_file", 1, NULL, 'O'}, - {"lmc", 1, NULL, 'l'}, - {"sweep", 1, NULL, 's'}, - {"timeout", 1, NULL, 't'}, - {"verbose", 0, NULL, 'v'}, - {"D", 1, NULL, 'D'}, - {"log_file", 1, NULL, 'f'}, - {"log_limit", 1, NULL, 'L'}, - {"erase_log_file", 0, NULL, 'e'}, - {"Pconfig", 1, NULL, 'P'}, - {"no_part_enforce", 0, NULL, 'N'}, - {"qos", 0, NULL, 'Q'}, - {"qos_policy_file", 1, NULL, 'Y'}, - {"maxsmps", 1, NULL, 'n'}, - {"console", 1, NULL, 'q'}, - {"V", 0, NULL, 'V'}, - {"help", 0, NULL, 'h'}, - {"once", 0, NULL, 'o'}, - {"reassign_lids", 0, NULL, 'r'}, - {"priority", 1, NULL, 'p'}, - {"smkey", 1, NULL, 'k'}, - {"routing_engine", 1, NULL, 'R'}, - {"ucast_cache", 0, NULL, 'A'}, - {"connect_roots", 0, NULL, 'z'}, - {"lid_matrix_file", 1, NULL, 'M'}, - {"lfts_file", 1, NULL, 'U'}, - {"sadb_file", 1, NULL, 'S'}, - {"root_guid_file", 1, NULL, 'a'}, - {"cn_guid_file", 1, NULL, 'u'}, - {"io_guid_file", 1, NULL, 'G'}, - {"max_reverse_hops", 1, NULL, 'H'}, - {"ids_guid_file", 1, NULL, 'm'}, - {"guid_routing_order_file", 1, NULL, 'X'}, - {"stay_on_fatal", 0, NULL, 'y'}, - {"honor_guid2lid", 0, NULL, 'x'}, -#ifdef ENABLE_OSM_CONSOLE_SOCKET - {"console-port", 1, NULL, 'C'}, -#endif - {"service", 0, NULL, 'B'}, - {"daemon", 0, NULL, 'B'}, - {"inactive", 0, NULL, 'I'}, -#ifdef ENABLE_OSM_PERF_MGR - {"perfmgr", 0, NULL, 1}, - {"perfmgr_sweep_time_s", 1, NULL, 2}, -#endif - {"prefix_routes_file", 1, NULL, 3}, - {"consolidate_ipv6_snm_req", 0, NULL, 4}, - {"do_mesh_analysis", 0, NULL, 5}, - {"lash_start_vl", 1, NULL, 6}, - {"sm_sl", 1, NULL, 7}, - {"retries", 1, NULL, 8}, - {"log_prefix", 1, NULL, 9}, - {NULL, 0, NULL, 0} /* Required at the end of the array */ - }; - - /* Make sure that the opensm and complib were compiled using - same modes (debug/free) */ - if (osm_is_debug() != cl_is_debug()) { - fprintf(stderr, - "ERROR: OpenSM and Complib were compiled using different modes\n"); - fprintf(stderr, "ERROR: OpenSM debug:%d Complib debug:%d \n", - osm_is_debug(), cl_is_debug()); - exit(1); - } - -#ifdef __WIN__ - if (osm_main_args.is_service) { - // incorporate Windows system event log write() - // printf("%s\n", OSM_VERSION); - } - else { - printf("-------------------------------------------------\n"); - printf("%s\n", OSM_VERSION); - } -#else - printf("-------------------------------------------------\n"); - printf("%s\n", OSM_VERSION); -#endif - - osm_subn_set_default_opt(&opt); - - if (osm_subn_parse_conf_file(OSM_DEFAULT_CONFIG_FILE, &opt) < 0) - printf("\nFail to parse config file \'%s\'\n", - OSM_DEFAULT_CONFIG_FILE); - - do { - next_option = getopt_long_only(argc, argv, short_option, - long_option, NULL); - switch (next_option) { - case 'F': - config_file = optarg; - printf("Config file is `%s`:\n", config_file); - break; - default: - break; - } - } while (next_option != -1); - - optind = 0; /* reset command line */ - - if (config_file && osm_subn_parse_conf_file(config_file, &opt) < 0) - printf("\nFail to parse config file \'%s\'\n", config_file); - - printf("Command Line Arguments:\n"); - do { - next_option = getopt_long_only(argc, argv, short_option, - long_option, NULL); - switch (next_option) { - case 12: /* --version - already printed above */ - exit(0); - break; - case 'F': - break; - case 'c': - conf_template = optarg; - printf(" Creating config file template \'%s\'.\n", - conf_template); - break; - case 'o': - /* - Run once option. - */ - run_once_flag = TRUE; - printf(" Run Once\n"); - break; - - case 'r': - /* - Reassign LIDs subnet option. - */ - opt.reassign_lids = TRUE; - printf(" Reassign LIDs\n"); - break; - - case 'i': - /* - Specifies ignore guids file. - */ - SET_STR_OPT(opt.port_prof_ignore_file, optarg); - printf(" Ignore Guids File = %s\n", - opt.port_prof_ignore_file); - break; - - case 'w': - opt.hop_weights_file = optarg; - printf(" Hop Weights File = %s\n", - opt.hop_weights_file); - break; - - case 'O': - opt.dimn_ports_file = optarg; - printf(" Dimension Ports File = %s\n", - opt.dimn_ports_file); - break; - - case 'g': - /* - Specifies port guid with which to bind. - */ - opt.guid = cl_hton64(strtoull(optarg, NULL, 16)); - if (!opt.guid) - /* If guid is 0 - need to display the - * guid list */ - opt.guid = INVALID_GUID; - else - printf(" Guid <0x%" PRIx64 ">\n", - cl_hton64(opt.guid)); - break; - - case 's': - val = strtol(optarg, NULL, 0); - /* Check that the number is not too large */ - if (((uint32_t) (val * 1000000)) / 1000000 != val) - fprintf(stderr, - "ERROR: sweep interval given is too large. Ignoring it.\n"); - else { - opt.sweep_interval = val; - printf(" sweep interval = %d\n", - opt.sweep_interval); - } - break; - - case 't': - opt.transaction_timeout = strtoul(optarg, NULL, 0); - printf(" Transaction timeout = %u\n", - opt.transaction_timeout); - break; - - case 'n': - opt.max_wire_smps = strtoul(optarg, NULL, 0); - if (opt.max_wire_smps == 0 || - opt.max_wire_smps > 0x7FFFFFFF) - opt.max_wire_smps = 0x7FFFFFFF; - printf(" Max wire smp's = %d\n", opt.max_wire_smps); - break; - - case 'q': - /* - * OpenSM interactive console - */ - if (strcmp(optarg, OSM_DISABLE_CONSOLE) == 0 - || strcmp(optarg, OSM_LOCAL_CONSOLE) == 0 -#ifdef ENABLE_OSM_CONSOLE_SOCKET - || strcmp(optarg, OSM_REMOTE_CONSOLE) == 0 - || strcmp(optarg, OSM_LOOPBACK_CONSOLE) == 0 -#endif - ) - SET_STR_OPT(opt.console, optarg); - else - printf("-console %s option not understood\n", - optarg); - break; - -#ifdef ENABLE_OSM_CONSOLE_SOCKET - case 'C': - opt.console_port = strtol(optarg, NULL, 0); - break; -#endif - - case 'd': - dbg_lvl = strtol(optarg, NULL, 0); - printf(" d level = 0x%x\n", dbg_lvl); - if (dbg_lvl == 0) { - printf(" Debug mode: Ignore Other SMs\n"); - opt.ignore_other_sm = TRUE; - } else if (dbg_lvl == 1) { - printf(" Debug mode: Forcing Single Thread\n"); - opt.single_thread = TRUE; - } else if (dbg_lvl == 2) { - printf(" Debug mode: Force Log Flush\n"); - opt.force_log_flush = TRUE; - } else if (dbg_lvl == 3) { - printf - (" Debug mode: Disable multicast support\n"); - opt.disable_multicast = TRUE; - } - /* - * NOTE: Debug level 4 used to be used for memory - * tracking but this is now deprecated - */ - else if (dbg_lvl == 5) - vendor_debug++; - else - printf(" OpenSM: Unknown debug option %d" - " ignored\n", dbg_lvl); - break; - - case 'l': - temp = strtol(optarg, NULL, 0); - if (temp > 7) { - fprintf(stderr, - "ERROR: LMC must be 7 or less.\n"); - return -1; - } - opt.lmc = (uint8_t) temp; - printf(" LMC = %d\n", temp); - break; - - case 'D': - opt.log_flags = strtol(optarg, NULL, 0); - printf(" verbose option -D = 0x%x\n", opt.log_flags); - break; - - case 'f': - SET_STR_OPT(opt.log_file, optarg); - break; - - case 'L': - opt.log_max_size = strtoul(optarg, NULL, 0); - printf(" Log file max size is %lu MBytes\n", - opt.log_max_size); - break; - - case 'e': - opt.accum_log_file = FALSE; - printf(" Creating new log file\n"); - break; - - case 'P': - SET_STR_OPT(opt.partition_config_file, optarg); - break; - - case 'N': - opt.no_partition_enforcement = TRUE; - break; - - case 'Q': - opt.qos = TRUE; - break; - - case 'Y': - SET_STR_OPT(opt.qos_policy_file, optarg); - printf(" QoS policy file \'%s\'\n", optarg); - break; - - case 'y': - opt.exit_on_fatal = FALSE; - printf(" Staying on fatal initialization errors\n"); - break; - - case 'v': - opt.log_flags = (opt.log_flags << 1) | 1; - printf(" Verbose option -v (log flags = 0x%X)\n", - opt.log_flags); - break; - - case 'V': - opt.log_flags = 0xFF; - opt.force_log_flush = TRUE; - printf(" Big V selected\n"); - break; - - case 'p': - temp = strtol(optarg, NULL, 0); - if (0 > temp || 15 < temp) { - fprintf(stderr, - "ERROR: priority must be between 0 and 15\n"); - return -1; - } - opt.sm_priority = (uint8_t) temp; - printf(" Priority = %d\n", temp); - break; - - case 'k': - sm_key = cl_hton64(strtoull(optarg, NULL, 16)); - printf(" SM Key <0x%" PRIx64 ">\n", cl_hton64(sm_key)); - opt.sm_key = sm_key; - break; - - case 'R': - SET_STR_OPT(opt.routing_engine_names, optarg); - printf(" Activate \'%s\' routing engine(s)\n", optarg); - break; - - case 'z': - opt.connect_roots = TRUE; - printf(" Connect roots option is on\n"); - break; - - case 'A': - opt.use_ucast_cache = TRUE; - printf(" Unicast routing cache option is on\n"); - break; - - case 'M': - SET_STR_OPT(opt.lid_matrix_dump_file, optarg); - printf(" Lid matrix dump file is \'%s\'\n", optarg); - break; - - case 'U': - SET_STR_OPT(opt.lfts_file, optarg); - printf(" LFTs file is \'%s\'\n", optarg); - break; - - case 'S': - SET_STR_OPT(opt.sa_db_file, optarg); - printf(" SA DB file is \'%s\'\n", optarg); - break; - - case 'a': - SET_STR_OPT(opt.root_guid_file, optarg); - printf(" Root Guid File: %s\n", opt.root_guid_file); - break; - - case 'u': - SET_STR_OPT(opt.cn_guid_file, optarg); - printf(" Compute Node Guid File: %s\n", - opt.cn_guid_file); - break; - - case 'G': - opt.io_guid_file = optarg; - printf(" I/O Node Guid File: %s\n", opt.io_guid_file); - break; - case 'H': - opt.max_reverse_hops = atoi(optarg); - printf(" Max Reverse Hops: %d\n", opt.max_reverse_hops); - break; - case 'm': - SET_STR_OPT(opt.ids_guid_file, optarg); - printf(" IDs Guid File: %s\n", opt.ids_guid_file); - break; - - case 'X': - SET_STR_OPT(opt.guid_routing_order_file, optarg); - printf(" GUID Routing Order File: %s\n", - opt.guid_routing_order_file); - break; - - case 'x': - opt.honor_guid2lid_file = TRUE; - printf(" Honor guid2lid file, if possible\n"); - break; - - case 'B': - opt.daemon = TRUE; - printf(" Daemon mode\n"); - break; - - case 'I': - opt.sm_inactive = TRUE; - printf(" SM started in inactive state\n"); - break; - -#ifdef ENABLE_OSM_PERF_MGR - case 1: - opt.perfmgr = TRUE; - break; - case 2: - opt.perfmgr_sweep_time_s = atoi(optarg); - break; -#endif /* ENABLE_OSM_PERF_MGR */ - - case 3: - SET_STR_OPT(opt.prefix_routes_file, optarg); - break; - case 4: - opt.consolidate_ipv6_snm_req = TRUE; - break; - case 5: - opt.do_mesh_analysis = TRUE; - break; - case 6: - temp = strtol(optarg, NULL, 0); - if (temp < 0 || temp >= IB_MAX_NUM_VLS) { - fprintf(stderr, - "ERROR: starting lash vl must be between 0 and 15\n"); - return -1; - } - opt.lash_start_vl = (uint8_t) temp; - printf(" LASH starting VL = %d\n", opt.lash_start_vl); - break; - case 7: - temp = strtol(optarg, NULL, 0); - if (temp < 0 || temp > 15) { - fprintf(stderr, - "ERROR: SM's SL must be between 0 and 15\n"); - return -1; - } - opt.sm_sl = (uint8_t) temp; - printf(" SMSL = %d\n", opt.sm_sl); - break; - case 8: - opt.transaction_retries = strtoul(optarg, NULL, 0); - printf(" Transaction retries = %u\n", - opt.transaction_retries); - break; - case 9: - SET_STR_OPT(opt.log_prefix, optarg); - printf("Log prefix = %s\n", opt.log_prefix); - break; - case 'h': - case '?': - case ':': - show_usage(); - break; - - case -1: - break; /* done with option */ - default: /* something wrong */ - abort(); - } - } while (next_option != -1); - -#ifdef __WIN__ - if (osm_main_args.is_service) { - if (is_console_enabled(&opt)) { - free(opt.console); - opt.console = strdup(OSM_DISABLE_CONSOLE); - } - } -#endif - if (opt.log_file != NULL) - printf(" Log File: %s\n", opt.log_file); - /* Done with options description */ - printf("-------------------------------------------------\n"); - - if (conf_template) { - status = osm_subn_write_conf_file(conf_template, &opt); - if (status) - printf("\nosm_subn_write_conf_file failed!\n"); - exit(status); - } - - osm_subn_verify_config(&opt); - - if (vendor_debug) - osm_vendor_set_debug(osm.p_vendor, vendor_debug); - - block_signals(); - - if (opt.daemon) - daemonize(&osm); - - complib_init(); - - status = osm_opensm_init(&osm, &opt); - if (status != IB_SUCCESS) { - const char *err_str = ib_get_err_str(status); - if (err_str == NULL) - err_str = "Unknown Error Type"; - printf("\nError from osm_opensm_init: %s.\n", err_str); - /* We will just exit, and not go to Exit, since we don't - want the destroy to be called. */ - complib_exit(); - return status; - } - - /* - If the user didn't specify a GUID on the command line, - then get a port GUID value with which to bind. - */ - if (opt.guid == 0 || cl_hton64(opt.guid) == CL_HTON64(INVALID_GUID)) - opt.guid = get_port_guid(&osm, opt.guid); - - if (opt.guid == 0) - goto Exit; - - status = osm_opensm_bind(&osm, opt.guid); - if (status != IB_SUCCESS) { - printf("\nError from osm_opensm_bind (0x%X)\n", status); - printf - ("Perhaps another instance of OpenSM is already running\n"); - goto Exit; - } - - setup_signals(); - - osm_opensm_sweep(&osm); - - if (run_once_flag == TRUE) { - while (!osm_exit_flag) { - status = - osm_opensm_wait_for_subnet_up(&osm, - osm.subn.opt. - sweep_interval * - 1000000, TRUE); - if (!status) - osm_exit_flag = 1; - } - } else { - /* - * Sit here until signaled to exit - */ - osm_manager_loop(&opt, &osm); - } - - if (osm.mad_pool.mads_out) { - fprintf(stdout, - "There are still %u MADs out. Forcing the exit of the OpenSM application...\n", - osm.mad_pool.mads_out); -#ifdef HAVE_LIBPTHREAD - pthread_cond_signal(&osm.stats.cond); -#else - cl_event_signal(&osm.stats.event); -#endif - } - -Exit: - osm_opensm_destroy(&osm); - complib_exit(); - - return 0; -} - -#ifdef __WIN__ - -int -main(int argc, char **argv) -{ - int i; - boolean_t run_as_service = FALSE; - SERVICE_TABLE_ENTRY DispatchTable[] = - { - { "OpenSM", (LPSERVICE_MAIN_FUNCTION) OsmServiceStart }, - { NULL, NULL } - }; - - osm_main_args.argc = argc; - osm_main_args.argv = argv; - - /* Is OpenSM being run as a Windows service or from a cmd line? */ - for (i = 0 ; i< argc ; i++) { - if (!strcmp(argv[i], "--service")) { - run_as_service = TRUE; - osm_main_args.is_service = TRUE; - break; - } - if (!strcmp(argv[i], "/?")) - show_usage(); - } - - osm_exit_event = CreateEvent(NULL, FALSE, FALSE, NULL); - if(osm_exit_event == NULL) { - printf( "\nCreateEvent failed err %d\n", GetLastError()); - return( 1 ); - } - - if (!run_as_service) { - /* Running as console executable */ - osm_main_args.is_service = FALSE; - return opensm_main( (void*)&osm_main_args ); - } - - /* Running as a Windows service */ - - i = 0; - if (!StartServiceCtrlDispatcher( DispatchTable )) { - i = GetLastError(); - SvcDebugOut(" [OSM_SERVICE] StartServiceCtrlDispatcher (%s)\n", - WinErrorStr(i)); - } - return i; -} - -/* - * Carried over from previous 3.0.0 openSM port. - * Problem is that Windows service startup needs feedback as to whether openSM - * actually started up successfully or not. Windows service manager calls the - * OsmServiceStart routine which spawns a thread to run opensm. The OpenSM - * thread communicates with the OsmServiceStart thread via g_service_state. - * Once the OpenSM thread resets g_service_state from SERVICE_STATE_STARTING, - * the OsmServiceStart() will return to the Windows service manager. - * The coding problem is how to catch 'all' Error & Success startup conditions - * and reset g_service_state without hacking the entire body of OFED OpenSM - * code (Linux folks are touchy about Windows code in shared code). - * Somebody once decided that scanning osm_log (aka syslog()) message strings - * seemed was the way to solve this this problem. - * For each call to osm_log() with verbosity OSM_LOG_SYS (aka syslog() called) - * OsmReportState() is called; [see osm_log.c]. - */ - -void OsmReportState(IN const char *p_str) -{ - if ( !strcmp(p_str, "SUBNET UP\n") - || !strcmp(p_str, "SM port is down\n") - || !strcmp(p_str, "Errors during initialization\n") - || !strcmp(p_str, "Entering STANDBY state\n") ) - { - /* change Service startup state to OK */ - InterlockedCompareExchange( (LONG *)&g_service_state , - SERVICE_STATE_STARTED_OK, - SERVICE_STATE_STARTING ); - if (osm_main_args.is_service) - SvcDebugOut(" [OSM_SERVICE] %s", p_str); - - // consider Windows system event log write() - return; - } - - /* Check opt.exit_on_fatal messages */ - if ( !strcmp(p_str, "Found remote SM with non-matching sm_key. Exiting\n") - || !strncmp(p_str, "Errors on subnet. Duplicate GUID found ",39) - || !strcmp(p_str, "Found remote SM with non-matching sm_key. Exiting\n") - || !strcmp(p_str, "FATAL: duplicated guids or 12x lane reversal\n") ) - { - /* change Service startup state to Failed */ - InterlockedCompareExchange( (LONG *)&g_service_state, - SERVICE_STATE_START_FAILED, - SERVICE_STATE_STARTING ); - if (osm_main_args.is_service) - SvcDebugOut(" [OSM_SERVICE] %s", p_str); - - // consider Windows system event log write() here. - return; - } - - if ( !strcmp(p_str, OSM_VERSION"\n") || - !strcmp(p_str, "Entering MASTER state\n") || - !strcmp(p_str, "Entering DISCOVERING state\n") ) - { - // consider Windows system event log write() here. - if (osm_main_args.is_service) - SvcDebugOut(" [OSM_SERVICE] %s", p_str); - } -} - - -static char *WinErrorStr(DWORD err) -{ - char *s; - - if (err == NO_ERROR) - return "Success"; - - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - err, - 0, - (LPTSTR)&s, - 0, - NULL) == 0) - { /* failed */ - // Unknown error code %08x (%d) - s = "WinErrorStr: FormatMessage() error?"; - } - else - { /* success */ - char * p = strchr(s, '\r'); - if(p != NULL) /* lose CRLF */ - *p = '\0'; - } - return s; -} - - -void SvcDebugOut(LPSTR fmt, ... ) -{ - CHAR Buffer[1024]; - va_list args; - - va_start(args,fmt); - _vsnprintf(Buffer, 1024, fmt, args); - va_end(args); - OutputDebugStringA(Buffer); -} - -/* Local OpenSM service control codes: 128 - 255. - * - * invoke with 'sc control OpenSM local-control-code' - * 'sc control OpenSM 128' clear & reopen %windir%\temp\osm.log - */ -#define SERVICE_CONTROL_OSM_REOPEN_LOG_FILE 128 -#define SERVICE_CONTROL_OSM_START_HEAVY_SWEEP 129 - -void WINAPI OsmServiceCtrlHandler( IN DWORD Opcode ) -{ - DWORD status=0; - char *ctl; - - switch(Opcode) - { - case SERVICE_CONTROL_SHUTDOWN: - case SERVICE_CONTROL_STOP: - if (Opcode == SERVICE_CONTROL_STOP) - ctl = "STOP"; - else - ctl = "SHUTDOWN"; - syslog(LOG_INFO,"[OSM_SERVICE] SERVICE_CONTROL_%s\n",ctl); - - // Do whatever it takes to stop here. - osm_exit_flag = TRUE; - SetEvent(osm_exit_event); - - OsmServiceStatus.dwWin32ExitCode = 0; - OsmServiceStatus.dwCurrentState = SERVICE_STOPPED; - OsmServiceStatus.dwCheckPoint = 0; - OsmServiceStatus.dwWaitHint = 0; - - if (!SetServiceStatus (OsmServiceStatusHandle, &OsmServiceStatus)) - { - status = GetLastError(); - } - SvcDebugOut(" [OSM_SERVICE] Exit SERVICE_CONTROL_%s (%ld) '%s'\n", - ctl, status, WinErrorStr(status)); - return; - - case SERVICE_CONTROL_INTERROGATE: - SvcDebugOut(" [OSM_SERVICE] SERVICE_CONTROL_INTERROGATE\n"); - break; // bail out to send current status. - - case SERVICE_CONTROL_PAUSE: - SvcDebugOut(" [OSM_SERVICE] SERVICE_CONTROL_PAUSE\n"); - break; - - case SERVICE_CONTROL_CONTINUE: - SvcDebugOut(" [OSM_SERVICE] SERVICE_CONTROL_CONTINUE\n"); - break; - - case SERVICE_CONTROL_OSM_REOPEN_LOG_FILE: - osm_usr1_flag = 1; - SvcDebugOut(" [OSM_SERVICE] SERVICE_CONTROL_OSM_REOPEN_LOG_FILE\n"); - syslog(LOG_INFO,"[SERVICE_CONTROL] REOPEN_LOG_FILE\n"); - break; - - case SERVICE_CONTROL_OSM_START_HEAVY_SWEEP: - osm_hup_flag = 1; - SvcDebugOut("[OSM_SERVICE] SERVICE_CONTROL_OSM_START_HEAVY_SWEEP\n"); - syslog(LOG_INFO,"[SERVICE_CONTROL] START_HEAVY_SWEEP\n"); - break; - - default: - SvcDebugOut(" [OSM_SERVICE] Unrecognized opcode %ld\n", Opcode); - } - - // Send current status. - if (!SetServiceStatus (OsmServiceStatusHandle, &OsmServiceStatus)) - { - status = GetLastError(); - SvcDebugOut(" [OSM_SERVICE] SetServiceStatus error(%ld) %s\n", - status,WinErrorStr(status)); - } - else - SvcDebugOut(" [OSM_SERVICE] %s() Exit status %ld\n",__func__, status); -} - - -BOOL WINAPI OsmServiceStart (DWORD argc, LPTSTR *argv) -{ - DWORD status; - DWORD specificError; - - OsmServiceStatus.dwServiceType = SERVICE_WIN32; - OsmServiceStatus.dwCurrentState = SERVICE_START_PENDING; - OsmServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | - SERVICE_ACCEPT_SHUTDOWN; - /* Add when Pause/Standby supported SERVICE_ACCEPT_PAUSE_CONTINUE */ - OsmServiceStatus.dwWin32ExitCode = 0; - OsmServiceStatus.dwServiceSpecificExitCode = 0; - OsmServiceStatus.dwCheckPoint = 0; - OsmServiceStatus.dwWaitHint = 2000; - - OsmServiceStatusHandle = RegisterServiceCtrlHandler( "OpenSM", - OsmServiceCtrlHandler); - - if (OsmServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) - { - status = GetLastError(); - SvcDebugOut(" [OSM_SERVICE] RegisterServiceCtrlHandler failed(%d) %s\n", - status,WinErrorStr(status)); - return 0; - } - - // Initialization code goes here. - status = OsmServiceInitialization(argc, argv, &specificError); - - while (status == NO_ERROR && g_service_state == SERVICE_STATE_STARTING) - { - Sleep(1000); - OsmServiceStatus.dwCheckPoint++; - if (!SetServiceStatus (OsmServiceStatusHandle, &OsmServiceStatus)) - { - status = GetLastError(); - SvcDebugOut(" [OSM_SERVICE] SetServiceStatus error(%ld) %s\n", - status,WinErrorStr(status)); - } - - } - CL_ASSERT(g_service_state == SERVICE_STATE_STARTED_OK || - g_service_state == SERVICE_STATE_START_FAILED || - status != NO_ERROR); - - // Handle error condition - if (status != NO_ERROR || g_service_state == SERVICE_STATE_START_FAILED) - { - OsmServiceStatus.dwCurrentState = SERVICE_STOPPED; - OsmServiceStatus.dwCheckPoint = 0; - OsmServiceStatus.dwWaitHint = 0; - OsmServiceStatus.dwWin32ExitCode = status; - OsmServiceStatus.dwServiceSpecificExitCode = specificError; - - SetServiceStatus (OsmServiceStatusHandle, &OsmServiceStatus); - SvcDebugOut(" [OSM_SERVICE] Service Startup error reported; exit\n"); - return 0; - } - - // Initialization complete - report running status. - OsmServiceStatus.dwCurrentState = SERVICE_RUNNING; - OsmServiceStatus.dwCheckPoint = 0; - OsmServiceStatus.dwWaitHint = 0; - - if (!SetServiceStatus (OsmServiceStatusHandle, &OsmServiceStatus)) - { - status = GetLastError(); - SvcDebugOut(" [OSM_SERVICE] SetServiceStatus error %ld\n",status); - } - - SvcDebugOut(" [OSM_SERVICE] StartUP SUCCESS\n"); - - return 1; // SUCCESS -} - - -// Stub initialization function. -DWORD OsmServiceInitialization( DWORD argc, - LPTSTR *argv, - DWORD *specificError ) -{ - DWORD rc = 0; - - if (CreateThread(NULL, 0, opensm_main, &osm_main_args, 0, NULL) == NULL) - { - SvcDebugOut(" [OSM_SERVICE] failed to create thread (%d)\n", - GetLastError()); - rc = 1; - } - return rc; -} - -#endif /* __WIN__ */ - diff --git a/branches/opensm_3/user/opensm/opensm.rc b/branches/opensm_3/user/opensm/opensm.rc deleted file mode 100644 index 1a088a57..00000000 --- a/branches/opensm_3/user/opensm/opensm.rc +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2005 Mellanox Technologies. All rights reserved. - * - * This software is available to you under the OpenIB.org BSD license - * below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * $Id$ - */ - - -#include - -#define VER_FILETYPE VFT_APP -#define VER_FILESUBTYPE VFT2_UNKNOWN -#ifdef _DEBUG_ -#define VER_FILEDESCRIPTION_STR "OpenSM Subnet Manager 3.3.6 (Debug)" -#define VER_INTERNALNAME_STR "opensm.exe" -#define VER_ORIGINALFILENAME_STR "opensm.exe" -#else -#define VER_FILEDESCRIPTION_STR "OpenSM Subnet Manager 3.3.6" -#define VER_INTERNALNAME_STR "opensm.exe" -#define VER_ORIGINALFILENAME_STR "opensm.exe" -#endif -#include diff --git a/branches/opensm_3/user/opensm/osm.mc b/branches/opensm_3/user/opensm/osm.mc deleted file mode 100644 index 3030f718..00000000 --- a/branches/opensm_3/user/opensm/osm.mc +++ /dev/null @@ -1,29 +0,0 @@ -;/*++ -;============================================================================= -;Copyright (c) 2005 Mellanox Technologies -; -;Module Name: -; -; osm.mc -; -;Abstract: -; -; OpenSM event log messages -; -;Authors: -; -; Leonid Keller -; -;Environment: -; -; Kernel Mode . -; -;============================================================================= -;--*/ -; - -MessageId=0x0000 SymbolicName=EVENT_OSM_ANY_INFO -Language=English -%1 -. - diff --git a/branches/opensm_3/user/opensm/osm_console.c b/branches/opensm_3/user/opensm/osm_console.c deleted file mode 100644 index 1df89271..00000000 --- a/branches/opensm_3/user/opensm/osm_console.c +++ /dev/null @@ -1,1574 +0,0 @@ -/* - * Copyright (c) 2005-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#define _GNU_SOURCE /* for getline */ -#include -#include -#ifndef __WIN__ -#include -#include -#include -#include -#include -#ifdef ENABLE_OSM_CONSOLE_SOCKET -#include -#endif -#endif /* ndef __WIN__ */ -#include -#include -#include -#include -#include -#include -#include -#include - -extern void osm_update_node_desc(IN osm_opensm_t *osm); - -struct command { - char *name; - void (*help_function) (FILE * out, int detail); - void (*parse_function) (char **p_last, osm_opensm_t * p_osm, - FILE * out); -}; - -static struct { - int on; - int delay_s; - time_t previous; - void (*loop_function) (osm_opensm_t * p_osm, FILE * out); -} loop_command = { -#ifdef __WIN__ - 0,2,0,NULL -#else -on: 0, delay_s: 2, loop_function:NULL -#endif -}; - -#ifdef __WIN__ -extern const struct command console_cmds[]; -#else -static const struct command console_cmds[]; -#endif - -static char *next_token(char **p_last) -{ - return strtok_r(NULL, " \t\n\r", p_last); -} - -#ifdef ENABLE_OSM_PERF_MGR -static char *name_token(char **p_last) -{ - return strtok_r(NULL, "\t\n\r", p_last); -} -#endif - -static void help_command(FILE * out, int detail) -{ - int i; - - fprintf(out, "Supported commands and syntax:\n"); - fprintf(out, "help []\n"); - /* skip help command */ - for (i = 1; console_cmds[i].name; i++) - console_cmds[i].help_function(out, 0); -} - -#ifndef __WIN__ -static void help_quit(FILE * out, int detail) -{ - fprintf(out, "quit (not valid in local mode; use ctl-c)\n"); -} -#endif - -static void help_loglevel(FILE * out, int detail) -{ - fprintf(out, "loglevel []\n"); - if (detail) { - fprintf(out, " log-level is OR'ed from the following\n"); - fprintf(out, " OSM_LOG_NONE 0x%02X\n", - OSM_LOG_NONE); - fprintf(out, " OSM_LOG_ERROR 0x%02X\n", - OSM_LOG_ERROR); - fprintf(out, " OSM_LOG_INFO 0x%02X\n", - OSM_LOG_INFO); - fprintf(out, " OSM_LOG_VERBOSE 0x%02X\n", - OSM_LOG_VERBOSE); - fprintf(out, " OSM_LOG_DEBUG 0x%02X\n", - OSM_LOG_DEBUG); - fprintf(out, " OSM_LOG_FUNCS 0x%02X\n", - OSM_LOG_FUNCS); - fprintf(out, " OSM_LOG_FRAMES 0x%02X\n", - OSM_LOG_FRAMES); - fprintf(out, " OSM_LOG_ROUTING 0x%02X\n", - OSM_LOG_ROUTING); - fprintf(out, " OSM_LOG_SYS 0x%02X\n", - OSM_LOG_SYS); - fprintf(out, "\n"); - fprintf(out, " OSM_LOG_DEFAULT_LEVEL 0x%02X\n", - OSM_LOG_DEFAULT_LEVEL); - } -} - -static void help_priority(FILE * out, int detail) -{ - fprintf(out, "priority []\n"); -} - -static void help_resweep(FILE * out, int detail) -{ - fprintf(out, "resweep [heavy|light]\n"); -} - -static void help_reroute(FILE * out, int detail) -{ - fprintf(out, "reroute\n"); - if (detail) { - fprintf(out, "reroute the fabric\n"); - } -} - -static void help_status(FILE * out, int detail) -{ - fprintf(out, "status [loop]\n"); - if (detail) { - fprintf(out, " loop -- type \"q\" to quit\n"); - } -} - -static void help_logflush(FILE * out, int detail) -{ - fprintf(out, "logflush -- flush the opensm.log file\n"); -} - -static void help_querylid(FILE * out, int detail) -{ - fprintf(out, - "querylid lid -- print internal information about the lid specified\n"); -} - -static void help_portstatus(FILE * out, int detail) -{ - fprintf(out, "portstatus [ca|switch|router]\n"); - if (detail) { - fprintf(out, "summarize port status\n"); - fprintf(out, - " [ca|switch|router] -- limit the results to the node type specified\n"); - } - -} - -static void help_switchbalance(FILE * out, int detail) -{ - fprintf(out, "switchbalance [verbose] [guid]\n"); - if (detail) { - fprintf(out, "output switch balancing information\n"); - fprintf(out, - " [verbose] -- verbose output\n" - " [guid] -- limit results to specified guid\n"); - } -} - -static void help_lidbalance(FILE * out, int detail) -{ - fprintf(out, "lidbalance [switchguid]\n"); - if (detail) { - fprintf(out, "output lid balanced forwarding information\n"); - fprintf(out, - " [switchguid] -- limit results to specified switch guid\n"); - } -} - -static void help_dump_conf(FILE *out, int detail) -{ - fprintf(out, "dump_conf\n"); - if (detail) { - fprintf(out, "dump current opensm configuration\n"); - } -} - -static void help_update_desc(FILE *out, int detail) -{ - fprintf(out, "update_desc\n"); - if (detail) { - fprintf(out, "update node description for all nodes\n"); - } -} - -#ifdef ENABLE_OSM_PERF_MGR -static void help_perfmgr(FILE * out, int detail) -{ - fprintf(out, - "perfmgr [enable|disable|clear_counters|dump_counters|print_counters|sweep_time[seconds]]\n"); - if (detail) { - fprintf(out, - "perfmgr -- print the performance manager state\n"); - fprintf(out, - " [enable|disable] -- change the perfmgr state\n"); - fprintf(out, - " [sweep_time] -- change the perfmgr sweep time (requires [seconds] option)\n"); - fprintf(out, - " [clear_counters] -- clear the counters stored\n"); - fprintf(out, - " [dump_counters [mach]] -- dump the counters (optionally in [mach]ine readable format)\n"); - fprintf(out, - " [print_counters ] -- print the counters for the specified node\n"); - } -} -#endif /* ENABLE_OSM_PERF_MGR */ - -/* more help routines go here */ - -static void help_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - char *p_cmd; - int i, found = 0; - - p_cmd = next_token(p_last); - if (!p_cmd) - help_command(out, 0); - else { - for (i = 1; console_cmds[i].name; i++) { - if (!strcmp(p_cmd, console_cmds[i].name)) { - found = 1; - console_cmds[i].help_function(out, 1); - break; - } - } - if (!found) { - fprintf(out, "%s : Command not found\n\n", p_cmd); - help_command(out, 0); - } - } -} - -static void loglevel_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - char *p_cmd; - int level; - - p_cmd = next_token(p_last); - if (!p_cmd) - fprintf(out, "Current log level is 0x%x\n", - osm_log_get_level(&p_osm->log)); - else { - /* Handle x, 0x, and decimal specification of log level */ - if (!strncmp(p_cmd, "x", 1)) { - p_cmd++; - level = strtoul(p_cmd, NULL, 16); - } else { - if (!strncmp(p_cmd, "0x", 2)) { - p_cmd += 2; - level = strtoul(p_cmd, NULL, 16); - } else - level = strtol(p_cmd, NULL, 10); - } - if ((level >= 0) && (level < 256)) { - fprintf(out, "Setting log level to 0x%x\n", level); - osm_log_set_level(&p_osm->log, level); - } else - fprintf(out, "Invalid log level 0x%x\n", level); - } -} - -static void priority_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - char *p_cmd; - int priority; - - p_cmd = next_token(p_last); - if (!p_cmd) - fprintf(out, "Current sm-priority is %d\n", - p_osm->subn.opt.sm_priority); - else { - priority = strtol(p_cmd, NULL, 0); - if (0 > priority || 15 < priority) - fprintf(out, - "Invalid sm-priority %d; must be between 0 and 15\n", - priority); - else { - fprintf(out, "Setting sm-priority to %d\n", priority); - osm_set_sm_priority(&p_osm->sm, (uint8_t)priority); - } - } -} - -static const char *sm_state_str(int state) -{ - switch (state) { - case IB_SMINFO_STATE_DISCOVERING: - return "Discovering"; - case IB_SMINFO_STATE_STANDBY: - return "Standby "; - case IB_SMINFO_STATE_NOTACTIVE: - return "Not Active "; - case IB_SMINFO_STATE_MASTER: - return "Master "; - } - return "UNKNOWN "; -} - -static const char *sa_state_str(osm_sa_state_t state) -{ - switch (state) { - case OSM_SA_STATE_INIT: - return "Init"; - case OSM_SA_STATE_READY: - return "Ready"; - } - return "UNKNOWN"; -} - -static void dump_sms(osm_opensm_t * p_osm, FILE * out) -{ - osm_subn_t *p_subn = &p_osm->subn; - osm_remote_sm_t *p_rsm; - - fprintf(out, "\n Known SMs\n" - " ---------\n"); - fprintf(out, " Port GUID SM State Priority\n"); - fprintf(out, " --------- -------- --------\n"); - fprintf(out, " 0x%" PRIx64 " %s %d SELF\n", - cl_ntoh64(p_subn->sm_port_guid), - sm_state_str(p_subn->sm_state), - p_subn->opt.sm_priority); - - CL_PLOCK_ACQUIRE(p_osm->sm.p_lock); - p_rsm = (osm_remote_sm_t *) cl_qmap_head(&p_subn->sm_guid_tbl); - while (p_rsm != (osm_remote_sm_t *) cl_qmap_end(&p_subn->sm_guid_tbl)) { - fprintf(out, " 0x%" PRIx64 " %s %d\n", - cl_ntoh64(p_rsm->smi.guid), - sm_state_str(ib_sminfo_get_state(&p_rsm->smi)), - ib_sminfo_get_priority(&p_rsm->smi)); - p_rsm = (osm_remote_sm_t *) cl_qmap_next(&p_rsm->map_item); - } - CL_PLOCK_RELEASE(p_osm->sm.p_lock); -} - -static void print_status(osm_opensm_t * p_osm, FILE * out) -{ - cl_list_item_t *item; - - if (out) { - cl_plock_acquire(&p_osm->lock); - fprintf(out, " OpenSM Version : %s\n", p_osm->osm_version); - fprintf(out, " SM State : %s\n", - sm_state_str(p_osm->subn.sm_state)); - fprintf(out, " SM Priority : %d\n", - p_osm->subn.opt.sm_priority); - fprintf(out, " SA State : %s\n", - sa_state_str(p_osm->sa.state)); - fprintf(out, " Routing Engine : %s\n", - osm_routing_engine_type_str(p_osm-> - routing_engine_used)); - - fprintf(out, " Loaded event plugins :"); - if (cl_qlist_head(&p_osm->plugin_list) == - cl_qlist_end(&p_osm->plugin_list)) { - fprintf(out, " "); - } - for (item = cl_qlist_head(&p_osm->plugin_list); - item != cl_qlist_end(&p_osm->plugin_list); - item = cl_qlist_next(item)) - fprintf(out, " %s", - ((osm_epi_plugin_t *)item)->plugin_name); - fprintf(out, "\n"); - -#ifdef ENABLE_OSM_PERF_MGR - fprintf(out, "\n PerfMgr state/sweep state : %s/%s\n", - osm_perfmgr_get_state_str(&p_osm->perfmgr), - osm_perfmgr_get_sweep_state_str(&p_osm->perfmgr)); -#endif - fprintf(out, "\n MAD stats\n" - " ---------\n" - " QP0 MADs outstanding : %d\n" - " QP0 MADs outstanding (on wire) : %d\n" - " QP0 MADs rcvd : %d\n" - " QP0 MADs sent : %d\n" - " QP0 unicasts sent : %d\n" - " QP0 unknown MADs rcvd : %d\n" - " SA MADs outstanding : %d\n" - " SA MADs rcvd : %d\n" - " SA MADs sent : %d\n" - " SA unknown MADs rcvd : %d\n" - " SA MADs ignored : %d\n", - p_osm->stats.qp0_mads_outstanding, - p_osm->stats.qp0_mads_outstanding_on_wire, - p_osm->stats.qp0_mads_rcvd, - p_osm->stats.qp0_mads_sent, - p_osm->stats.qp0_unicasts_sent, - p_osm->stats.qp0_mads_rcvd_unknown, - p_osm->stats.sa_mads_outstanding, - p_osm->stats.sa_mads_rcvd, - p_osm->stats.sa_mads_sent, - p_osm->stats.sa_mads_rcvd_unknown, - p_osm->stats.sa_mads_ignored); - fprintf(out, "\n Subnet flags\n" - " ------------\n" - " Ignore existing lfts : %d\n" - " Subnet Init errors : %d\n" - " In sweep hop 0 : %d\n" - " First time master sweep : %d\n" - " Coming out of standby : %d\n", - p_osm->subn.ignore_existing_lfts, - p_osm->subn.subnet_initialization_error, - p_osm->subn.in_sweep_hop_0, - p_osm->subn.first_time_master_sweep, - p_osm->subn.coming_out_of_standby); - dump_sms(p_osm, out); - fprintf(out, "\n"); - cl_plock_release(&p_osm->lock); - } -} - -static int loop_command_check_time(void) -{ - time_t cur = time(NULL); - if ((loop_command.previous + loop_command.delay_s) < cur) { - loop_command.previous = cur; - return 1; - } - return 0; -} - -static void status_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - char *p_cmd; - - p_cmd = next_token(p_last); - if (p_cmd) { - if (strcmp(p_cmd, "loop") == 0) { - fprintf(out, "Looping on status command...\n"); - fflush(out); - loop_command.on = 1; - loop_command.previous = time(NULL); - loop_command.loop_function = print_status; - } else { - help_status(out, 1); - return; - } - } - print_status(p_osm, out); -} - -static void resweep_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - char *p_cmd; - - p_cmd = next_token(p_last); - if (!p_cmd || - (strcmp(p_cmd, "heavy") != 0 && strcmp(p_cmd, "light") != 0)) { - fprintf(out, "Invalid resweep command\n"); - help_resweep(out, 1); - } else { - if (strcmp(p_cmd, "heavy") == 0) - p_osm->subn.force_heavy_sweep = TRUE; - osm_opensm_sweep(p_osm); - } -} - -static void reroute_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - p_osm->subn.force_reroute = TRUE; - osm_opensm_sweep(p_osm); -} - -static void logflush_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - fflush(p_osm->log.out_port); -} - -static void querylid_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - unsigned int p = 0; - uint16_t lid = 0; - osm_port_t *p_port = NULL; - char *p_cmd = next_token(p_last); - - if (!p_cmd) { - fprintf(out, "no LID specified\n"); - help_querylid(out, 1); - return; - } - - lid = (uint16_t) strtoul(p_cmd, NULL, 0); - cl_plock_acquire(&p_osm->lock); - p_port = osm_get_port_by_lid_ho(&p_osm->subn, lid); - if (!p_port) - goto invalid_lid; - - fprintf(out, "Query results for LID %u\n", lid); - fprintf(out, - " GUID : 0x%016" PRIx64 "\n" - " Node Desc : %s\n" - " Node Type : %s\n" - " Num Ports : %d\n", - cl_ntoh64(p_port->guid), - p_port->p_node->print_desc, - ib_get_node_type_str(osm_node_get_type(p_port->p_node)), - p_port->p_node->node_info.num_ports); - - if (p_port->p_node->sw) - p = 0; - else - p = 1; - for ( /* see above */ ; p < p_port->p_node->physp_tbl_size; p++) { - fprintf(out, - " Port %u health : %s\n", - p, - p_port->p_node->physp_table[p]. - healthy ? "OK" : "ERROR"); - } - - cl_plock_release(&p_osm->lock); - return; - -invalid_lid: - cl_plock_release(&p_osm->lock); - fprintf(out, "Invalid lid %d\n", lid); - return; -} - -/** - * Data structures for the portstatus command - */ -typedef struct _port_report { - struct _port_report *next; - uint64_t node_guid; - uint8_t port_num; - char print_desc[IB_NODE_DESCRIPTION_SIZE + 1]; -} port_report_t; - -static void -__tag_port_report(port_report_t ** head, uint64_t node_guid, - uint8_t port_num, char *print_desc) -{ - port_report_t *rep = malloc(sizeof(*rep)); - if (!rep) - return; - - rep->node_guid = node_guid; - rep->port_num = port_num; - memcpy(rep->print_desc, print_desc, IB_NODE_DESCRIPTION_SIZE + 1); - rep->next = NULL; - if (*head) { - rep->next = *head; - *head = rep; - } else - *head = rep; -} - -static void __print_port_report(FILE * out, port_report_t * head) -{ - port_report_t *item = head; - port_report_t *next; - - while (item != NULL) { - fprintf(out, " 0x%016" PRIx64 " %d (%s)\n", - item->node_guid, item->port_num, item->print_desc); - next = item->next; - free(item); - item = next; - } -} - -typedef struct { - uint8_t node_type_lim; /* limit the results; 0 == ALL */ - uint64_t total_nodes; - uint64_t total_ports; - uint64_t ports_down; - uint64_t ports_active; - uint64_t ports_disabled; - port_report_t *disabled_ports; - uint64_t ports_1X; - uint64_t ports_4X; - uint64_t ports_8X; - uint64_t ports_12X; - uint64_t ports_unknown_width; - uint64_t ports_reduced_width; - port_report_t *reduced_width_ports; - uint64_t ports_sdr; - uint64_t ports_ddr; - uint64_t ports_qdr; - uint64_t ports_unknown_speed; - uint64_t ports_reduced_speed; - port_report_t *reduced_speed_ports; -} fabric_stats_t; - -/** - * iterator function to get portstatus on each node - */ -static void __get_stats(cl_map_item_t * const p_map_item, void *context) -{ - fabric_stats_t *fs = (fabric_stats_t *) context; - osm_node_t *node = (osm_node_t *) p_map_item; - uint8_t num_ports = osm_node_get_num_physp(node); - uint8_t port = 0; - - /* Skip nodes we are not interested in */ - if (fs->node_type_lim != 0 - && fs->node_type_lim != node->node_info.node_type) - return; - - fs->total_nodes++; - - for (port = 1; port < num_ports; port++) { - osm_physp_t *phys = osm_node_get_physp_ptr(node, port); - ib_port_info_t *pi = NULL; - uint8_t active_speed = 0; - uint8_t enabled_speed = 0; - uint8_t active_width = 0; - uint8_t enabled_width = 0; - uint8_t port_state = 0; - uint8_t port_phys_state = 0; - - if (!phys) - continue; - - pi = &(phys->port_info); - active_speed = ib_port_info_get_link_speed_active(pi); - enabled_speed = ib_port_info_get_link_speed_enabled(pi); - active_width = pi->link_width_active; - enabled_width = pi->link_width_enabled; - port_state = ib_port_info_get_port_state(pi); - port_phys_state = ib_port_info_get_port_phys_state(pi); - - if ((enabled_width ^ active_width) > active_width) { - __tag_port_report(&(fs->reduced_width_ports), - cl_ntoh64(node->node_info.node_guid), - port, node->print_desc); - fs->ports_reduced_width++; - } - - if ((enabled_speed ^ active_speed) > active_speed) { - __tag_port_report(&(fs->reduced_speed_ports), - cl_ntoh64(node->node_info.node_guid), - port, node->print_desc); - fs->ports_reduced_speed++; - } - - switch (active_speed) { - case IB_LINK_SPEED_ACTIVE_2_5: - fs->ports_sdr++; - break; - case IB_LINK_SPEED_ACTIVE_5: - fs->ports_ddr++; - break; - case IB_LINK_SPEED_ACTIVE_10: - fs->ports_qdr++; - break; - default: - fs->ports_unknown_speed++; - break; - } - switch (active_width) { - case IB_LINK_WIDTH_ACTIVE_1X: - fs->ports_1X++; - break; - case IB_LINK_WIDTH_ACTIVE_4X: - fs->ports_4X++; - break; - case IB_LINK_WIDTH_ACTIVE_8X: - fs->ports_8X++; - break; - case IB_LINK_WIDTH_ACTIVE_12X: - fs->ports_12X++; - break; - default: - fs->ports_unknown_width++; - break; - } - if (port_state == IB_LINK_DOWN) - fs->ports_down++; - else if (port_state == IB_LINK_ACTIVE) - fs->ports_active++; - if (port_phys_state == IB_PORT_PHYS_STATE_DISABLED) { - __tag_port_report(&(fs->disabled_ports), - cl_ntoh64(node->node_info.node_guid), - port, node->print_desc); - fs->ports_disabled++; - } - - fs->total_ports++; - } -} - -static void portstatus_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - fabric_stats_t fs; - struct timeval before, after; - char *p_cmd; - - memset(&fs, 0, sizeof(fs)); - - p_cmd = next_token(p_last); - if (p_cmd) { - if (strcmp(p_cmd, "ca") == 0) { - fs.node_type_lim = IB_NODE_TYPE_CA; - } else if (strcmp(p_cmd, "switch") == 0) { - fs.node_type_lim = IB_NODE_TYPE_SWITCH; - } else if (strcmp(p_cmd, "router") == 0) { - fs.node_type_lim = IB_NODE_TYPE_ROUTER; - } else { - fprintf(out, "Node type not understood\n"); - help_portstatus(out, 1); - return; - } - } - - gettimeofday(&before, NULL); - - /* for each node in the system gather the stats */ - cl_plock_acquire(&p_osm->lock); - cl_qmap_apply_func(&(p_osm->subn.node_guid_tbl), __get_stats, - (void *)&fs); - cl_plock_release(&p_osm->lock); - - gettimeofday(&after, NULL); - - /* report the stats */ - fprintf(out, "\"%s\" port status:\n", - fs.node_type_lim ? ib_get_node_type_str(fs. - node_type_lim) : "ALL"); - fprintf(out, - " %" PRIu64 " port(s) scanned on %" PRIu64 - " nodes in %lu us\n", fs.total_ports, fs.total_nodes, - after.tv_usec - before.tv_usec); - - if (fs.ports_down) - fprintf(out, " %" PRIu64 " down\n", fs.ports_down); - if (fs.ports_active) - fprintf(out, " %" PRIu64 " active\n", fs.ports_active); - if (fs.ports_1X) - fprintf(out, " %" PRIu64 " at 1X\n", fs.ports_1X); - if (fs.ports_4X) - fprintf(out, " %" PRIu64 " at 4X\n", fs.ports_4X); - if (fs.ports_8X) - fprintf(out, " %" PRIu64 " at 8X\n", fs.ports_8X); - if (fs.ports_12X) - fprintf(out, " %" PRIu64 " at 12X\n", fs.ports_12X); - - if (fs.ports_sdr) - fprintf(out, " %" PRIu64 " at 2.5 Gbps\n", fs.ports_sdr); - if (fs.ports_ddr) - fprintf(out, " %" PRIu64 " at 5.0 Gbps\n", fs.ports_ddr); - if (fs.ports_qdr) - fprintf(out, " %" PRIu64 " at 10.0 Gbps\n", fs.ports_qdr); - - if (fs.ports_disabled + fs.ports_reduced_speed + fs.ports_reduced_width - > 0) { - fprintf(out, "\nPossible issues:\n"); - } - if (fs.ports_disabled) { - fprintf(out, " %" PRIu64 " disabled\n", fs.ports_disabled); - __print_port_report(out, fs.disabled_ports); - } - if (fs.ports_reduced_speed) { - fprintf(out, " %" PRIu64 " with reduced speed\n", - fs.ports_reduced_speed); - __print_port_report(out, fs.reduced_speed_ports); - } - if (fs.ports_reduced_width) { - fprintf(out, " %" PRIu64 " with reduced width\n", - fs.ports_reduced_width); - __print_port_report(out, fs.reduced_width_ports); - } - fprintf(out, "\n"); -} - -static void switchbalance_check(osm_opensm_t * p_osm, - osm_switch_t * p_sw, FILE * out, int verbose) -{ - uint8_t port_num; - uint8_t num_ports; - const cl_qmap_t *p_port_tbl; - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_physp_t *p_rem_physp; - osm_node_t *p_rem_node; - uint32_t count[255]; /* max ports is a uint8_t */ - uint8_t output_ports[255]; - uint8_t output_ports_count = 0; - uint32_t min_count = 0xFFFFFFFF; - uint32_t max_count = 0; - unsigned int i; - - memset(count, '\0', sizeof(uint32_t) * 255); - - /* Count port usage */ - p_port_tbl = &p_osm->subn.port_guid_tbl; - for (p_port = (osm_port_t *) cl_qmap_head(p_port_tbl); - p_port != (osm_port_t *) cl_qmap_end(p_port_tbl); - p_port = (osm_port_t *) cl_qmap_next(&p_port->map_item)) { - uint16_t min_lid_ho; - uint16_t max_lid_ho; - uint16_t lid_ho; - - /* Don't count switches in port usage */ - if (osm_node_get_type(p_port->p_node) == IB_NODE_TYPE_SWITCH) - continue; - - osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho); - - if (min_lid_ho == 0 || max_lid_ho == 0) - continue; - - for (lid_ho = min_lid_ho; lid_ho <= max_lid_ho; lid_ho++) { - port_num = osm_switch_get_port_by_lid(p_sw, lid_ho); - if (port_num == OSM_NO_PATH) - continue; - - count[port_num]++; - } - } - - num_ports = p_sw->num_ports; - for (port_num = 1; port_num < num_ports; port_num++) { - p_physp = osm_node_get_physp_ptr(p_sw->p_node, port_num); - - /* if port is down/unhealthy, don't consider it in - * min/max calculations - */ - if (!p_physp || !osm_physp_is_healthy(p_physp) - || !osm_physp_get_remote(p_physp)) - continue; - - p_rem_physp = osm_physp_get_remote(p_physp); - p_rem_node = osm_physp_get_node_ptr(p_rem_physp); - - /* If we are directly connected to a CA/router, its not really - * up for balancing consideration. - */ - if (osm_node_get_type(p_rem_node) != IB_NODE_TYPE_SWITCH) - continue; - - output_ports[output_ports_count] = port_num; - output_ports_count++; - - if (count[port_num] < min_count) - min_count = count[port_num]; - if (count[port_num] > max_count) - max_count = count[port_num]; - } - - if (verbose || ((max_count - min_count) > 1)) { - if ((max_count - min_count) > 1) - fprintf(out, - "Unbalanced Switch: 0x%016" PRIx64 " (%s)\n", - cl_ntoh64(p_sw->p_node->node_info.node_guid), - p_sw->p_node->print_desc); - else - fprintf(out, - "Switch: 0x%016" PRIx64 " (%s)\n", - cl_ntoh64(p_sw->p_node->node_info.node_guid), - p_sw->p_node->print_desc); - - for (i = 0; i < output_ports_count; i++) { - fprintf(out, - "Port %d: %d\n", - output_ports[i], count[output_ports[i]]); - } - } -} - -static void switchbalance_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - char *p_cmd; - uint64_t guid = 0; - osm_switch_t *p_sw; - int verbose = 0; - - p_cmd = next_token(p_last); - if (p_cmd) { - char *p_end; - - if (strcmp(p_cmd, "verbose") == 0) { - verbose++; - p_cmd = next_token(p_last); - } - - if (p_cmd) { - guid = strtoull(p_cmd, &p_end, 0); - if (!guid || *p_end != '\0') { - fprintf(out, "Invalid guid specified\n"); - help_switchbalance(out, 1); - return; - } - } - } - - cl_plock_acquire(&p_osm->lock); - if (guid) { - p_sw = osm_get_switch_by_guid(&p_osm->subn, cl_hton64(guid)); - if (!p_sw) { - fprintf(out, "guid not found\n"); - goto lock_exit; - } - - switchbalance_check(p_osm, p_sw, out, verbose); - } else { - cl_qmap_t *p_sw_guid_tbl = &p_osm->subn.sw_guid_tbl; - for (p_sw = (osm_switch_t *) cl_qmap_head(p_sw_guid_tbl); - p_sw != (osm_switch_t *) cl_qmap_end(p_sw_guid_tbl); - p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item)) - switchbalance_check(p_osm, p_sw, out, verbose); - } -lock_exit: - cl_plock_release(&p_osm->lock); - return; -} - -static void lidbalance_check(osm_opensm_t * p_osm, - osm_switch_t * p_sw, FILE * out) -{ - uint8_t port_num; - const cl_qmap_t *p_port_tbl; - osm_port_t *p_port; - - p_port_tbl = &p_osm->subn.port_guid_tbl; - for (p_port = (osm_port_t *) cl_qmap_head(p_port_tbl); - p_port != (osm_port_t *) cl_qmap_end(p_port_tbl); - p_port = (osm_port_t *) cl_qmap_next(&p_port->map_item)) { - uint32_t port_count[255]; /* max ports is a uint8_t */ - osm_node_t *rem_node[255]; - uint32_t rem_node_count; - uint32_t rem_count[255]; - osm_physp_t *p_physp; - osm_physp_t *p_rem_physp; - osm_node_t *p_rem_node; - uint32_t port_min_count = 0xFFFFFFFF; - uint32_t port_max_count = 0; - uint32_t rem_min_count = 0xFFFFFFFF; - uint32_t rem_max_count = 0; - uint16_t min_lid_ho; - uint16_t max_lid_ho; - uint16_t lid_ho; - uint8_t num_ports; - unsigned int i; - - /* we only care about non-switches */ - if (osm_node_get_type(p_port->p_node) == IB_NODE_TYPE_SWITCH) - continue; - - osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho); - - if (min_lid_ho == 0 || max_lid_ho == 0) - continue; - - memset(port_count, '\0', sizeof(uint32_t) * 255); - memset(rem_node, '\0', sizeof(osm_node_t *) * 255); - rem_node_count = 0; - memset(rem_count, '\0', sizeof(uint32_t) * 255); - - for (lid_ho = min_lid_ho; lid_ho <= max_lid_ho; lid_ho++) { - boolean_t rem_node_found = FALSE; - unsigned int indx = 0; - - port_num = osm_switch_get_port_by_lid(p_sw, lid_ho); - if (port_num == OSM_NO_PATH) - continue; - - p_physp = - osm_node_get_physp_ptr(p_sw->p_node, port_num); - - /* if port is down/unhealthy, can't calculate */ - if (!p_physp || !osm_physp_is_healthy(p_physp) - || !osm_physp_get_remote(p_physp)) - continue; - - p_rem_physp = osm_physp_get_remote(p_physp); - p_rem_node = osm_physp_get_node_ptr(p_rem_physp); - - /* determine if we've seen this remote node before. - * If not, store it. If yes, update the counter - */ - for (i = 0; i < rem_node_count; i++) { - if (rem_node[i] == p_rem_node) { - rem_node_found = TRUE; - indx = i; - break; - } - } - - if (!rem_node_found) { - rem_node[rem_node_count] = p_rem_node; - rem_count[rem_node_count]++; - indx = rem_node_count; - rem_node_count++; - } else - rem_count[indx]++; - - port_count[port_num]++; - } - - if (!rem_node_count) - continue; - - for (i = 0; i < rem_node_count; i++) { - if (rem_count[i] < rem_min_count) - rem_min_count = rem_count[i]; - if (rem_count[i] > rem_max_count) - rem_max_count = rem_count[i]; - } - - num_ports = p_sw->num_ports; - for (i = 0; i < num_ports; i++) { - if (!port_count[i]) - continue; - if (port_count[i] < port_min_count) - port_min_count = port_count[i]; - if (port_count[i] > port_max_count) - port_max_count = port_count[i]; - } - - /* Output if this CA/router is being forwarded an unbalanced number of - * times to a destination. - */ - if ((rem_max_count - rem_min_count) > 1) { - fprintf(out, - "Unbalanced Remote Forwarding: Switch 0x%016" - PRIx64 " (%s): ", - cl_ntoh64(p_sw->p_node->node_info.node_guid), - p_sw->p_node->print_desc); - if (osm_node_get_type(p_port->p_node) == - IB_NODE_TYPE_CA) - fprintf(out, "CA"); - else if (osm_node_get_type(p_port->p_node) == - IB_NODE_TYPE_ROUTER) - fprintf(out, "Router"); - fprintf(out, " 0x%016" PRIx64 " (%s): ", - cl_ntoh64(p_port->p_node->node_info.node_guid), - p_port->p_node->print_desc); - for (i = 0; i < rem_node_count; i++) { - fprintf(out, - "Dest 0x%016" PRIx64 "(%s) - %u ", - cl_ntoh64(rem_node[i]->node_info. - node_guid), - rem_node[i]->print_desc, rem_count[i]); - } - fprintf(out, "\n"); - } - - /* Output if this CA/router is being forwarded through a port - * an unbalanced number of times. - */ - if ((port_max_count - port_min_count) > 1) { - fprintf(out, - "Unbalanced Port Forwarding: Switch 0x%016" - PRIx64 " (%s): ", - cl_ntoh64(p_sw->p_node->node_info.node_guid), - p_sw->p_node->print_desc); - if (osm_node_get_type(p_port->p_node) == - IB_NODE_TYPE_CA) - fprintf(out, "CA"); - else if (osm_node_get_type(p_port->p_node) == - IB_NODE_TYPE_ROUTER) - fprintf(out, "Router"); - fprintf(out, " 0x%016" PRIx64 " (%s): ", - cl_ntoh64(p_port->p_node->node_info.node_guid), - p_port->p_node->print_desc); - for (i = 0; i < num_ports; i++) { - if (!port_count[i]) - continue; - fprintf(out, "Port %u - %u: ", i, - port_count[i]); - } - fprintf(out, "\n"); - } - } -} - -static void lidbalance_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - char *p_cmd; - uint64_t guid = 0; - osm_switch_t *p_sw; - - p_cmd = next_token(p_last); - if (p_cmd) { - char *p_end; - - guid = strtoull(p_cmd, &p_end, 0); - if (!guid || *p_end != '\0') { - fprintf(out, "Invalid switchguid specified\n"); - help_lidbalance(out, 1); - return; - } - } - - cl_plock_acquire(&p_osm->lock); - if (guid) { - p_sw = osm_get_switch_by_guid(&p_osm->subn, cl_hton64(guid)); - if (!p_sw) { - fprintf(out, "switchguid not found\n"); - goto lock_exit; - } - lidbalance_check(p_osm, p_sw, out); - } else { - cl_qmap_t *p_sw_guid_tbl = &p_osm->subn.sw_guid_tbl; - for (p_sw = (osm_switch_t *) cl_qmap_head(p_sw_guid_tbl); - p_sw != (osm_switch_t *) cl_qmap_end(p_sw_guid_tbl); - p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item)) - lidbalance_check(p_osm, p_sw, out); - } - -lock_exit: - cl_plock_release(&p_osm->lock); - return; -} - -static void dump_conf_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - osm_subn_output_conf(out, &p_osm->subn.opt); -} - -static void update_desc_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - osm_update_node_desc(p_osm); -} - -#ifdef ENABLE_OSM_PERF_MGR -static void perfmgr_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - char *p_cmd; - - p_cmd = next_token(p_last); - if (p_cmd) { - if (strcmp(p_cmd, "enable") == 0) { - osm_perfmgr_set_state(&p_osm->perfmgr, - PERFMGR_STATE_ENABLED); - } else if (strcmp(p_cmd, "disable") == 0) { - osm_perfmgr_set_state(&p_osm->perfmgr, - PERFMGR_STATE_DISABLE); - } else if (strcmp(p_cmd, "clear_counters") == 0) { - osm_perfmgr_clear_counters(&p_osm->perfmgr); - } else if (strcmp(p_cmd, "dump_counters") == 0) { - p_cmd = next_token(p_last); - if (p_cmd && (strcmp(p_cmd, "mach") == 0)) { - osm_perfmgr_dump_counters(&p_osm->perfmgr, - PERFMGR_EVENT_DB_DUMP_MR); - } else { - osm_perfmgr_dump_counters(&p_osm->perfmgr, - PERFMGR_EVENT_DB_DUMP_HR); - } - } else if (strcmp(p_cmd, "print_counters") == 0) { - p_cmd = name_token(p_last); - if (p_cmd) { - osm_perfmgr_print_counters(&p_osm->perfmgr, - p_cmd, out); - } else { - fprintf(out, - "print_counters requires a node name or node GUID to be specified\n"); - } - } else if (strcmp(p_cmd, "sweep_time") == 0) { - p_cmd = next_token(p_last); - if (p_cmd) { - uint16_t time_s = atoi(p_cmd); - osm_perfmgr_set_sweep_time_s(&p_osm->perfmgr, - time_s); - } else { - fprintf(out, - "sweep_time requires a time period (in seconds) to be specified\n"); - } - } else { - fprintf(out, "\"%s\" option not found\n", p_cmd); - } - } else { - fprintf(out, "Performance Manager status:\n" - "state : %s\n" - "sweep state : %s\n" - "sweep time : %us\n" - "outstanding queries/max : %d/%u\n", - osm_perfmgr_get_state_str(&p_osm->perfmgr), - osm_perfmgr_get_sweep_state_str(&p_osm->perfmgr), - osm_perfmgr_get_sweep_time_s(&p_osm->perfmgr), - p_osm->perfmgr.outstanding_queries, - p_osm->perfmgr.max_outstanding_queries); - } -} -#endif /* ENABLE_OSM_PERF_MGR */ - -#ifndef __WIN__ -static void quit_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - cio_close(&p_osm->console, &p_osm->log); -} -#endif - -static void help_version(FILE * out, int detail) -{ - fprintf(out, "version -- print the OSM version\n"); -} - -static void version_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - fprintf(out, "%s build %s %s\n", p_osm->osm_version, __DATE__, __TIME__); -} - -/* more parse routines go here */ -#ifdef __WIN__ - -static void exit_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - syslog(LOG_INFO, "graceful OpenSM shutdown.\n"); - osm_exit_flag = 1; -} - -static void help_exit(FILE * out, int detail) -{ - fprintf(out, "exit - graceful OpenSM shutdown.\n"); -} - -#else /* def __WIN__ */ - -typedef struct _regexp_list { - regex_t exp; - struct _regexp_list *next; -} regexp_list_t; - -static void dump_portguid_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) -{ - cl_qmap_t *p_port_guid_tbl; - osm_port_t *p_port, *p_next_port; - regexp_list_t *p_regexp, *p_head_regexp = NULL; - FILE *output = out; - - while (1) { - char *p_cmd = next_token(p_last); - if (!p_cmd) - break; - - if (strcmp(p_cmd, "file") == 0) { - p_cmd = next_token(p_last); - if (p_cmd) { - output = fopen(p_cmd, "w+"); - if (output == NULL) { - fprintf(out, - "Could not open file %s: %s\n", - p_cmd, strerror(errno)); - output = out; - } - } else - fprintf(out, "No file name passed\n"); - } else if (!(p_regexp = malloc(sizeof(*p_regexp)))) { - fprintf(out, "No memory\n"); - break; - } else if (regcomp(&p_regexp->exp, p_cmd, - REG_NOSUB | REG_EXTENDED) != 0) { - fprintf(out, "Cannot parse regular expression \'%s\'." - " Skipping\n", p_cmd); - free(p_regexp); - continue; - } else { - p_regexp->next = p_head_regexp; - p_head_regexp = p_regexp; - } - } - - /* Check we have at least one expression to match */ - if (p_head_regexp == NULL) { - fprintf(out, "No valid expression provided. Aborting\n"); - return; - } - - if (p_osm->sm.p_subn->need_update != 0) { - fprintf(out, "Subnet is not ready yet. Try again later\n"); - return; - } - - /* Subnet doesn't need to be updated so we can carry on */ - - CL_PLOCK_ACQUIRE(p_osm->sm.p_lock); - p_port_guid_tbl = &(p_osm->sm.p_subn->port_guid_tbl); - - p_next_port = (osm_port_t *) cl_qmap_head(p_port_guid_tbl); - while (p_next_port != (osm_port_t *) cl_qmap_end(p_port_guid_tbl)) { - - p_port = p_next_port; - p_next_port = - (osm_port_t *) cl_qmap_next(&p_next_port->map_item); - - for (p_regexp = p_head_regexp; p_regexp != NULL; - p_regexp = p_regexp->next) - if (regexec(&p_regexp->exp, p_port->p_node->print_desc, - 0, NULL, 0) == 0) { - fprintf(output, "0x%" PRIxLEAST64 "\n", - cl_ntoh64(p_port->p_physp->port_guid)); - break; - } - } - - CL_PLOCK_RELEASE(p_osm->sm.p_lock); - if (output != out) - fclose(output); - - for (; p_head_regexp; p_head_regexp = p_regexp) { - p_regexp = p_head_regexp->next; - regfree(&p_head_regexp->exp); - free(p_head_regexp); - } -} - -static void help_dump_portguid(FILE * out, int detail) -{ - fprintf(out, - "dump_portguid [file filename] regexp1 [regexp2 [regexp3 ...]] -- Dump port GUID matching a regexp \n"); - if (detail) { - fprintf(out, - "getguidgetguid -- Dump all the port GUID whom node_desc matches one of the provided regexp\n"); - fprintf(out, - " [file filename] -- Send the port GUID list to the specified file instead of regular output\n"); - } - -} -#endif /* def __WIN__ */ - -#ifndef __WIN__ -static -#endif -const struct command console_cmds[] = { - {"help", &help_command, &help_parse}, -#ifdef __WIN__ - {"exit", &help_exit, &exit_parse}, -#else - {"quit", &help_quit, &quit_parse}, -#endif - {"loglevel", &help_loglevel, &loglevel_parse}, - {"priority", &help_priority, &priority_parse}, - {"resweep", &help_resweep, &resweep_parse}, - {"reroute", &help_reroute, &reroute_parse}, - {"status", &help_status, &status_parse}, - {"logflush", &help_logflush, &logflush_parse}, - {"querylid", &help_querylid, &querylid_parse}, - {"portstatus", &help_portstatus, &portstatus_parse}, - {"switchbalance", &help_switchbalance, &switchbalance_parse}, - {"lidbalance", &help_lidbalance, &lidbalance_parse}, - {"dump_conf", &help_dump_conf, &dump_conf_parse}, - {"update_desc", &help_update_desc, &update_desc_parse}, - {"version", &help_version, &version_parse}, -#ifdef ENABLE_OSM_PERF_MGR - {"perfmgr", &help_perfmgr, &perfmgr_parse}, -#endif /* ENABLE_OSM_PERF_MGR */ -#ifndef __WIN__ - {"dump_portguid", &help_dump_portguid, &dump_portguid_parse}, -#endif - {NULL, NULL, NULL} /* end of array */ -}; - -static void parse_cmd_line(char *line, osm_opensm_t * p_osm) -{ - char *p_cmd, *p_last; - int i, found = 0; - FILE *out = p_osm->console.out; - - while (isspace(*line)) - line++; - if (!*line) - return; - - /* find first token which is the command */ - p_cmd = strtok_r(line, " \t\n\r", &p_last); - if (p_cmd) { - for (i = 0; console_cmds[i].name; i++) { - if (loop_command.on) { - if (!strcmp(p_cmd, "q")) { - loop_command.on = 0; - } - found = 1; - break; - } - if (!strcmp(p_cmd, console_cmds[i].name)) { - found = 1; - console_cmds[i].parse_function(&p_last, p_osm, - out); - break; - } - } - if (!found) { - fprintf(out, "%s : Command not found\n\n", p_cmd); - help_command(out, 0); - } - } else { - fprintf(out, "Error parsing command line: `%s'\n", line); - } - if (loop_command.on) { - fprintf(out, "use \"q\" to quit loop\n"); - fflush(out); - } -} - -#ifdef __WIN__ - -int osm_console(osm_opensm_t * p_osm) -{ - osm_console_t *p_oct = &p_osm->console; - char p_line[120]; - char *n; - - if (loop_command.on && loop_command_check_time() && - loop_command.loop_function) { - if (p_oct->out) { - loop_command.loop_function(p_osm, p_oct->out); - fflush(p_oct->out); - } else { - loop_command.on = 0; - } - } - - /* Get input line */ - n = fgets(p_line, 120, p_oct->in); - if (n != NULL) { - /* Parse and act on input */ - parse_cmd_line(p_line, p_osm); - if (!loop_command.on) { - osm_console_prompt(p_oct->out); - } - } - - return 0; -} - -#else /* !__WIN__ */ - -int osm_console(osm_opensm_t * p_osm) -{ - struct pollfd pollfd[2]; - char *p_line; - size_t len; - ssize_t n; - struct pollfd *fds; - nfds_t nfds; - osm_console_t *p_oct = &p_osm->console; - - pollfd[0].fd = p_oct->socket; - pollfd[0].events = POLLIN; - pollfd[0].revents = 0; - - pollfd[1].fd = p_oct->in_fd; - pollfd[1].events = POLLIN; - pollfd[1].revents = 0; - - fds = p_oct->socket < 0 ? &pollfd[1] : pollfd; - nfds = p_oct->socket < 0 || pollfd[1].fd < 0 ? 1 : 2; - - if (loop_command.on && loop_command_check_time() && - loop_command.loop_function) { - if (p_oct->out) { - loop_command.loop_function(p_osm, p_oct->out); - fflush(p_oct->out); - } else { - loop_command.on = 0; - } - } - - if (poll(fds, nfds, 1000) <= 0) - return 0; - -#ifdef ENABLE_OSM_CONSOLE_SOCKET - if (pollfd[0].revents & POLLIN) { - int new_fd = 0; - struct sockaddr_in sin; - socklen_t len = sizeof(sin); - struct hostent *hent; - if ((new_fd = accept(p_oct->socket, &sin, &len)) < 0) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "ERR 4B04: Failed to accept console socket: %s\n", - strerror(errno)); - p_oct->in_fd = -1; - return 0; - } - if (inet_ntop - (AF_INET, &sin.sin_addr, p_oct->client_ip, - sizeof(p_oct->client_ip)) == NULL) { - snprintf(p_oct->client_ip, sizeof(p_oct->client_ip), - "STRING_UNKNOWN"); - } - if ((hent = gethostbyaddr((const char *)&sin.sin_addr, - sizeof(struct in_addr), - AF_INET)) == NULL) { - snprintf(p_oct->client_hn, sizeof(p_oct->client_hn), - "STRING_UNKNOWN"); - } else { - snprintf(p_oct->client_hn, sizeof(p_oct->client_hn), - "%s", hent->h_name); - } - if (is_authorized(p_oct)) { - cio_open(p_oct, new_fd, &p_osm->log); - } else { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "ERR 4B05: Console connection denied: %s (%s)\n", - p_oct->client_hn, p_oct->client_ip); - close(new_fd); - } - return 0; - } -#endif - - if (pollfd[1].revents & POLLIN) { - p_line = NULL; - /* Get input line */ - n = getline(&p_line, &len, p_oct->in); - if (n > 0) { - /* Parse and act on input */ - parse_cmd_line(p_line, p_osm); - if (!loop_command.on) { - osm_console_prompt(p_oct->out); - } - } else - cio_close(p_oct, &p_osm->log); - if (p_line) - free(p_line); - return 0; - } - /* input fd is closed (hanged up) */ - if (pollfd[1].revents & POLLHUP) { -#ifdef ENABLE_OSM_CONSOLE_SOCKET - /* If we are using a socket, we close the current connection */ - if (p_oct->socket >= 0) { - cio_close(p_oct, &p_osm->log); - return 0; - } -#endif - /* If we use a local console, stdin is closed (most probable is pipe ended) - * so we close the local console */ - return -1; - } - - return 0; -} -#endif /* __WIN__ */ diff --git a/branches/opensm_3/user/opensm/osm_console_io.c b/branches/opensm_3/user/opensm/osm_console_io.c deleted file mode 100644 index afb26363..00000000 --- a/branches/opensm_3/user/opensm/osm_console_io.c +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (c) 2005-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2008 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Provide a framework for the Console which decouples the connection - * or I/O from the functionality, or commands. - * - * Extensible - allows a variety of connection methods independent of - * the console commands. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#define _GNU_SOURCE /* for getline */ -#ifdef ENABLE_OSM_CONSOLE_SOCKET -#include -#include -#include -#include -#endif -#include -#include -#include -#include - -static int is_local(char *str) -{ - /* convenience - checks if just stdin/stdout */ - if (str) - return (strcmp(str, OSM_LOCAL_CONSOLE) == 0); - return 0; -} - -static int is_loopback(char *str) -{ - /* convenience - checks if socket based connection */ - if (str) - return (strcmp(str, OSM_LOOPBACK_CONSOLE) == 0); - return 0; -} - -static int is_remote(char *str) -{ - /* convenience - checks if socket based connection */ - if (str) - return strcmp(str, OSM_REMOTE_CONSOLE) == 0 || is_loopback(str); - return 0; -} - -int is_console_enabled(osm_subn_opt_t * p_opt) -{ - /* checks for a variety of types of consoles - default is off or 0 */ - if (p_opt) - return is_local(p_opt->console) || is_loopback(p_opt->console) - || is_remote(p_opt->console); - return 0; -} - - -#ifdef ENABLE_OSM_CONSOLE_SOCKET -int cio_close(osm_console_t * p_oct, osm_log_t * p_log) -{ - int rtnval = -1; - if (p_oct && p_oct->in_fd > 0) { - OSM_LOG(p_log, OSM_LOG_INFO, - "Console connection closed: %s (%s)\n", - p_oct->client_hn, p_oct->client_ip); - rtnval = close(p_oct->in_fd); - p_oct->in_fd = -1; - p_oct->out_fd = -1; - p_oct->in = NULL; - p_oct->out = NULL; - } - return rtnval; -} - -int cio_open(osm_console_t * p_oct, int new_fd, osm_log_t * p_log) -{ - /* returns zero if opened fine, -1 otherwise */ - char *p_line; - size_t len; - ssize_t n; - - if (p_oct->in_fd >= 0) { - FILE *file = fdopen(new_fd, "w+"); - - fprintf(file, "OpenSM Console connection already in use\n" - " kill other session (y/n)? "); - fflush(file); - p_line = NULL; - n = getline(&p_line, &len, file); - if (n > 0 && (p_line[0] == 'y' || p_line[0] == 'Y')) - cio_close(p_oct, p_log); - else { - OSM_LOG(p_log, OSM_LOG_INFO, - "Console connection aborted: %s (%s)\n", - p_oct->client_hn, p_oct->client_ip); - close(new_fd); - return -1; - } - } - p_oct->in_fd = new_fd; - p_oct->out_fd = p_oct->in_fd; - p_oct->in = fdopen(p_oct->in_fd, "w+"); - p_oct->out = p_oct->in; - osm_console_prompt(p_oct->out); - OSM_LOG(p_log, OSM_LOG_INFO, "Console connection accepted: %s (%s)\n", - p_oct->client_hn, p_oct->client_ip); - - return (p_oct->in == NULL) ? -1 : 0; -} - -/********************************************************************** - * Do authentication & authorization check - **********************************************************************/ -int is_authorized(osm_console_t * p_oct) -{ - /* allowed to use the console? */ - p_oct->authorized = !is_remote(p_oct->client_type) || - hosts_ctl(OSM_DAEMON_NAME, p_oct->client_hn, p_oct->client_ip, - "STRING_UNKNOWN"); - return p_oct->authorized; -} -#endif - -void osm_console_prompt(FILE * out) -{ - if (out) { - fprintf(out, "OpenSM %s", OSM_COMMAND_PROMPT); - fflush(out); - } -} - -int osm_console_init(osm_subn_opt_t * opt, osm_console_t * p_oct, osm_log_t * p_log) -{ - p_oct->socket = -1; - strncpy(p_oct->client_type, opt->console, sizeof(p_oct->client_type)); - - /* set up the file descriptors for the console */ - if (strcmp(opt->console, OSM_LOCAL_CONSOLE) == 0) { - p_oct->in = stdin; - p_oct->out = stdout; - p_oct->in_fd = fileno(stdin); - p_oct->out_fd = fileno(stdout); - - osm_console_prompt(p_oct->out); -#ifdef ENABLE_OSM_CONSOLE_SOCKET - } else if (strcmp(opt->console, OSM_REMOTE_CONSOLE) == 0 - || strcmp(opt->console, OSM_LOOPBACK_CONSOLE) == 0) { - struct sockaddr_in sin; - int optval = 1; - - if ((p_oct->socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "ERR 4B01: Failed to open console socket: %s\n", - strerror(errno)); - return -1; - } - setsockopt(p_oct->socket, SOL_SOCKET, SO_REUSEADDR, - &optval, sizeof(optval)); - sin.sin_family = AF_INET; - sin.sin_port = htons(opt->console_port); - if (strcmp(opt->console, OSM_REMOTE_CONSOLE) == 0) - sin.sin_addr.s_addr = htonl(INADDR_ANY); - else - sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - if (bind(p_oct->socket, &sin, sizeof(sin)) < 0) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "ERR 4B02: Failed to bind console socket: %s\n", - strerror(errno)); - return -1; - } - if (listen(p_oct->socket, 1) < 0) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "ERR 4B03: Failed to listen on socket: %s\n", - strerror(errno)); - return -1; - } - - signal(SIGPIPE, SIG_IGN); /* protect ourselves from closed pipes */ - p_oct->in = NULL; - p_oct->out = NULL; - p_oct->in_fd = -1; - p_oct->out_fd = -1; - OSM_LOG(p_log, OSM_LOG_INFO, - "Console listening on port %d\n", opt->console_port); -#endif - } - - return 0; -} - -/* clean up and release resources */ -void osm_console_exit(osm_console_t * p_oct, osm_log_t * p_log) -{ -#ifdef ENABLE_OSM_CONSOLE_SOCKET - cio_close(p_oct, p_log); - if (p_oct->socket > 0) { - OSM_LOG(p_log, OSM_LOG_INFO, "Closing console socket\n"); - close(p_oct->socket); - p_oct->socket = -1; - } -#endif -} diff --git a/branches/opensm_3/user/opensm/osm_db_files.c b/branches/opensm_3/user/opensm/osm_db_files.c deleted file mode 100644 index 5b4dedd0..00000000 --- a/branches/opensm_3/user/opensm/osm_db_files.c +++ /dev/null @@ -1,691 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of the osm_db interface using simple text files - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include - -/****d* Database/OSM_DB_MAX_LINE_LEN - * NAME - * OSM_DB_MAX_LINE_LEN - * - * DESCRIPTION - * The Maximal line length allowed for the file - * - * SYNOPSIS - */ -#define OSM_DB_MAX_LINE_LEN 1024 -/**********/ - -/****d* Database/OSM_DB_MAX_GUID_LEN - * NAME - * OSM_DB_MAX_GUID_LEN - * - * DESCRIPTION - * The Maximal word length allowed for the file (guid or lid) - * - * SYNOPSIS - */ -#define OSM_DB_MAX_GUID_LEN 32 -/**********/ - -/****s* OpenSM: Database/osm_db_domain_imp - * NAME - * osm_db_domain_imp - * - * DESCRIPTION - * An implementation for domain of the database based on text files and - * hash tables. - * - * SYNOPSIS - */ -typedef struct osm_db_domain_imp { - char *file_name; - st_table *p_hash; - cl_spinlock_t lock; -} osm_db_domain_imp_t; -/* - * FIELDS - * - * SEE ALSO - * osm_db_domain_t - *********/ - -/****s* OpenSM: Database/osm_db_imp_t - * NAME - * osm_db_imp_t - * - * DESCRIPTION - * An implementation for file based database - * - * SYNOPSIS - */ -typedef struct osm_db_imp { - char *db_dir_name; -} osm_db_imp_t; -/* - * FIELDS - * - * db_dir_name - * The directory holding the database - * - * SEE ALSO - * osm_db_t - *********/ - -void osm_db_construct(IN osm_db_t * p_db) -{ - memset(p_db, 0, sizeof(osm_db_t)); - cl_list_construct(&p_db->domains); -} - -void osm_db_domain_destroy(IN osm_db_domain_t * p_db_domain) -{ - osm_db_domain_imp_t *p_domain_imp; - p_domain_imp = (osm_db_domain_imp_t *) p_db_domain->p_domain_imp; - - osm_db_clear(p_db_domain); - - cl_spinlock_destroy(&p_domain_imp->lock); - - st_free_table(p_domain_imp->p_hash); - free(p_domain_imp->file_name); - free(p_domain_imp); -} - -void osm_db_destroy(IN osm_db_t * p_db) -{ - osm_db_domain_t *p_domain; - - while ((p_domain = cl_list_remove_head(&p_db->domains)) != NULL) { - osm_db_domain_destroy(p_domain); - free(p_domain); - } - cl_list_destroy(&p_db->domains); - free(p_db->p_db_imp); -} - -int osm_db_init(IN osm_db_t * p_db, IN osm_log_t * p_log) -{ - osm_db_imp_t *p_db_imp; - struct stat dstat; - - OSM_LOG_ENTER(p_log); - - p_db_imp = (osm_db_imp_t *) malloc(sizeof(osm_db_imp_t)); - CL_ASSERT(p_db_imp != NULL); - - p_db_imp->db_dir_name = getenv("OSM_CACHE_DIR"); - if (!p_db_imp->db_dir_name || !(*p_db_imp->db_dir_name)) - p_db_imp->db_dir_name = strdup_expand(OSM_DEFAULT_CACHE_DIR); - - /* Create the directory if it doesn't exist */ - /* There is a difference in creating directory between windows and linux */ -#ifdef __WIN__ - /* Check if the directory exists. If not - create it. */ - CreateDirectory(p_db_imp->db_dir_name, NULL); -#else /* __WIN__ */ - /* make sure the directory exists */ - if (lstat(p_db_imp->db_dir_name, &dstat)) { - if (mkdir(p_db_imp->db_dir_name, 0755)) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 6101: " - "Failed to create the db directory:%s\n", - p_db_imp->db_dir_name); - OSM_LOG_EXIT(p_log); - return 1; - } - } -#endif - - p_db->p_log = p_log; - p_db->p_db_imp = (void *)p_db_imp; - - cl_list_init(&p_db->domains, 5); - - OSM_LOG_EXIT(p_log); - - return 0; -} - -osm_db_domain_t *osm_db_domain_init(IN osm_db_t * p_db, IN char *domain_name) -{ - osm_db_domain_t *p_domain; - osm_db_domain_imp_t *p_domain_imp; - size_t path_len; - osm_log_t *p_log = p_db->p_log; - FILE *p_file; - - OSM_LOG_ENTER(p_log); - - /* allocate a new domain object */ - p_domain = malloc(sizeof(osm_db_domain_t)); - CL_ASSERT(p_domain != NULL); - - p_domain_imp = malloc(sizeof(osm_db_domain_imp_t)); - CL_ASSERT(p_domain_imp != NULL); - - path_len = strlen(((osm_db_imp_t *) p_db->p_db_imp)->db_dir_name) - + strlen(domain_name) + 2; - - /* set the domain file name */ - p_domain_imp->file_name = malloc(path_len); - CL_ASSERT(p_domain_imp->file_name != NULL); - snprintf(p_domain_imp->file_name, path_len, -#ifdef __WIN__ - "%s\\%s", -#else - "%s/%s", -#endif - ((osm_db_imp_t *) p_db->p_db_imp)->db_dir_name, domain_name); - - /* make sure the file exists - or exit if not writable */ - p_file = fopen(p_domain_imp->file_name, "a+"); - if (!p_file) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 6102: " - "Failed to open the db file:%s\n", - p_domain_imp->file_name); - free(p_domain_imp); - free(p_domain); - p_domain = NULL; - goto Exit; - } - fclose(p_file); - - /* initialize the hash table object */ - p_domain_imp->p_hash = st_init_strtable(); - CL_ASSERT(p_domain_imp->p_hash != NULL); - - p_domain->p_db = p_db; - cl_list_insert_tail(&p_db->domains, p_domain); - p_domain->p_domain_imp = p_domain_imp; - cl_spinlock_construct(&p_domain_imp->lock); - cl_spinlock_init(&p_domain_imp->lock); - -Exit: - OSM_LOG_EXIT(p_log); - return p_domain; -} - -int osm_db_restore(IN osm_db_domain_t * p_domain) -{ - - osm_log_t *p_log = p_domain->p_db->p_log; - osm_db_domain_imp_t *p_domain_imp = - (osm_db_domain_imp_t *) p_domain->p_domain_imp; - FILE *p_file; - int status; - char sLine[OSM_DB_MAX_LINE_LEN]; - boolean_t before_key; - char *p_first_word, *p_rest_of_line, *p_last; - char *p_key = NULL; - char *p_prev_val, *p_accum_val = NULL; - char *endptr = NULL; - unsigned int line_num; - - OSM_LOG_ENTER(p_log); - - /* take the lock on the domain */ - cl_spinlock_acquire(&p_domain_imp->lock); - - /* open the file - read mode */ - p_file = fopen(p_domain_imp->file_name, "r"); - - if (!p_file) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 6103: " - "Failed to open the db file:%s\n", - p_domain_imp->file_name); - status = 1; - goto Exit; - } - - /* parse the file allocating new hash tables as required */ - /* - states: - before_key (0) -> in_key (1) - - before_key: if a word on the first byte - it is the key. state=in_key - the rest of the line is start of the value. - in_key: unless the line is empty - add it (with newlines) to the value. - if empty: state=before_key - */ - status = 0; - before_key = TRUE; - line_num = 0; - /* if we got to EOF in the middle of a key we add a last newline */ - while ((fgets(sLine, OSM_DB_MAX_LINE_LEN, p_file) != NULL) || - ((before_key == FALSE) && strcpy(sLine, "\n")) - ) { - line_num++; - if (before_key) { - if ((sLine[0] != ' ') && (sLine[0] != '\t') - && (sLine[0] != '\n')) { - /* we got a new key */ - before_key = FALSE; - - /* handle the key */ - p_first_word = - strtok_r(sLine, " \t\n", &p_last); - if (!p_first_word) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "ERR 6104: " - "Failed to get key from line:%u : %s (file:%s)\n", - line_num, sLine, - p_domain_imp->file_name); - status = 1; - goto EndParsing; - } - if (strlen(p_first_word) > OSM_DB_MAX_GUID_LEN) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "ERR 610A: " - "Illegal key from line:%u : %s (file:%s)\n", - line_num, sLine, - p_domain_imp->file_name); - status = 1; - goto EndParsing; - } - - p_key = malloc(sizeof(char) * - (strlen(p_first_word) + 1)); - strcpy(p_key, p_first_word); - - p_rest_of_line = strtok_r(NULL, "\n", &p_last); - if (p_rest_of_line != NULL) { - p_accum_val = malloc(sizeof(char) * - (strlen(p_rest_of_line) + 1)); - strcpy(p_accum_val, p_rest_of_line); - } else { - p_accum_val = malloc(2); - strcpy(p_accum_val, "\0"); - } - } else if (sLine[0] != '\n') { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 6105: " - "How did we get here? line:%u : %s (file:%s)\n", - line_num, sLine, - p_domain_imp->file_name); - status = 1; - goto EndParsing; - } - } /* before key */ - else { - /* we already have a key */ - - if (sLine[0] == '\n') { - /* got an end of key */ - before_key = TRUE; - - /* make sure the key was not previously used */ - if (st_lookup(p_domain_imp->p_hash, - (st_data_t) p_key, - (void *)&p_prev_val)) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "ERR 6106: " - "Key:%s already exists in:%s with value:%s." - " Removing it\n", p_key, - p_domain_imp->file_name, - p_prev_val); - } else { - p_prev_val = NULL; - } - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Got key:%s value:%s\n", p_key, - p_accum_val); - - /* check that the key is a number */ - if (!strtouq(p_key, &endptr, 0) - && *endptr != '\0') { - OSM_LOG(p_log, OSM_LOG_ERROR, - "ERR 610B: " - "Key:%s is invalid\n", p_key); - } else { - /* store our key and value */ - st_insert(p_domain_imp->p_hash, - (st_data_t) p_key, - (st_data_t) p_accum_val); - } - } else { - /* accumulate into the value */ - p_prev_val = p_accum_val; - p_accum_val = malloc(strlen(p_prev_val) + - strlen(sLine) + 1); - strcpy(p_accum_val, p_prev_val); - free(p_prev_val); - strcat(p_accum_val, sLine); - } - } /* in key */ - } /* while lines or last line */ - -EndParsing: - fclose(p_file); - -Exit: - cl_spinlock_release(&p_domain_imp->lock); - OSM_LOG_EXIT(p_log); - return status; -} - -static int dump_tbl_entry(st_data_t key, st_data_t val, st_data_t arg) -{ - FILE *p_file = (FILE *) arg; - char *p_key = (char *)key; - char *p_val = (char *)val; - - fprintf(p_file, "%s %s\n\n", p_key, p_val); - return ST_CONTINUE; -} - -int osm_db_store(IN osm_db_domain_t * p_domain) -{ - osm_log_t *p_log = p_domain->p_db->p_log; - osm_db_domain_imp_t *p_domain_imp; - FILE *p_file; - int status = 0; - char *p_tmp_file_name; - - OSM_LOG_ENTER(p_log); - - p_domain_imp = (osm_db_domain_imp_t *) p_domain->p_domain_imp; - p_tmp_file_name = malloc(sizeof(char) * - (strlen(p_domain_imp->file_name) + 8)); - strcpy(p_tmp_file_name, p_domain_imp->file_name); - strcat(p_tmp_file_name, ".tmp"); - - cl_spinlock_acquire(&p_domain_imp->lock); - - /* open up the output file */ - p_file = fopen(p_tmp_file_name, "w"); - if (!p_file) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 6107: " - "Failed to open the db file:%s for writing\n", - p_domain_imp->file_name); - status = 1; - goto Exit; - } - - st_foreach(p_domain_imp->p_hash, dump_tbl_entry, (st_data_t) p_file); - fclose(p_file); - - /* move the domain file */ - status = remove(p_domain_imp->file_name); - if (status) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 6109: " - "Failed to remove file:%s (err:%u)\n", - p_domain_imp->file_name, status); - } - - status = rename(p_tmp_file_name, p_domain_imp->file_name); - if (status) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 6108: " - "Failed to rename the db file to:%s (err:%u)\n", - p_domain_imp->file_name, status); - } -Exit: - cl_spinlock_release(&p_domain_imp->lock); - free(p_tmp_file_name); - OSM_LOG_EXIT(p_log); - return status; -} - -/* simply de-allocate the key and the value and return the code - that makes the st_foreach delete the entry */ -static int clear_tbl_entry(st_data_t key, st_data_t val, st_data_t arg) -{ - free((char *)key); - free((char *)val); - return ST_DELETE; -} - -int osm_db_clear(IN osm_db_domain_t * p_domain) -{ - osm_db_domain_imp_t *p_domain_imp = - (osm_db_domain_imp_t *) p_domain->p_domain_imp; - - cl_spinlock_acquire(&p_domain_imp->lock); - st_foreach(p_domain_imp->p_hash, clear_tbl_entry, (st_data_t) NULL); - cl_spinlock_release(&p_domain_imp->lock); - - return 0; -} - -static int get_key_of_tbl_entry(st_data_t key, st_data_t val, st_data_t arg) -{ - cl_list_t *p_list = (cl_list_t *) arg; - cl_list_insert_tail(p_list, (void *)key); - return ST_CONTINUE; -} - -int osm_db_keys(IN osm_db_domain_t * p_domain, OUT cl_list_t * p_key_list) -{ - osm_db_domain_imp_t *p_domain_imp = - (osm_db_domain_imp_t *) p_domain->p_domain_imp; - - cl_spinlock_acquire(&p_domain_imp->lock); - - st_foreach(p_domain_imp->p_hash, get_key_of_tbl_entry, - (st_data_t) p_key_list); - - cl_spinlock_release(&p_domain_imp->lock); - - return 0; -} - -char *osm_db_lookup(IN osm_db_domain_t * p_domain, IN char *p_key) -{ - osm_db_domain_imp_t *p_domain_imp = - (osm_db_domain_imp_t *) p_domain->p_domain_imp; - char *p_val = NULL; - - cl_spinlock_acquire(&p_domain_imp->lock); - - if (!st_lookup(p_domain_imp->p_hash, (st_data_t) p_key, (void *)&p_val)) - p_val = NULL; - - cl_spinlock_release(&p_domain_imp->lock); - - return p_val; -} - -int osm_db_update(IN osm_db_domain_t * p_domain, IN char *p_key, IN char *p_val) -{ - osm_log_t *p_log = p_domain->p_db->p_log; - osm_db_domain_imp_t *p_domain_imp = - (osm_db_domain_imp_t *) p_domain->p_domain_imp; - char *p_prev_val = NULL; - char *p_new_key; - char *p_new_val; - - cl_spinlock_acquire(&p_domain_imp->lock); - - if (st_lookup(p_domain_imp->p_hash, - (st_data_t) p_key, (void *)&p_prev_val)) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Key:%s previously exists in:%s with value:%s\n", - p_key, p_domain_imp->file_name, p_prev_val); - p_new_key = p_key; - } else { - /* need to allocate the key */ - p_new_key = malloc(sizeof(char) * (strlen(p_key) + 1)); - strcpy(p_new_key, p_key); - } - - /* need to arange a new copy of the value */ - p_new_val = malloc(sizeof(char) * (strlen(p_val) + 1)); - strcpy(p_new_val, p_val); - - st_insert(p_domain_imp->p_hash, (st_data_t) p_new_key, - (st_data_t) p_new_val); - - if (p_prev_val) - free(p_prev_val); - - cl_spinlock_release(&p_domain_imp->lock); - - return 0; -} - -int osm_db_delete(IN osm_db_domain_t * p_domain, IN char *p_key) -{ - osm_log_t *p_log = p_domain->p_db->p_log; - osm_db_domain_imp_t *p_domain_imp = - (osm_db_domain_imp_t *) p_domain->p_domain_imp; - char *p_prev_val = NULL; - int res; - - OSM_LOG_ENTER(p_log); - - cl_spinlock_acquire(&p_domain_imp->lock); - if (st_delete(p_domain_imp->p_hash, - (void *)&p_key, (void *)&p_prev_val)) { - if (st_lookup(p_domain_imp->p_hash, - (st_data_t) p_key, (void *)&p_prev_val)) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "key:%s still exists in:%s with value:%s\n", - p_key, p_domain_imp->file_name, p_prev_val); - res = 1; - } else { - free(p_key); - free(p_prev_val); - res = 0; - } - } else { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "fail to find key:%s. delete failed\n", p_key); - res = 1; - } - cl_spinlock_release(&p_domain_imp->lock); - - OSM_LOG_EXIT(p_log); - return res; -} - -#ifdef TEST_OSMDB -#include -#include - -int main(int argc, char **argv) -{ - osm_db_t db; - osm_log_t log; - osm_db_domain_t *p_dbd; - cl_list_t keys; - cl_list_iterator_t kI; - char *p_key; - char *p_val; - int i; - - cl_list_construct(&keys); - cl_list_init(&keys, 10); - - osm_log_init_v2(&log, TRUE, 0xff, "/var/log/osm_db_test.log", 0, FALSE); - - osm_db_construct(&db); - if (osm_db_init(&db, &log)) { - printf("db init failed\n"); - exit(1); - } - - p_dbd = osm_db_domain_init(&db, "lid_by_guid"); - - if (osm_db_restore(p_dbd)) { - printf("failed to restore\n"); - } - - if (osm_db_keys(p_dbd, &keys)) { - printf("failed to get keys\n"); - } else { - kI = cl_list_head(&keys); - while (kI != cl_list_end(&keys)) { - p_key = cl_list_obj(kI); - kI = cl_list_next(kI); - - p_val = osm_db_lookup(p_dbd, p_key); - printf("key = %s val = %s\n", p_key, p_val); - } - } - - cl_list_remove_all(&keys); - - /* randomly add and remove numbers */ - for (i = 0; i < 10; i++) { - int k; - float v; - int is_add; - char val_buf[16]; - char key_buf[16]; - - k = floor(1.0 * rand() / RAND_MAX * 100); - v = rand(); - sprintf(key_buf, "%u", k); - sprintf(val_buf, "%u", v); - - is_add = (rand() < RAND_MAX / 2); - - if (is_add) { - osm_db_update(p_dbd, key_buf, val_buf); - } else { - osm_db_delete(p_dbd, key_buf); - } - } - if (osm_db_keys(p_dbd, &keys)) { - printf("failed to get keys\n"); - } else { - kI = cl_list_head(&keys); - while (kI != cl_list_end(&keys)) { - p_key = cl_list_obj(kI); - kI = cl_list_next(kI); - - p_val = osm_db_lookup(p_dbd, p_key); - printf("key = %s val = %s\n", p_key, p_val); - } - } - if (osm_db_store(p_dbd)) - printf("failed to store\n"); - - osm_db_destroy(&db); - cl_list_destroy(&keys); -} -#endif diff --git a/branches/opensm_3/user/opensm/osm_db_pack.c b/branches/opensm_3/user/opensm/osm_db_pack.c deleted file mode 100644 index a1b61a79..00000000 --- a/branches/opensm_3/user/opensm/osm_db_pack.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include - -static inline void pack_guid(uint64_t guid, char *p_guid_str) -{ - sprintf(p_guid_str, "0x%016" PRIx64, guid); -} - -static inline uint64_t unpack_guid(char *p_guid_str) -{ - return strtoull(p_guid_str, NULL, 0); -} - -static inline void pack_lids(uint16_t min_lid, uint16_t max_lid, char *lid_str) -{ - sprintf(lid_str, "0x%04x 0x%04x", min_lid, max_lid); -} - -static inline int unpack_lids(IN char *p_lid_str, OUT uint16_t * p_min_lid, - OUT uint16_t * p_max_lid) -{ - unsigned long tmp; - char *p_next; - char *p_num; - char lids_str[24]; - - strncpy(lids_str, p_lid_str, 23); - lids_str[23] = '\0'; - p_num = strtok_r(lids_str, " \t", &p_next); - if (!p_num) - return 1; - tmp = strtoul(p_num, NULL, 0); - CL_ASSERT(tmp < 0x10000); - *p_min_lid = (uint16_t) tmp; - - p_num = strtok_r(NULL, " \t", &p_next); - if (!p_num) - return 1; - tmp = strtoul(p_num, NULL, 0); - CL_ASSERT(tmp < 0x10000); - *p_max_lid = (uint16_t) tmp; - - return 0; -} - -int osm_db_guid2lid_guids(IN osm_db_domain_t * p_g2l, - OUT cl_qlist_t * p_guid_list) -{ - char *p_key; - cl_list_t keys; - osm_db_guid_elem_t *p_guid_elem; - - cl_list_construct(&keys); - cl_list_init(&keys, 10); - - if (osm_db_keys(p_g2l, &keys)) - return 1; - - while ((p_key = cl_list_remove_head(&keys)) != NULL) { - p_guid_elem = - (osm_db_guid_elem_t *) malloc(sizeof(osm_db_guid_elem_t)); - CL_ASSERT(p_guid_elem != NULL); - - p_guid_elem->guid = unpack_guid(p_key); - cl_qlist_insert_head(p_guid_list, &p_guid_elem->item); - } - - cl_list_destroy(&keys); - return 0; -} - -int osm_db_guid2lid_get(IN osm_db_domain_t * p_g2l, IN uint64_t guid, - OUT uint16_t * p_min_lid, OUT uint16_t * p_max_lid) -{ - char guid_str[20]; - char *p_lid_str; - uint16_t min_lid, max_lid; - - pack_guid(guid, guid_str); - p_lid_str = osm_db_lookup(p_g2l, guid_str); - if (!p_lid_str) - return 1; - if (unpack_lids(p_lid_str, &min_lid, &max_lid)) - return 1; - - if (p_min_lid) - *p_min_lid = min_lid; - if (p_max_lid) - *p_max_lid = max_lid; - - return 0; -} - -int osm_db_guid2lid_set(IN osm_db_domain_t * p_g2l, IN uint64_t guid, - IN uint16_t min_lid, IN uint16_t max_lid) -{ - char guid_str[20]; - char lid_str[16]; - - pack_guid(guid, guid_str); - pack_lids(min_lid, max_lid, lid_str); - - return osm_db_update(p_g2l, guid_str, lid_str); -} - -int osm_db_guid2lid_delete(IN osm_db_domain_t * p_g2l, IN uint64_t guid) -{ - char guid_str[20]; - pack_guid(guid, guid_str); - return osm_db_delete(p_g2l, guid_str); -} diff --git a/branches/opensm_3/user/opensm/osm_drop_mgr.c b/branches/opensm_3/user/opensm/osm_drop_mgr.c deleted file mode 100644 index d8d3e563..00000000 --- a/branches/opensm_3/user/opensm/osm_drop_mgr.c +++ /dev/null @@ -1,491 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_drop_mgr_t. - * This object represents the Drop Manager object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static void drop_mgr_remove_router(osm_sm_t * sm, IN const ib_net64_t portguid) -{ - osm_router_t *p_rtr; - cl_qmap_t *p_rtr_guid_tbl; - - p_rtr_guid_tbl = &sm->p_subn->rtr_guid_tbl; - p_rtr = (osm_router_t *) cl_qmap_remove(p_rtr_guid_tbl, portguid); - if (p_rtr != (osm_router_t *) cl_qmap_end(p_rtr_guid_tbl)) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Cleaned router for port guid 0x%016" PRIx64 "\n", - cl_ntoh64(portguid)); - osm_router_delete(&p_rtr); - } -} - -static void drop_mgr_clean_physp(osm_sm_t * sm, IN osm_physp_t * p_physp) -{ - osm_physp_t *p_remote_physp; - osm_port_t *p_remote_port; - - p_remote_physp = osm_physp_get_remote(p_physp); - if (p_remote_physp) { - p_remote_port = osm_get_port_by_guid(sm->p_subn, - p_remote_physp->port_guid); - - if (p_remote_port) { - /* Let's check if this is a case of link that is lost - (both ports weren't recognized), or a "hiccup" in the - subnet - in which case the remote port was - recognized, and its state is ACTIVE. - If this is just a "hiccup" - force a heavy sweep in - the next sweep. We don't want to lose that part of - the subnet. */ - if (p_remote_port->discovery_count && - osm_physp_get_port_state(p_remote_physp) == - IB_LINK_ACTIVE) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Forcing new heavy sweep. Remote " - "port 0x%016" PRIx64 " port num: %u " - "was recognized in ACTIVE state\n", - cl_ntoh64(p_remote_physp->port_guid), - p_remote_physp->port_num); - sm->p_subn->force_heavy_sweep = TRUE; - } - - /* If the remote node is ca or router - need to remove - the remote port, since it is no longer reachable. - This can be done if we reset the discovery count - of the remote port. */ - if (!p_remote_physp->p_node->sw) { - p_remote_port->discovery_count = 0; - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Resetting discovery count of node: " - "0x%016" PRIx64 " port num:%u\n", - cl_ntoh64(osm_node_get_node_guid - (p_remote_physp->p_node)), - p_remote_physp->port_num); - } - } - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Unlinking local node 0x%016" PRIx64 ", port %u" - "\n\t\t\t\tand remote node 0x%016" PRIx64 - ", port %u\n", - cl_ntoh64(osm_node_get_node_guid(p_physp->p_node)), - p_physp->port_num, - cl_ntoh64(osm_node_get_node_guid - (p_remote_physp->p_node)), - p_remote_physp->port_num); - - if (sm->ucast_mgr.cache_valid) - osm_ucast_cache_add_link(&sm->ucast_mgr, p_physp, - p_remote_physp); - - osm_physp_unlink(p_physp, p_remote_physp); - - } - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Clearing node 0x%016" PRIx64 " physical port number %u\n", - cl_ntoh64(osm_node_get_node_guid(p_physp->p_node)), - p_physp->port_num); - - osm_physp_destroy(p_physp); -} - -static void drop_mgr_remove_port(osm_sm_t * sm, IN osm_port_t * p_port) -{ - ib_net64_t port_guid; - osm_port_t *p_port_check; - cl_qmap_t *p_sm_guid_tbl; - osm_mcm_port_t *mcm_port=NULL; - cl_ptr_vector_t *p_port_lid_tbl; - uint16_t min_lid_ho; - uint16_t max_lid_ho; - uint16_t lid_ho; - osm_node_t *p_node; - osm_remote_sm_t *p_sm; - ib_gid_t port_gid; - ib_mad_notice_attr_t notice; - ib_api_status_t status; - - OSM_LOG_ENTER(sm->p_log); - - port_guid = osm_port_get_guid(p_port); - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Unreachable port 0x%016" PRIx64 "\n", cl_ntoh64(port_guid)); - - p_port_check = - (osm_port_t *) cl_qmap_remove(&sm->p_subn->port_guid_tbl, - port_guid); - if (p_port_check != p_port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0101: " - "Port 0x%016" PRIx64 " not in guid table\n", - cl_ntoh64(port_guid)); - goto Exit; - } - - /* issue a notice - trap 65 */ - /* details of the notice */ - notice.generic_type = 0x83; /* is generic subn mgt type */ - ib_notice_set_prod_type_ho(¬ice, 4); /* A class manager generator */ - /* endport ceases to be reachable */ - notice.g_or_v.generic.trap_num = CL_HTON16(65); - /* The sm_base_lid is saved in network order already. */ - notice.issuer_lid = sm->p_subn->sm_base_lid; - /* following C14-72.1.2 and table 119 p725 */ - /* we need to provide the GID */ - port_gid.unicast.prefix = sm->p_subn->opt.subnet_prefix; - port_gid.unicast.interface_id = port_guid; - memcpy(&(notice.data_details.ntc_64_67.gid), - &(port_gid), sizeof(ib_gid_t)); - - /* According to page 653 - the issuer gid in this case of trap - is the SM gid, since the SM is the initiator of this trap. */ - notice.issuer_gid.unicast.prefix = sm->p_subn->opt.subnet_prefix; - notice.issuer_gid.unicast.interface_id = sm->p_subn->sm_port_guid; - - status = osm_report_notice(sm->p_log, sm->p_subn, ¬ice); - if (status != IB_SUCCESS) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0103: " - "Error sending trap reports (%s)\n", - ib_get_err_str(status)); - } - - p_sm_guid_tbl = &sm->p_subn->sm_guid_tbl; - p_sm = (osm_remote_sm_t *) cl_qmap_remove(p_sm_guid_tbl, port_guid); - if (p_sm != (osm_remote_sm_t *) cl_qmap_end(p_sm_guid_tbl)) { - /* need to remove this item */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Cleaned SM for port guid 0x%016" PRIx64 "\n", - cl_ntoh64(port_guid)); - - free(p_sm); - } - - drop_mgr_remove_router(sm, port_guid); - - osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho); - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Clearing abandoned LID range [%u,%u]\n", - min_lid_ho, max_lid_ho); - - p_port_lid_tbl = &sm->p_subn->port_lid_tbl; - for (lid_ho = min_lid_ho; lid_ho <= max_lid_ho; lid_ho++) - cl_ptr_vector_set(p_port_lid_tbl, lid_ho, NULL); - - drop_mgr_clean_physp(sm, p_port->p_physp); - - while (!cl_is_qlist_empty(&p_port->mcm_list)) { - mcm_port = cl_item_obj(cl_qlist_head(&p_port->mcm_list), - mcm_port, list_item); - osm_mgrp_delete_port(sm->p_subn, sm->p_log, mcm_port->mgrp, - p_port->guid); - } - - /* initialize the p_node - may need to get node_desc later */ - p_node = p_port->p_node; - - osm_port_delete(&p_port); - - OSM_LOG(sm->p_log, OSM_LOG_INFO, - "Removed port with GUID:0x%016" PRIx64 - " LID range [%u, %u] of node:%s\n", - cl_ntoh64(port_gid.unicast.interface_id), - min_lid_ho, max_lid_ho, - p_node ? p_node->print_desc : "UNKNOWN"); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -static void drop_mgr_remove_switch(osm_sm_t * sm, IN osm_node_t * p_node) -{ - osm_switch_t *p_sw; - cl_qmap_t *p_sw_guid_tbl; - ib_net64_t node_guid; - - OSM_LOG_ENTER(sm->p_log); - - node_guid = osm_node_get_node_guid(p_node); - p_sw_guid_tbl = &sm->p_subn->sw_guid_tbl; - - p_sw = (osm_switch_t *) cl_qmap_remove(p_sw_guid_tbl, node_guid); - if (p_sw == (osm_switch_t *) cl_qmap_end(p_sw_guid_tbl)) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0102: " - "Node 0x%016" PRIx64 " not in switch table\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - } else { - p_node->sw = NULL; - osm_switch_delete(&p_sw); - } - - OSM_LOG_EXIT(sm->p_log); -} - -static boolean_t drop_mgr_process_node(osm_sm_t * sm, IN osm_node_t * p_node) -{ - osm_physp_t *p_physp; - osm_port_t *p_port; - osm_node_t *p_node_check; - uint32_t port_num; - uint32_t max_ports; - ib_net64_t port_guid; - boolean_t return_val = FALSE; - - OSM_LOG_ENTER(sm->p_log); - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Unreachable node 0x%016" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - - if (sm->ucast_mgr.cache_valid) - osm_ucast_cache_add_node(&sm->ucast_mgr, p_node); - - /* - Delete all the logical and physical port objects - associated with this node. - */ - max_ports = osm_node_get_num_physp(p_node); - for (port_num = 0; port_num < max_ports; port_num++) { - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (p_physp) { - port_guid = osm_physp_get_port_guid(p_physp); - - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - - if (p_port) - drop_mgr_remove_port(sm, p_port); - else - drop_mgr_clean_physp(sm, p_physp); - } - } - - return_val = TRUE; - - if (p_node->sw) - drop_mgr_remove_switch(sm, p_node); - - p_node_check = - (osm_node_t *) cl_qmap_remove(&sm->p_subn->node_guid_tbl, - osm_node_get_node_guid(p_node)); - if (p_node_check != p_node) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0105: " - "Node 0x%016" PRIx64 " not in guid table\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - } - - /* free memory allocated to node */ - osm_node_delete(&p_node); - - OSM_LOG_EXIT(sm->p_log); - return return_val; -} - -static void drop_mgr_check_node(osm_sm_t * sm, IN osm_node_t * p_node) -{ - ib_net64_t node_guid; - osm_physp_t *p_physp; - osm_port_t *p_port; - ib_net64_t port_guid; - - OSM_LOG_ENTER(sm->p_log); - - node_guid = osm_node_get_node_guid(p_node); - - if (osm_node_get_type(p_node) != IB_NODE_TYPE_SWITCH) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0107: " - "Node 0x%016" PRIx64 " is not a switch node\n", - cl_ntoh64(node_guid)); - goto Exit; - } - - /* Make sure we have a switch object for this node */ - if (!p_node->sw) { - /* We do not have switch info for this node */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Node 0x%016" PRIx64 " no switch in table\n", - cl_ntoh64(node_guid)); - - drop_mgr_process_node(sm, p_node); - goto Exit; - } - - /* Make sure we have a port object for port zero */ - p_physp = osm_node_get_physp_ptr(p_node, 0); - if (!p_physp) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Node 0x%016" PRIx64 " no valid physical port 0\n", - cl_ntoh64(node_guid)); - - drop_mgr_process_node(sm, p_node); - goto Exit; - } - - port_guid = osm_physp_get_port_guid(p_physp); - - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Node 0x%016" PRIx64 " has no port object\n", - cl_ntoh64(node_guid)); - - drop_mgr_process_node(sm, p_node); - goto Exit; - } - - if (p_port->discovery_count == 0) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Node 0x%016" PRIx64 " port has discovery count zero\n", - cl_ntoh64(node_guid)); - - drop_mgr_process_node(sm, p_node); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(sm->p_log); - return; -} - -void osm_drop_mgr_process(osm_sm_t * sm) -{ - cl_qmap_t *p_node_guid_tbl, *p_port_guid_tbl; - osm_port_t *p_port, *p_next_port; - osm_node_t *p_node, *p_next_node; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - p_node_guid_tbl = &sm->p_subn->node_guid_tbl; - p_port_guid_tbl = &sm->p_subn->port_guid_tbl; - - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - - p_next_node = (osm_node_t *) cl_qmap_head(p_node_guid_tbl); - while (p_next_node != (osm_node_t *) cl_qmap_end(p_node_guid_tbl)) { - p_node = p_next_node; - p_next_node = - (osm_node_t *) cl_qmap_next(&p_next_node->map_item); - - CL_ASSERT(cl_qmap_key(&p_node->map_item) == - osm_node_get_node_guid(p_node)); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Checking node 0x%016" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - - /* - Check if this node was discovered during the last sweep. - If not, it is unreachable in the current subnet, and - should therefore be removed from the subnet object. - */ - if (p_node->discovery_count == 0) - drop_mgr_process_node(sm, p_node); - } - - /* - Go over all the nodes. If the node is a switch - make sure - there is also a switch record for it, and a portInfo record for - port zero of of the node. - If not - this means that there was some error in getting the data - of this node. Drop the node. - */ - p_next_node = (osm_node_t *) cl_qmap_head(p_node_guid_tbl); - while (p_next_node != (osm_node_t *) cl_qmap_end(p_node_guid_tbl)) { - p_node = p_next_node; - p_next_node = - (osm_node_t *) cl_qmap_next(&p_next_node->map_item); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Checking full discovery of node 0x%016" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - - if (osm_node_get_type(p_node) != IB_NODE_TYPE_SWITCH) - continue; - - /* We are handling a switch node */ - drop_mgr_check_node(sm, p_node); - } - - p_next_port = (osm_port_t *) cl_qmap_head(p_port_guid_tbl); - while (p_next_port != (osm_port_t *) cl_qmap_end(p_port_guid_tbl)) { - p_port = p_next_port; - p_next_port = - (osm_port_t *) cl_qmap_next(&p_next_port->map_item); - - CL_ASSERT(cl_qmap_key(&p_port->map_item) == - osm_port_get_guid(p_port)); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Checking port 0x%016" PRIx64 "\n", - cl_ntoh64(osm_port_get_guid(p_port))); - - /* - If the port is unreachable, remove it from the guid table. - */ - if (p_port->discovery_count == 0) - drop_mgr_remove_port(sm, p_port); - } - - CL_PLOCK_RELEASE(sm->p_lock); - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_dump.c b/branches/opensm_3/user/opensm/osm_dump.c deleted file mode 100644 index a5c7127d..00000000 --- a/branches/opensm_3/user/opensm/osm_dump.c +++ /dev/null @@ -1,639 +0,0 @@ -/* - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Various OpenSM dumpers - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static void dump_ucast_path_distribution(cl_map_item_t * item, FILE * file, - void *cxt) -{ - osm_node_t *p_node; - osm_node_t *p_remote_node; - uint8_t i; - uint8_t num_ports; - uint32_t num_paths; - ib_net64_t remote_guid_ho; - osm_switch_t *p_sw = (osm_switch_t *) item; - - p_node = p_sw->p_node; - num_ports = p_sw->num_ports; - - fprintf(file, "dump_ucast_path_distribution: Switch 0x%" PRIx64 "\n" - "Port : Path Count Through Port", - cl_ntoh64(osm_node_get_node_guid(p_node))); - - for (i = 0; i < num_ports; i++) { - num_paths = osm_switch_path_count_get(p_sw, i); - fprintf(file, "\n %03u : %u", i, num_paths); - if (i == 0) { - fprintf(file, " (switch management port)"); - continue; - } - - p_remote_node = osm_node_get_remote_node(p_node, i, NULL); - if (p_remote_node == NULL) - continue; - - remote_guid_ho = - cl_ntoh64(osm_node_get_node_guid(p_remote_node)); - - switch (osm_node_get_type(p_remote_node)) { - case IB_NODE_TYPE_SWITCH: - fprintf(file, " (link to switch"); - break; - case IB_NODE_TYPE_ROUTER: - fprintf(file, " (link to router"); - break; - case IB_NODE_TYPE_CA: - fprintf(file, " (link to CA"); - break; - default: - fprintf(file, " (link to unknown node type"); - break; - } - - fprintf(file, " 0x%" PRIx64 ")", remote_guid_ho); - } - - fprintf(file, "\n"); -} - -static void dump_ucast_routes(cl_map_item_t * item, FILE * file, void *cxt) -{ - const osm_node_t *p_node; - osm_port_t *p_port; - uint8_t port_num; - uint8_t num_hops; - uint8_t best_hops; - uint8_t best_port; - uint16_t max_lid_ho; - uint16_t lid_ho, base_lid; - boolean_t direct_route_exists = FALSE; - boolean_t dor; - osm_switch_t *p_sw = (osm_switch_t *) item; - osm_opensm_t *p_osm = cxt; - - p_node = p_sw->p_node; - - max_lid_ho = p_sw->max_lid_ho; - - fprintf(file, "dump_ucast_routes: " - "Switch 0x%016" PRIx64 "\nLID : Port : Hops : Optimal\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - - dor = (p_osm->routing_engine_used == OSM_ROUTING_ENGINE_TYPE_DOR); - - for (lid_ho = 1; lid_ho <= max_lid_ho; lid_ho++) { - fprintf(file, "0x%04X : ", lid_ho); - - p_port = osm_get_port_by_lid_ho(&p_osm->subn, lid_ho); - if (!p_port) { - fprintf(file, "UNREACHABLE\n"); - continue; - } - - port_num = osm_switch_get_port_by_lid(p_sw, lid_ho); - if (port_num == OSM_NO_PATH) { - /* - This may occur if there are 'holes' in the existing - LID assignments. Running SM with --reassign_lids - will reassign and compress the LID range. The - subnet should work fine either way. - */ - fprintf(file, "UNREACHABLE\n"); - continue; - } - /* - Switches can lie about which port routes a given - lid due to a recent reconfiguration of the subnet. - Therefore, ensure that the hop count is better than - OSM_NO_PATH. - */ - if (p_port->p_node->sw) { - /* Target LID is switch. - Get its base lid and check hop count for this base LID only. */ - base_lid = osm_node_get_base_lid(p_port->p_node, 0); - base_lid = cl_ntoh16(base_lid); - num_hops = - osm_switch_get_hop_count(p_sw, base_lid, port_num); - } else { - /* Target LID is not switch (CA or router). - Check if we have route to this target from current switch. */ - num_hops = - osm_switch_get_hop_count(p_sw, lid_ho, port_num); - if (num_hops != OSM_NO_PATH) { - direct_route_exists = TRUE; - base_lid = lid_ho; - } else { - osm_physp_t *p_physp = p_port->p_physp; - - if (!p_physp || !p_physp->p_remote_physp || - !p_physp->p_remote_physp->p_node->sw) - num_hops = OSM_NO_PATH; - else { - base_lid = - osm_node_get_base_lid(p_physp-> - p_remote_physp-> - p_node, 0); - base_lid = cl_ntoh16(base_lid); - num_hops = - p_physp->p_remote_physp->p_node-> - sw == - p_sw ? 0 : - osm_switch_get_hop_count(p_sw, - base_lid, - port_num); - } - } - } - - if (num_hops == OSM_NO_PATH) { - fprintf(file, "%03u : HOPS UNKNOWN\n", port_num); - continue; - } - - best_hops = osm_switch_get_least_hops(p_sw, base_lid); - if (!p_port->p_node->sw && !direct_route_exists) { - best_hops++; - num_hops++; - } - - fprintf(file, "%03u : %02u : ", port_num, num_hops); - - if (best_hops == num_hops) - fprintf(file, "yes"); - else { - /* No LMC Optimization */ - best_port = osm_switch_recommend_path(p_sw, p_port, - lid_ho, 1, TRUE, - dor); - fprintf(file, "No %u hop path possible via port %u!", - best_hops, best_port); - } - - fprintf(file, "\n"); - } -} - -static void dump_mcast_routes(cl_map_item_t * item, FILE * file, void *cxt) -{ - osm_switch_t *p_sw = (osm_switch_t *) item; - osm_mcast_tbl_t *p_tbl; - int16_t mlid_ho = 0; - int16_t mlid_start_ho; - uint8_t position = 0; - int16_t block_num = 0; - boolean_t first_mlid; - boolean_t first_port; - const osm_node_t *p_node; - uint16_t i, j; - uint16_t mask_entry; - char sw_hdr[256]; - char mlid_hdr[32]; - - p_node = p_sw->p_node; - - p_tbl = osm_switch_get_mcast_tbl_ptr(p_sw); - - sprintf(sw_hdr, "\nSwitch 0x%016" PRIx64 "\nLID : Out Port(s)\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - first_mlid = TRUE; - while (block_num <= p_tbl->max_block_in_use) { - mlid_start_ho = (uint16_t) (block_num * IB_MCAST_BLOCK_SIZE); - for (i = 0; i < IB_MCAST_BLOCK_SIZE; i++) { - mlid_ho = mlid_start_ho + i; - position = 0; - first_port = TRUE; - sprintf(mlid_hdr, "0x%04X :", - mlid_ho + IB_LID_MCAST_START_HO); - while (position <= p_tbl->max_position) { - mask_entry = - cl_ntoh16((*p_tbl-> - p_mask_tbl)[mlid_ho][position]); - if (mask_entry == 0) { - position++; - continue; - } - for (j = 0; j < 16; j++) { - if ((1 << j) & mask_entry) { - if (first_mlid) { - fprintf(file, "%s", - sw_hdr); - first_mlid = FALSE; - } - if (first_port) { - fprintf(file, "%s", - mlid_hdr); - first_port = FALSE; - } - fprintf(file, " 0x%03X ", - j + (position * 16)); - } - } - position++; - } - if (first_port == FALSE) - fprintf(file, "\n"); - } - block_num++; - } -} - -static void dump_lid_matrix(cl_map_item_t * item, FILE * file, void *cxt) -{ - osm_switch_t *p_sw = (osm_switch_t *) item; - osm_opensm_t *p_osm = cxt; - osm_node_t *p_node = p_sw->p_node; - unsigned max_lid = p_sw->max_lid_ho; - unsigned max_port = p_sw->num_ports; - uint16_t lid; - uint8_t port; - - fprintf(file, "Switch: guid 0x%016" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - for (lid = 1; lid <= max_lid; lid++) { - osm_port_t *p_port; - if (osm_switch_get_least_hops(p_sw, lid) == OSM_NO_PATH) - continue; - fprintf(file, "0x%04x:", lid); - for (port = 0; port < max_port; port++) - fprintf(file, " %02x", - osm_switch_get_hop_count(p_sw, lid, port)); - p_port = osm_get_port_by_lid_ho(&p_osm->subn, lid); - if (p_port) - fprintf(file, " # portguid 0x016%" PRIx64, - cl_ntoh64(osm_port_get_guid(p_port))); - fprintf(file, "\n"); - } -} - -static void dump_ucast_lfts(cl_map_item_t * item, FILE * file, void *cxt) -{ - osm_switch_t *p_sw = (osm_switch_t *) item; - osm_opensm_t *p_osm = cxt; - osm_node_t *p_node = p_sw->p_node; - unsigned max_lid = p_sw->max_lid_ho; - unsigned max_port = p_sw->num_ports; - uint16_t lid; - uint8_t port; - - fprintf(file, "Unicast lids [0-%u] of switch Lid %u guid 0x%016" - PRIx64 " (\'%s\'):\n", - max_lid, cl_ntoh16(osm_node_get_base_lid(p_node, 0)), - cl_ntoh64(osm_node_get_node_guid(p_node)), p_node->print_desc); - for (lid = 0; lid <= max_lid; lid++) { - osm_port_t *p_port; - port = osm_switch_get_port_by_lid(p_sw, lid); - - if (port >= max_port) - continue; - - fprintf(file, "0x%04x %03u # ", lid, port); - - p_port = osm_get_port_by_lid_ho(&p_osm->subn, lid); - if (p_port) { - p_node = p_port->p_node; - fprintf(file, "%s portguid 0x%016" PRIx64 ": \'%s\'", - ib_get_node_type_str(osm_node_get_type(p_node)), - cl_ntoh64(osm_port_get_guid(p_port)), - p_node->print_desc); - } else - fprintf(file, "unknown node and type"); - fprintf(file, "\n"); - } - fprintf(file, "%u lids dumped\n", max_lid); -} - -static void dump_topology_node(cl_map_item_t * item, FILE * file, void *cxt) -{ - osm_node_t *p_node = (osm_node_t *) item; - uint32_t cPort; - osm_node_t *p_nbnode; - osm_physp_t *p_physp, *p_default_physp, *p_rphysp; - uint8_t link_speed_act; - - if (!p_node->node_info.num_ports) - return; - - for (cPort = 1; cPort < osm_node_get_num_physp(p_node); cPort++) { - uint8_t port_state; - - p_physp = osm_node_get_physp_ptr(p_node, cPort); - if (!p_physp) - continue; - - p_rphysp = p_physp->p_remote_physp; - if (!p_rphysp) - continue; - - CL_ASSERT(cPort == p_physp->port_num); - - if (p_node->node_info.node_type == IB_NODE_TYPE_SWITCH) - p_default_physp = osm_node_get_physp_ptr(p_node, 0); - else - p_default_physp = p_physp; - - fprintf(file, "{ %s%s Ports:%02X SystemGUID:%016" PRIx64 - " NodeGUID:%016" PRIx64 " PortGUID:%016" PRIx64 - " VenID:%06X DevID:%04X Rev:%08X {%s} LID:%04X PN:%02X } ", - p_node->node_info.node_type == IB_NODE_TYPE_SWITCH ? - "SW" : p_node->node_info.node_type == - IB_NODE_TYPE_CA ? "CA" : p_node->node_info.node_type == - IB_NODE_TYPE_ROUTER ? "Rt" : "**", - p_default_physp->port_info.base_lid == - p_default_physp->port_info. - master_sm_base_lid ? "-SM" : "", - p_node->node_info.num_ports, - cl_ntoh64(p_node->node_info.sys_guid), - cl_ntoh64(p_node->node_info.node_guid), - cl_ntoh64(p_physp->port_guid), - cl_ntoh32(ib_node_info_get_vendor_id - (&p_node->node_info)), - cl_ntoh16(p_node->node_info.device_id), - cl_ntoh32(p_node->node_info.revision), - p_node->print_desc, - cl_ntoh16(p_default_physp->port_info.base_lid), cPort); - - p_nbnode = p_rphysp->p_node; - - if (p_nbnode->node_info.node_type == IB_NODE_TYPE_SWITCH) - p_default_physp = osm_node_get_physp_ptr(p_nbnode, 0); - else - p_default_physp = p_rphysp; - - fprintf(file, "{ %s%s Ports:%02X SystemGUID:%016" PRIx64 - " NodeGUID:%016" PRIx64 " PortGUID:%016" PRIx64 - " VenID:%08X DevID:%04X Rev:%08X {%s} LID:%04X PN:%02X } ", - p_nbnode->node_info.node_type == IB_NODE_TYPE_SWITCH ? - "SW" : p_nbnode->node_info.node_type == - IB_NODE_TYPE_CA ? "CA" : - p_nbnode->node_info.node_type == IB_NODE_TYPE_ROUTER ? - "Rt" : "**", - p_default_physp->port_info.base_lid == - p_default_physp->port_info. - master_sm_base_lid ? "-SM" : "", - p_nbnode->node_info.num_ports, - cl_ntoh64(p_nbnode->node_info.sys_guid), - cl_ntoh64(p_nbnode->node_info.node_guid), - cl_ntoh64(p_rphysp->port_guid), - cl_ntoh32(ib_node_info_get_vendor_id - (&p_nbnode->node_info)), - cl_ntoh32(p_nbnode->node_info.device_id), - cl_ntoh32(p_nbnode->node_info.revision), - p_nbnode->print_desc, - cl_ntoh16(p_default_physp->port_info.base_lid), - p_rphysp->port_num); - - port_state = ib_port_info_get_port_state(&p_physp->port_info); - link_speed_act = - ib_port_info_get_link_speed_active(&p_physp->port_info); - - fprintf(file, "PHY=%s LOG=%s SPD=%s\n", - p_physp->port_info.link_width_active == 1 ? "1x" : - p_physp->port_info.link_width_active == 2 ? "4x" : - p_physp->port_info.link_width_active == 8 ? "12x" : - "??", - port_state == IB_LINK_ACTIVE ? "ACT" : - port_state == IB_LINK_ARMED ? "ARM" : - port_state == IB_LINK_INIT ? "INI" : "DWN", - link_speed_act == 1 ? "2.5" : - link_speed_act == 2 ? "5" : - link_speed_act == 4 ? "10" : "??"); - } -} - -static void print_node_report(cl_map_item_t * item, FILE * file, void *cxt) -{ - osm_node_t *p_node = (osm_node_t *) item; - osm_opensm_t *osm = cxt; - const osm_physp_t *p_physp, *p_remote_physp; - const ib_port_info_t *p_pi; - uint8_t port_num; - uint32_t num_ports; - uint8_t node_type; - - node_type = osm_node_get_type(p_node); - - num_ports = osm_node_get_num_physp(p_node); - port_num = node_type == IB_NODE_TYPE_SWITCH ? 0 : 1; - for (; port_num < num_ports; port_num++) { - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_physp) - continue; - - fprintf(file, "%-11s : %s : %02X :", - osm_get_manufacturer_str(cl_ntoh64 - (osm_node_get_node_guid - (p_node))), - osm_get_node_type_str_fixed_width(node_type), port_num); - - p_pi = &p_physp->port_info; - - /* - * Port state is not defined for switch port 0 - */ - if (port_num == 0) - fprintf(file, " :"); - else - fprintf(file, " %s :", - osm_get_port_state_str_fixed_width - (ib_port_info_get_port_state(p_pi))); - - /* - * LID values are only meaningful in select cases. - */ - if (ib_port_info_get_port_state(p_pi) != IB_LINK_DOWN - && ((node_type == IB_NODE_TYPE_SWITCH && port_num == 0) - || node_type != IB_NODE_TYPE_SWITCH)) - fprintf(file, " %04X : %01X :", - cl_ntoh16(p_pi->base_lid), - ib_port_info_get_lmc(p_pi)); - else - fprintf(file, " : :"); - - if (port_num != 0) - fprintf(file, " %s : %s : %s ", - osm_get_mtu_str - (ib_port_info_get_neighbor_mtu(p_pi)), - osm_get_lwa_str(p_pi->link_width_active), - osm_get_lsa_str - (ib_port_info_get_link_speed_active(p_pi))); - else - fprintf(file, " : : "); - - if (osm_physp_get_port_guid(p_physp) == osm->subn.sm_port_guid) - fprintf(file, "* %016" PRIx64 " *", - cl_ntoh64(osm_physp_get_port_guid(p_physp))); - else - fprintf(file, ": %016" PRIx64 " :", - cl_ntoh64(osm_physp_get_port_guid(p_physp))); - - if (port_num - && (ib_port_info_get_port_state(p_pi) != IB_LINK_DOWN)) { - p_remote_physp = osm_physp_get_remote(p_physp); - if (p_remote_physp) - fprintf(file, " %016" PRIx64 " (%02X)", - cl_ntoh64(osm_physp_get_port_guid - (p_remote_physp)), - osm_physp_get_port_num(p_remote_physp)); - else - fprintf(file, " UNKNOWN"); - } - - fprintf(file, "\n"); - } - - fprintf(file, "------------------------------------------------------" - "------------------------------------------------\n"); -} - -struct dump_context { - osm_opensm_t *p_osm; - FILE *file; - void (*func) (cl_map_item_t *, FILE *, void *); - void *cxt; -}; - -static void dump_item(cl_map_item_t * item, void *cxt) -{ - ((struct dump_context *)cxt)->func(item, - ((struct dump_context *)cxt)->file, - ((struct dump_context *)cxt)->cxt); -} - -static void dump_qmap(FILE * file, cl_qmap_t * map, - void (*func) (cl_map_item_t *, FILE *, void *), void *cxt) -{ - struct dump_context dump_context; - - dump_context.file = file; - dump_context.func = func; - dump_context.cxt = cxt; - - cl_qmap_apply_func(map, dump_item, &dump_context); -} - -void osm_dump_qmap_to_file(osm_opensm_t * p_osm, const char *file_name, - cl_qmap_t * map, - void (*func) (cl_map_item_t *, FILE *, void *), - void *cxt) -{ - char path[1024]; - FILE *file; - - snprintf(path, sizeof(path), "%s/%s", - p_osm->subn.opt.dump_files_dir, file_name); - - file = fopen(path, "w"); - if (!file) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "cannot create file \'%s\': %s\n", - path, strerror(errno)); - return; - } - - dump_qmap(file, map, func, cxt); - - fclose(file); -} - - -static void print_report(osm_opensm_t * osm, FILE * file) -{ - fprintf(file, "\n===================================================" - "====================================================\n" - "Vendor : Ty : # : Sta : LID : LMC : MTU : LWA :" - " LSA : Port GUID : Neighbor Port (Port #)\n"); - dump_qmap(stdout, &osm->subn.node_guid_tbl, print_node_report, osm); -} - -void osm_dump_mcast_routes(osm_opensm_t * osm) -{ - if (osm_log_is_active(&osm->log, OSM_LOG_ROUTING)) - /* multicast routes */ - osm_dump_qmap_to_file(osm, "opensm.mcfdbs", - &osm->subn.sw_guid_tbl, - dump_mcast_routes, osm); -} - -void osm_dump_all(osm_opensm_t * osm) -{ - if (osm_log_is_active(&osm->log, OSM_LOG_ROUTING)) { - /* unicast routes */ - osm_dump_qmap_to_file(osm, "opensm-lid-matrix.dump", - &osm->subn.sw_guid_tbl, dump_lid_matrix, - osm); - osm_dump_qmap_to_file(osm, "opensm-lfts.dump", - &osm->subn.sw_guid_tbl, dump_ucast_lfts, - osm); - if (osm_log_is_active(&osm->log, OSM_LOG_DEBUG)) - dump_qmap(stdout, &osm->subn.sw_guid_tbl, - dump_ucast_path_distribution, osm); - osm_dump_qmap_to_file(osm, "opensm.fdbs", - &osm->subn.sw_guid_tbl, - dump_ucast_routes, osm); - /* multicast routes */ - osm_dump_qmap_to_file(osm, "opensm.mcfdbs", - &osm->subn.sw_guid_tbl, - dump_mcast_routes, osm); - } - osm_dump_qmap_to_file(osm, "opensm-subnet.lst", - &osm->subn.node_guid_tbl, dump_topology_node, - osm); - if (osm_log_is_active(&osm->log, OSM_LOG_VERBOSE)) - print_report(osm, stdout); -} diff --git a/branches/opensm_3/user/opensm/osm_event_plugin.c b/branches/opensm_3/user/opensm/osm_event_plugin.c deleted file mode 100644 index dbf5a641..00000000 --- a/branches/opensm_3/user/opensm/osm_event_plugin.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2008-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2007 The Regents of the University of California. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/****h* OpenSM Event plugin interface -* DESCRIPTION -* Database interface to record subnet events -* -* Implementations of this object _MUST_ be thread safe. -* -* AUTHOR -* Ira Weiny, LLNL -* -*********/ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include - -#if defined(PATH_MAX) -#define OSM_PATH_MAX (PATH_MAX + 1) -#elif defined (_POSIX_PATH_MAX) -#define OSM_PATH_MAX (_POSIX_PATH_MAX + 1) -#else -#define OSM_PATH_MAX 256 -#endif - -/** - * functions - */ -osm_epi_plugin_t *osm_epi_construct(osm_opensm_t *osm, char *plugin_name) -{ - char lib_name[OSM_PATH_MAX]; - struct old_if { unsigned ver; } *old_impl; - osm_epi_plugin_t *rc = NULL; - - if (!plugin_name || !*plugin_name) - return NULL; - - /* find the plugin */ - snprintf(lib_name, sizeof(lib_name), "lib%s.so", plugin_name); - - rc = malloc(sizeof(*rc)); - if (!rc) - return NULL; - - rc->handle = dlopen(lib_name, RTLD_LAZY); - if (!rc->handle) { - OSM_LOG(&osm->log, OSM_LOG_ERROR, - "Failed to open event plugin \"%s\" : \"%s\"\n", - lib_name, dlerror()); - goto DLOPENFAIL; - } - - rc->impl = - (osm_event_plugin_t *) dlsym(rc->handle, - OSM_EVENT_PLUGIN_IMPL_NAME); - if (!rc->impl) { - OSM_LOG(&osm->log, OSM_LOG_ERROR, - "Failed to find \"%s\" symbol in \"%s\" : \"%s\"\n", - OSM_EVENT_PLUGIN_IMPL_NAME, lib_name, dlerror()); - goto Exit; - } - - /* check for old interface */ - old_impl = (struct old_if *) rc->impl; - if (old_impl->ver == OSM_ORIG_EVENT_PLUGIN_INTERFACE_VER) { - OSM_LOG(&osm->log, OSM_LOG_ERROR, "Error loading plugin: " - "\'%s\' contains a depricated interface version %d\n" - " Please recompile with the new interface.\n", - plugin_name, old_impl->ver); - goto Exit; - } - - /* Check the version to make sure this module will work with us */ - if (strcmp(rc->impl->osm_version, osm->osm_version)) { - OSM_LOG(&osm->log, OSM_LOG_ERROR, "Error loading plugin" - " \'%s\': OpenSM version mismatch - plugin was built" - " against %s version of OpenSM. Skip loading.\n", - plugin_name, rc->impl->osm_version); - goto Exit; - } - - if (!rc->impl->create) { - OSM_LOG(&osm->log, OSM_LOG_ERROR, - "Error loading plugin \'%s\': no create() method.\n", - plugin_name); - goto Exit; - } - - rc->plugin_data = rc->impl->create(osm); - - if (!rc->plugin_data) - goto Exit; - - rc->plugin_name = strdup(plugin_name); - return rc; - -Exit: - dlclose(rc->handle); -DLOPENFAIL: - free(rc); - return NULL; -} - -void osm_epi_destroy(osm_epi_plugin_t * plugin) -{ - if (plugin) { - if (plugin->impl->delete) - plugin->impl->delete(plugin->plugin_data); - dlclose(plugin->handle); - free(plugin->plugin_name); - free(plugin); - } -} diff --git a/branches/opensm_3/user/opensm/osm_files.c b/branches/opensm_3/user/opensm/osm_files.c deleted file mode 100644 index 0540861c..00000000 --- a/branches/opensm_3/user/opensm/osm_files.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - * [4-15-2010] - * - * files moved from SOURCES to here to decrease opensm.exe build time. - * Reduced OpenSM.exe build time by 29 seconds. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - diff --git a/branches/opensm_3/user/opensm/osm_helper.c b/branches/opensm_3/user/opensm/osm_helper.c deleted file mode 100644 index 15b6a2a6..00000000 --- a/branches/opensm_3/user/opensm/osm_helper.c +++ /dev/null @@ -1,2254 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of opensm helper functions. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define LINE_LENGTH 256 - -#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0])) - -/* we use two tables - one for queries and one for responses */ -static const char *ib_sa_method_str[] = { - "RESERVED", /* 0 */ - "SubnAdmGet", /* 1 */ - "SubnAdmSet", /* 2 */ - "RESERVED", /* 3 */ - "RESERVED", /* 4 */ - "RESERVED", /* 5 */ - "SubnAdmReport", /* 6 */ - "RESERVED", /* 7 */ - "RESERVED", /* 8 */ - "RESERVED", /* 9 */ - "RESERVED", /* A */ - "RESERVED", /* B */ - "RESERVED", /* C */ - "RESERVED", /* D */ - "RESERVED", /* E */ - "RESERVED", /* F */ - "RESERVED", /* 10 */ - "RESERVED", /* 11 */ - "SubnAdmGetTable", /* 12 */ - "SubnAdmGetTraceTable", /* 13 */ - "SubnAdmGetMulti", /* 14 */ - "SubnAdmDelete", /* 15 */ - "UNKNOWN" /* 16 */ -}; - -static const char *ib_sa_resp_method_str[] = { - "RESERVED", /* 80 */ - "SubnAdmGetResp", /* 81 */ - "RESERVED (SetResp?)", /* 82 */ - "RESERVED", /* 83 */ - "RESERVED", /* 84 */ - "RESERVED", /* 85 */ - "SubnAdmReportResp", /* 86 */ - "RESERVED", /* 87 */ - "RESERVED", /* 88 */ - "RESERVED", /* 89 */ - "RESERVED", /* 8A */ - "RESERVED", /* 8B */ - "RESERVED", /* 8C */ - "RESERVED", /* 8D */ - "RESERVED", /* 8E */ - "RESERVED", /* 8F */ - "RESERVED", /* 90 */ - "RESERVED", /* 91 */ - "SubnAdmGetTableResp", /* 92 */ - "RESERVED", /* 93 */ - "SubnAdmGetMultiResp", /* 94 */ - "SubnAdmDeleteResp", /* 95 */ - "UNKNOWN" -}; - -#define OSM_SA_METHOD_STR_UNKNOWN_VAL 0x16 - -static const char *ib_sm_method_str[] = { - "RESERVED0", /* 0 */ - "SubnGet", /* 1 */ - "SubnSet", /* 2 */ - "RESERVED3", /* 3 */ - "RESERVED4", /* 4 */ - "SubnTrap", /* 5 */ - "RESERVED6", /* 6 */ - "SubnTrapRepress", /* 7 */ - "RESERVED8", /* 8 */ - "RESERVED9", /* 9 */ - "RESERVEDA", /* A */ - "RESERVEDB", /* B */ - "RESERVEDC", /* C */ - "RESERVEDD", /* D */ - "RESERVEDE", /* E */ - "RESERVEDF", /* F */ - "RESERVED10", /* 10 */ - "SubnGetResp", /* 11 */ - "RESERVED12", /* 12 */ - "RESERVED13", /* 13 */ - "RESERVED14", /* 14 */ - "RESERVED15", /* 15 */ - "RESERVED16", /* 16 */ - "RESERVED17", /* 17 */ - "RESERVED18", /* 18 */ - "RESERVED19", /* 19 */ - "RESERVED1A", /* 1A */ - "RESERVED1B", /* 1B */ - "RESERVED1C", /* 1C */ - "RESERVED1D", /* 1D */ - "RESERVED1E", /* 1E */ - "RESERVED1F", /* 1F */ - "UNKNOWN" /* 20 */ -}; - -#define OSM_SM_METHOD_STR_UNKNOWN_VAL 0x21 - -static const char *ib_sm_attr_str[] = { - "RESERVED", /* 0 */ - "ClassPortInfo", /* 1 */ - "Notice", /* 2 */ - "InformInfo", /* 3 */ - "RESERVED", /* 4 */ - "RESERVED", /* 5 */ - "RESERVED", /* 6 */ - "RESERVED", /* 7 */ - "RESERVED", /* 8 */ - "RESERVED", /* 9 */ - "RESERVED", /* A */ - "RESERVED", /* B */ - "RESERVED", /* C */ - "RESERVED", /* D */ - "RESERVED", /* E */ - "RESERVED", /* F */ - "NodeDescription", /* 10 */ - "NodeInfo", /* 11 */ - "SwitchInfo", /* 12 */ - "UNKNOWN", /* 13 */ - "GUIDInfo", /* 14 */ - "PortInfo", /* 15 */ - "P_KeyTable", /* 16 */ - "SLtoVLMappingTable", /* 17 */ - "VLArbitrationTable", /* 18 */ - "LinearForwardingTable", /* 19 */ - "RandomForwardingTable", /* 1A */ - "MulticastForwardingTable", /* 1B */ - "UNKNOWN", /* 1C */ - "UNKNOWN", /* 1D */ - "UNKNOWN", /* 1E */ - "UNKNOWN", /* 1F */ - "SMInfo", /* 20 */ - "UNKNOWN" /* 21 - always highest value */ -}; - -#define OSM_SM_ATTR_STR_UNKNOWN_VAL 0x21 - -static const char *ib_sa_attr_str[] = { - "RESERVED", /* 0 */ - "ClassPortInfo", /* 1 */ - "Notice", /* 2 */ - "InformInfo", /* 3 */ - "RESERVED", /* 4 */ - "RESERVED", /* 5 */ - "RESERVED", /* 6 */ - "RESERVED", /* 7 */ - "RESERVED", /* 8 */ - "RESERVED", /* 9 */ - "RESERVED", /* A */ - "RESERVED", /* B */ - "RESERVED", /* C */ - "RESERVED", /* D */ - "RESERVED", /* E */ - "RESERVED", /* F */ - "RESERVED", /* 10 */ - "NodeRecord", /* 11 */ - "PortInfoRecord", /* 12 */ - "SLtoVLMappingTableRecord", /* 13 */ - "SwitchInfoRecord", /* 14 */ - "LinearForwardingTableRecord", /* 15 */ - "RandomForwardingTableRecord", /* 16 */ - "MulticastForwardingTableRecord", /* 17 */ - "SMInfoRecord", /* 18 */ - "RESERVED", /* 19 */ - "RandomForwardingTable", /* 1A */ - "MulticastForwardingTable", /* 1B */ - "UNKNOWN", /* 1C */ - "UNKNOWN", /* 1D */ - "UNKNOWN", /* 1E */ - "UNKNOWN", /* 1F */ - "LinkRecord", /* 20 */ - "UNKNOWN", /* 21 */ - "UNKNOWN", /* 22 */ - "UNKNOWN", /* 23 */ - "UNKNOWN", /* 24 */ - "UNKNOWN", /* 25 */ - "UNKNOWN", /* 26 */ - "UNKNOWN", /* 27 */ - "UNKNOWN", /* 28 */ - "UNKNOWN", /* 29 */ - "UNKNOWN", /* 2A */ - "UNKNOWN", /* 2B */ - "UNKNOWN", /* 2C */ - "UNKNOWN", /* 2D */ - "UNKNOWN", /* 2E */ - "UNKNOWN", /* 2F */ - "GuidInfoRecord", /* 30 */ - "ServiceRecord", /* 31 */ - "UNKNOWN", /* 32 */ - "P_KeyTableRecord", /* 33 */ - "UNKNOWN", /* 34 */ - "PathRecord", /* 35 */ - "VLArbitrationTableRecord", /* 36 */ - "UNKNOWN", /* 37 */ - "MCMemberRecord", /* 38 */ - "TraceRecord", /* 39 */ - "MultiPathRecord", /* 3A */ - "ServiceAssociationRecord", /* 3B */ - "UNKNOWN", /* 3C */ - "UNKNOWN", /* 3D */ - "UNKNOWN", /* 3E */ - "UNKNOWN", /* 3F */ - "UNKNOWN", /* 40 */ - "UNKNOWN", /* 41 */ - "UNKNOWN", /* 42 */ - "UNKNOWN", /* 43 */ - "UNKNOWN", /* 44 */ - "UNKNOWN", /* 45 */ - "UNKNOWN", /* 46 */ - "UNKNOWN", /* 47 */ - "UNKNOWN", /* 48 */ - "UNKNOWN", /* 49 */ - "UNKNOWN", /* 4A */ - "UNKNOWN", /* 4B */ - "UNKNOWN", /* 4C */ - "UNKNOWN", /* 4D */ - "UNKNOWN", /* 4E */ - "UNKNOWN", /* 4F */ - "UNKNOWN", /* 50 */ - "UNKNOWN", /* 51 */ - "UNKNOWN", /* 52 */ - "UNKNOWN", /* 53 */ - "UNKNOWN", /* 54 */ - "UNKNOWN", /* 55 */ - "UNKNOWN", /* 56 */ - "UNKNOWN", /* 57 */ - "UNKNOWN", /* 58 */ - "UNKNOWN", /* 59 */ - "UNKNOWN", /* 5A */ - "UNKNOWN", /* 5B */ - "UNKNOWN", /* 5C */ - "UNKNOWN", /* 5D */ - "UNKNOWN", /* 5E */ - "UNKNOWN", /* 5F */ - "UNKNOWN", /* 60 */ - "UNKNOWN", /* 61 */ - "UNKNOWN", /* 62 */ - "UNKNOWN", /* 63 */ - "UNKNOWN", /* 64 */ - "UNKNOWN", /* 65 */ - "UNKNOWN", /* 66 */ - "UNKNOWN", /* 67 */ - "UNKNOWN", /* 68 */ - "UNKNOWN", /* 69 */ - "UNKNOWN", /* 6A */ - "UNKNOWN", /* 6B */ - "UNKNOWN", /* 6C */ - "UNKNOWN", /* 6D */ - "UNKNOWN", /* 6E */ - "UNKNOWN", /* 6F */ - "UNKNOWN", /* 70 */ - "UNKNOWN", /* 71 */ - "UNKNOWN", /* 72 */ - "UNKNOWN", /* 73 */ - "UNKNOWN", /* 74 */ - "UNKNOWN", /* 75 */ - "UNKNOWN", /* 76 */ - "UNKNOWN", /* 77 */ - "UNKNOWN", /* 78 */ - "UNKNOWN", /* 79 */ - "UNKNOWN", /* 7A */ - "UNKNOWN", /* 7B */ - "UNKNOWN", /* 7C */ - "UNKNOWN", /* 7D */ - "UNKNOWN", /* 7E */ - "UNKNOWN", /* 7F */ - "UNKNOWN", /* 80 */ - "UNKNOWN", /* 81 */ - "UNKNOWN", /* 82 */ - "UNKNOWN", /* 83 */ - "UNKNOWN", /* 84 */ - "UNKNOWN", /* 85 */ - "UNKNOWN", /* 86 */ - "UNKNOWN", /* 87 */ - "UNKNOWN", /* 88 */ - "UNKNOWN", /* 89 */ - "UNKNOWN", /* 8A */ - "UNKNOWN", /* 8B */ - "UNKNOWN", /* 8C */ - "UNKNOWN", /* 8D */ - "UNKNOWN", /* 8E */ - "UNKNOWN", /* 8F */ - "UNKNOWN", /* 90 */ - "UNKNOWN", /* 91 */ - "UNKNOWN", /* 92 */ - "UNKNOWN", /* 93 */ - "UNKNOWN", /* 94 */ - "UNKNOWN", /* 95 */ - "UNKNOWN", /* 96 */ - "UNKNOWN", /* 97 */ - "UNKNOWN", /* 98 */ - "UNKNOWN", /* 99 */ - "UNKNOWN", /* 9A */ - "UNKNOWN", /* 9B */ - "UNKNOWN", /* 9C */ - "UNKNOWN", /* 9D */ - "UNKNOWN", /* 9E */ - "UNKNOWN", /* 9F */ - "UNKNOWN", /* A0 */ - "UNKNOWN", /* A1 */ - "UNKNOWN", /* A2 */ - "UNKNOWN", /* A3 */ - "UNKNOWN", /* A4 */ - "UNKNOWN", /* A5 */ - "UNKNOWN", /* A6 */ - "UNKNOWN", /* A7 */ - "UNKNOWN", /* A8 */ - "UNKNOWN", /* A9 */ - "UNKNOWN", /* AA */ - "UNKNOWN", /* AB */ - "UNKNOWN", /* AC */ - "UNKNOWN", /* AD */ - "UNKNOWN", /* AE */ - "UNKNOWN", /* AF */ - "UNKNOWN", /* B0 */ - "UNKNOWN", /* B1 */ - "UNKNOWN", /* B2 */ - "UNKNOWN", /* B3 */ - "UNKNOWN", /* B4 */ - "UNKNOWN", /* B5 */ - "UNKNOWN", /* B6 */ - "UNKNOWN", /* B7 */ - "UNKNOWN", /* B8 */ - "UNKNOWN", /* B9 */ - "UNKNOWN", /* BA */ - "UNKNOWN", /* BB */ - "UNKNOWN", /* BC */ - "UNKNOWN", /* BD */ - "UNKNOWN", /* BE */ - "UNKNOWN", /* BF */ - "UNKNOWN", /* C0 */ - "UNKNOWN", /* C1 */ - "UNKNOWN", /* C2 */ - "UNKNOWN", /* C3 */ - "UNKNOWN", /* C4 */ - "UNKNOWN", /* C5 */ - "UNKNOWN", /* C6 */ - "UNKNOWN", /* C7 */ - "UNKNOWN", /* C8 */ - "UNKNOWN", /* C9 */ - "UNKNOWN", /* CA */ - "UNKNOWN", /* CB */ - "UNKNOWN", /* CC */ - "UNKNOWN", /* CD */ - "UNKNOWN", /* CE */ - "UNKNOWN", /* CF */ - "UNKNOWN", /* D0 */ - "UNKNOWN", /* D1 */ - "UNKNOWN", /* D2 */ - "UNKNOWN", /* D3 */ - "UNKNOWN", /* D4 */ - "UNKNOWN", /* D5 */ - "UNKNOWN", /* D6 */ - "UNKNOWN", /* D7 */ - "UNKNOWN", /* D8 */ - "UNKNOWN", /* D9 */ - "UNKNOWN", /* DA */ - "UNKNOWN", /* DB */ - "UNKNOWN", /* DC */ - "UNKNOWN", /* DD */ - "UNKNOWN", /* DE */ - "UNKNOWN", /* DF */ - "UNKNOWN", /* E0 */ - "UNKNOWN", /* E1 */ - "UNKNOWN", /* E2 */ - "UNKNOWN", /* E3 */ - "UNKNOWN", /* E4 */ - "UNKNOWN", /* E5 */ - "UNKNOWN", /* E6 */ - "UNKNOWN", /* E7 */ - "UNKNOWN", /* E8 */ - "UNKNOWN", /* E9 */ - "UNKNOWN", /* EA */ - "UNKNOWN", /* EB */ - "UNKNOWN", /* EC */ - "UNKNOWN", /* ED */ - "UNKNOWN", /* EE */ - "UNKNOWN", /* EF */ - "UNKNOWN", /* F0 */ - "UNKNOWN", /* F1 */ - "UNKNOWN", /* F2 */ - "InformInfoRecord", /* F3 */ - "UNKNOWN" /* F4 - always highest value */ -}; - -#define OSM_SA_ATTR_STR_UNKNOWN_VAL 0xF4 - -static int sprint_uint8_arr(char *buf, size_t size, - const uint8_t * arr, size_t len) -{ - unsigned int n, i; - for (i = 0, n = 0; i < len; i++) { - n += snprintf(buf + n, size - n, "%s%u", i == 0 ? "" : ",", - arr[i]); - if (n >= size) - break; - } - return n; -} - -const char *ib_get_sa_method_str(IN uint8_t method) -{ - if (method & 0x80) { - method = method & 0x7f; - if (method > OSM_SA_METHOD_STR_UNKNOWN_VAL) - method = OSM_SA_METHOD_STR_UNKNOWN_VAL; - /* it is a response - use the response table */ - return ib_sa_resp_method_str[method]; - } else { - if (method > OSM_SA_METHOD_STR_UNKNOWN_VAL) - method = OSM_SA_METHOD_STR_UNKNOWN_VAL; - return ib_sa_method_str[method]; - } -} - -const char *ib_get_sm_method_str(IN uint8_t method) -{ - if (method & 0x80) - method = (method & 0x0F) | 0x10; - if (method > OSM_SM_METHOD_STR_UNKNOWN_VAL) - method = OSM_SM_METHOD_STR_UNKNOWN_VAL; - return ib_sm_method_str[method]; -} - -const char *ib_get_sm_attr_str(IN ib_net16_t attr) -{ - uint16_t host_attr = cl_ntoh16(attr); - - if (host_attr > OSM_SM_ATTR_STR_UNKNOWN_VAL) - host_attr = OSM_SM_ATTR_STR_UNKNOWN_VAL; - - return ib_sm_attr_str[host_attr]; -} - -const char *ib_get_sa_attr_str(IN ib_net16_t attr) -{ - uint16_t host_attr = cl_ntoh16(attr); - - if (host_attr > OSM_SA_ATTR_STR_UNKNOWN_VAL) - host_attr = OSM_SA_ATTR_STR_UNKNOWN_VAL; - - return ib_sa_attr_str[host_attr]; -} - -const char *ib_get_trap_str(ib_net16_t trap_num) -{ - switch (cl_ntoh16(trap_num)) { - case 64: - return "GID in service"; - case 65: - return "GID out of service"; - case 66: - return "New mcast group created"; - case 67: - return "Mcast group deleted"; - case 68: - return "UnPath, Path no longer valid"; - case 69: - return "RePath, Path recomputed"; - case 128: - return "Link state change"; - case 129: - return "Local Link integrity threshold reached"; - case 130: - return "Excessive Buffer Overrun Threshold reached"; - case 131: - return "Flow Control Update watchdog timer expired"; - case 144: - return - "CapabilityMask, NodeDescription, Link [Width|Speed] Enabled, SM priority changed"; - case 145: - return "System Image GUID changed"; - case 256: - return "Bad M_Key"; - case 257: - return "Bad P_Key"; - case 258: - return "Bad Q_Key"; - case 259: - return "Bad P_Key (switch external port)"; - default: - break; - } - return "Unknown"; -} - -const ib_gid_t ib_zero_gid = { {0} }; - -static ib_api_status_t dbg_do_line(IN char **pp_local, IN uint32_t buf_size, - IN const char *p_prefix_str, - IN const char *p_new_str, - IN uint32_t * p_total_len) -{ - char line[LINE_LENGTH]; - uint32_t len; - - sprintf(line, "%s%s", p_prefix_str, p_new_str); - len = (uint32_t) strlen(line); - *p_total_len += len; - if (*p_total_len + sizeof('\0') > buf_size) - return IB_INSUFFICIENT_MEMORY; - - strcpy(*pp_local, line); - *pp_local += len; - return IB_SUCCESS; -} - -static void dbg_get_capabilities_str(IN char *p_buf, IN uint32_t buf_size, - IN const char *p_prefix_str, - IN const ib_port_info_t * p_pi) -{ - uint32_t total_len = 0; - char *p_local = p_buf; - - strcpy(p_local, "Capability Mask:\n"); - p_local += strlen(p_local); - - if (p_pi->capability_mask & IB_PORT_CAP_RESV0) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_RESV0\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_IS_SM) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_IS_SM\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_NOTICE) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_NOTICE\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_TRAP) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_TRAP\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_IPD) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_IPD\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_AUTO_MIG) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_AUTO_MIG\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_SL_MAP) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_SL_MAP\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_NV_MKEY) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_NV_MKEY\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_NV_PKEY) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_NV_PKEY\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_LED_INFO) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_LED_INFO\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_SM_DISAB) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_SM_DISAB\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_SYS_IMG_GUID) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_SYS_IMG_GUID\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_PKEY_SW_EXT_PORT_TRAP) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_PKEY_SW_EXT_PORT_TRAP\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_RESV13) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_RESV13\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_RESV14) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_RESV14\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_RESV15) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_RESV15\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_COM_MGT) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_COM_MGT\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_SNMP) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_SNMP\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_REINIT) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_REINIT\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_DEV_MGT) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_DEV_MGT\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_VEND_CLS) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_VEND_CLS\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_DR_NTC) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_DR_NTC\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_CAP_NTC) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_CAP_NTC\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_BM) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_BM\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_LINK_RT_LATENCY) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_LINK_RT_LATENCY\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_CLIENT_REREG) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_CLIENT_REREG\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_OTHER_LOCAL_CHANGES_NTC) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_OTHER_LOCAL_CHANGES_NTC\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_LINK_SPEED_WIDTH_PAIRS_TBL) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_LINK_SPEED_WIDTH_PAIRS_TBL\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_VEND_MADS) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_VEND_MADS\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_MCAST_PKEY_TRAP_SUPPRESS) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_MCAST_PKEY_TRAP_SUPPRESS\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_MCAST_FDB_TOP) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_MCAST_FDB_TOP\n", - &total_len) != IB_SUCCESS) - return; - } - if (p_pi->capability_mask & IB_PORT_CAP_HAS_HIER_INFO) { - if (dbg_do_line(&p_local, buf_size, p_prefix_str, - "IB_PORT_CAP_HAS_HIER_INFO\n", - &total_len) != IB_SUCCESS) - return; - } -} - -void osm_dump_port_info(IN osm_log_t * p_log, IN ib_net64_t node_guid, - IN ib_net64_t port_guid, IN uint8_t port_num, - IN const ib_port_info_t * p_pi, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char buf[BUF_SIZE]; - - osm_log(p_log, log_level, - "PortInfo dump:\n" - "\t\t\t\tport number.............%u\n" - "\t\t\t\tnode_guid...............0x%016" PRIx64 "\n" - "\t\t\t\tport_guid...............0x%016" PRIx64 "\n" - "\t\t\t\tm_key...................0x%016" PRIx64 "\n" - "\t\t\t\tsubnet_prefix...........0x%016" PRIx64 "\n" - "\t\t\t\tbase_lid................%u\n" - "\t\t\t\tmaster_sm_base_lid......%u\n" - "\t\t\t\tcapability_mask.........0x%X\n" - "\t\t\t\tdiag_code...............0x%X\n" - "\t\t\t\tm_key_lease_period......0x%X\n" - "\t\t\t\tlocal_port_num..........%u\n" - "\t\t\t\tlink_width_enabled......0x%X\n" - "\t\t\t\tlink_width_supported....0x%X\n" - "\t\t\t\tlink_width_active.......0x%X\n" - "\t\t\t\tlink_speed_supported....0x%X\n" - "\t\t\t\tport_state..............%s\n" - "\t\t\t\tstate_info2.............0x%X\n" - "\t\t\t\tm_key_protect_bits......0x%X\n" - "\t\t\t\tlmc.....................0x%X\n" - "\t\t\t\tlink_speed..............0x%X\n" - "\t\t\t\tmtu_smsl................0x%X\n" - "\t\t\t\tvl_cap_init_type........0x%X\n" - "\t\t\t\tvl_high_limit...........0x%X\n" - "\t\t\t\tvl_arb_high_cap.........0x%X\n" - "\t\t\t\tvl_arb_low_cap..........0x%X\n" - "\t\t\t\tinit_rep_mtu_cap........0x%X\n" - "\t\t\t\tvl_stall_life...........0x%X\n" - "\t\t\t\tvl_enforce..............0x%X\n" - "\t\t\t\tm_key_violations........0x%X\n" - "\t\t\t\tp_key_violations........0x%X\n" - "\t\t\t\tq_key_violations........0x%X\n" - "\t\t\t\tguid_cap................0x%X\n" - "\t\t\t\tclient_reregister.......0x%X\n" - "\t\t\t\tmcast_pkey_trap_suppr...0x%X\n" - "\t\t\t\tsubnet_timeout..........0x%X\n" - "\t\t\t\tresp_time_value.........0x%X\n" - "\t\t\t\terror_threshold.........0x%X\n" - "\t\t\t\tmax_credit_hint.........0x%X\n" - "\t\t\t\tlink_round_trip_latency.0x%X\n", - port_num, cl_ntoh64(node_guid), cl_ntoh64(port_guid), - cl_ntoh64(p_pi->m_key), cl_ntoh64(p_pi->subnet_prefix), - cl_ntoh16(p_pi->base_lid), - cl_ntoh16(p_pi->master_sm_base_lid), - cl_ntoh32(p_pi->capability_mask), - cl_ntoh16(p_pi->diag_code), - cl_ntoh16(p_pi->m_key_lease_period), - p_pi->local_port_num, p_pi->link_width_enabled, - p_pi->link_width_supported, p_pi->link_width_active, - ib_port_info_get_link_speed_sup(p_pi), - ib_get_port_state_str(ib_port_info_get_port_state - (p_pi)), p_pi->state_info2, - ib_port_info_get_mpb(p_pi), ib_port_info_get_lmc(p_pi), - p_pi->link_speed, p_pi->mtu_smsl, p_pi->vl_cap, - p_pi->vl_high_limit, p_pi->vl_arb_high_cap, - p_pi->vl_arb_low_cap, p_pi->mtu_cap, - p_pi->vl_stall_life, p_pi->vl_enforce, - cl_ntoh16(p_pi->m_key_violations), - cl_ntoh16(p_pi->p_key_violations), - cl_ntoh16(p_pi->q_key_violations), p_pi->guid_cap, - ib_port_info_get_client_rereg(p_pi), - ib_port_info_get_mcast_pkey_trap_suppress(p_pi), - ib_port_info_get_timeout(p_pi), p_pi->resp_time_value, - p_pi->error_threshold, cl_ntoh16(p_pi->max_credit_hint), - cl_ntoh32(p_pi->link_rt_latency)); - - /* show the capabilities mask */ - if (p_pi->capability_mask) { - dbg_get_capabilities_str(buf, BUF_SIZE, "\t\t\t\t", - p_pi); - osm_log(p_log, log_level, "%s", buf); - } - } -} - -void osm_dump_portinfo_record(IN osm_log_t * p_log, - IN const ib_portinfo_record_t * p_pir, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char buf[BUF_SIZE]; - const ib_port_info_t *p_pi = &p_pir->port_info; - - osm_log(p_log, log_level, - "PortInfo Record dump:\n" - "\t\t\t\tRID\n" - "\t\t\t\tEndPortLid..............%u\n" - "\t\t\t\tPortNum.................%u\n" - "\t\t\t\tReserved................0x%X\n" - "\t\t\t\tPortInfo dump:\n" - "\t\t\t\tm_key...................0x%016" PRIx64 "\n" - "\t\t\t\tsubnet_prefix...........0x%016" PRIx64 "\n" - "\t\t\t\tbase_lid................%u\n" - "\t\t\t\tmaster_sm_base_lid......%u\n" - "\t\t\t\tcapability_mask.........0x%X\n" - "\t\t\t\tdiag_code...............0x%X\n" - "\t\t\t\tm_key_lease_period......0x%X\n" - "\t\t\t\tlocal_port_num..........%u\n" - "\t\t\t\tlink_width_enabled......0x%X\n" - "\t\t\t\tlink_width_supported....0x%X\n" - "\t\t\t\tlink_width_active.......0x%X\n" - "\t\t\t\tlink_speed_supported....0x%X\n" - "\t\t\t\tport_state..............%s\n" - "\t\t\t\tstate_info2.............0x%X\n" - "\t\t\t\tm_key_protect_bits......0x%X\n" - "\t\t\t\tlmc.....................0x%X\n" - "\t\t\t\tlink_speed..............0x%X\n" - "\t\t\t\tmtu_smsl................0x%X\n" - "\t\t\t\tvl_cap_init_type........0x%X\n" - "\t\t\t\tvl_high_limit...........0x%X\n" - "\t\t\t\tvl_arb_high_cap.........0x%X\n" - "\t\t\t\tvl_arb_low_cap..........0x%X\n" - "\t\t\t\tinit_rep_mtu_cap........0x%X\n" - "\t\t\t\tvl_stall_life...........0x%X\n" - "\t\t\t\tvl_enforce..............0x%X\n" - "\t\t\t\tm_key_violations........0x%X\n" - "\t\t\t\tp_key_violations........0x%X\n" - "\t\t\t\tq_key_violations........0x%X\n" - "\t\t\t\tguid_cap................0x%X\n" - "\t\t\t\tsubnet_timeout..........0x%X\n" - "\t\t\t\tresp_time_value.........0x%X\n" - "\t\t\t\terror_threshold.........0x%X\n", - cl_ntoh16(p_pir->lid), p_pir->port_num, p_pir->resv, - cl_ntoh64(p_pi->m_key), cl_ntoh64(p_pi->subnet_prefix), - cl_ntoh16(p_pi->base_lid), - cl_ntoh16(p_pi->master_sm_base_lid), - cl_ntoh32(p_pi->capability_mask), - cl_ntoh16(p_pi->diag_code), - cl_ntoh16(p_pi->m_key_lease_period), - p_pi->local_port_num, p_pi->link_width_enabled, - p_pi->link_width_supported, p_pi->link_width_active, - ib_port_info_get_link_speed_sup(p_pi), - ib_get_port_state_str(ib_port_info_get_port_state - (p_pi)), p_pi->state_info2, - ib_port_info_get_mpb(p_pi), ib_port_info_get_lmc(p_pi), - p_pi->link_speed, p_pi->mtu_smsl, p_pi->vl_cap, - p_pi->vl_high_limit, p_pi->vl_arb_high_cap, - p_pi->vl_arb_low_cap, p_pi->mtu_cap, - p_pi->vl_stall_life, p_pi->vl_enforce, - cl_ntoh16(p_pi->m_key_violations), - cl_ntoh16(p_pi->p_key_violations), - cl_ntoh16(p_pi->q_key_violations), p_pi->guid_cap, - ib_port_info_get_timeout(p_pi), p_pi->resp_time_value, - p_pi->error_threshold); - - /* show the capabilities mask */ - if (p_pi->capability_mask) { - dbg_get_capabilities_str(buf, BUF_SIZE, "\t\t\t\t", - p_pi); - osm_log(p_log, log_level, "%s", buf); - } - } -} - -void osm_dump_guidinfo_record(IN osm_log_t * p_log, - IN const ib_guidinfo_record_t * p_gir, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - const ib_guid_info_t *p_gi = &p_gir->guid_info; - - osm_log(p_log, log_level, - "GUIDInfo Record dump:\n" - "\t\t\t\tRID\n" - "\t\t\t\tLid.....................%u\n" - "\t\t\t\tBlockNum................0x%X\n" - "\t\t\t\tReserved................0x%X\n" - "\t\t\t\tGUIDInfo dump:\n" - "\t\t\t\tReserved................0x%X\n" - "\t\t\t\tGUID 0..................0x%016" PRIx64 "\n" - "\t\t\t\tGUID 1..................0x%016" PRIx64 "\n" - "\t\t\t\tGUID 2..................0x%016" PRIx64 "\n" - "\t\t\t\tGUID 3..................0x%016" PRIx64 "\n" - "\t\t\t\tGUID 4..................0x%016" PRIx64 "\n" - "\t\t\t\tGUID 5..................0x%016" PRIx64 "\n" - "\t\t\t\tGUID 6..................0x%016" PRIx64 "\n" - "\t\t\t\tGUID 7..................0x%016" PRIx64 "\n", - cl_ntoh16(p_gir->lid), p_gir->block_num, p_gir->resv, - cl_ntoh32(p_gir->reserved), - cl_ntoh64(p_gi->guid[0]), cl_ntoh64(p_gi->guid[1]), - cl_ntoh64(p_gi->guid[2]), cl_ntoh64(p_gi->guid[3]), - cl_ntoh64(p_gi->guid[4]), cl_ntoh64(p_gi->guid[5]), - cl_ntoh64(p_gi->guid[6]), cl_ntoh64(p_gi->guid[7])); - } -} - -void osm_dump_node_info(IN osm_log_t * p_log, IN const ib_node_info_t * p_ni, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - osm_log(p_log, log_level, - "NodeInfo dump:\n" - "\t\t\t\tbase_version............0x%X\n" - "\t\t\t\tclass_version...........0x%X\n" - "\t\t\t\tnode_type...............%s\n" - "\t\t\t\tnum_ports...............%u\n" - "\t\t\t\tsys_guid................0x%016" PRIx64 "\n" - "\t\t\t\tnode_guid...............0x%016" PRIx64 "\n" - "\t\t\t\tport_guid...............0x%016" PRIx64 "\n" - "\t\t\t\tpartition_cap...........0x%X\n" - "\t\t\t\tdevice_id...............0x%X\n" - "\t\t\t\trevision................0x%X\n" - "\t\t\t\tport_num................%u\n" - "\t\t\t\tvendor_id...............0x%X\n", - p_ni->base_version, p_ni->class_version, - ib_get_node_type_str(p_ni->node_type), p_ni->num_ports, - cl_ntoh64(p_ni->sys_guid), cl_ntoh64(p_ni->node_guid), - cl_ntoh64(p_ni->port_guid), - cl_ntoh16(p_ni->partition_cap), - cl_ntoh16(p_ni->device_id), cl_ntoh32(p_ni->revision), - ib_node_info_get_local_port_num(p_ni), - cl_ntoh32(ib_node_info_get_vendor_id(p_ni))); - } -} - -void osm_dump_node_record(IN osm_log_t * p_log, - IN const ib_node_record_t * p_nr, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char desc[sizeof(p_nr->node_desc.description) + 1]; - const ib_node_info_t *p_ni = &p_nr->node_info; - - memcpy(desc, p_nr->node_desc.description, - sizeof(p_nr->node_desc.description)); - desc[sizeof(desc) - 1] = '\0'; - osm_log(p_log, log_level, - "Node Record dump:\n" - "\t\t\t\tRID\n" - "\t\t\t\tLid.....................%u\n" - "\t\t\t\tReserved................0x%X\n" - "\t\t\t\tNodeInfo dump:\n" - "\t\t\t\tbase_version............0x%X\n" - "\t\t\t\tclass_version...........0x%X\n" - "\t\t\t\tnode_type...............%s\n" - "\t\t\t\tnum_ports...............%u\n" - "\t\t\t\tsys_guid................0x%016" PRIx64 "\n" - "\t\t\t\tnode_guid...............0x%016" PRIx64 "\n" - "\t\t\t\tport_guid...............0x%016" PRIx64 "\n" - "\t\t\t\tpartition_cap...........0x%X\n" - "\t\t\t\tdevice_id...............0x%X\n" - "\t\t\t\trevision................0x%X\n" - "\t\t\t\tport_num................%u\n" - "\t\t\t\tvendor_id...............0x%X\n" - "\t\t\t\tNodeDescription\n" - "\t\t\t\t%s\n", - cl_ntoh16(p_nr->lid), cl_ntoh16(p_nr->resv), - p_ni->base_version, p_ni->class_version, - ib_get_node_type_str(p_ni->node_type), p_ni->num_ports, - cl_ntoh64(p_ni->sys_guid), cl_ntoh64(p_ni->node_guid), - cl_ntoh64(p_ni->port_guid), - cl_ntoh16(p_ni->partition_cap), - cl_ntoh16(p_ni->device_id), cl_ntoh32(p_ni->revision), - ib_node_info_get_local_port_num(p_ni), - cl_ntoh32(ib_node_info_get_vendor_id(p_ni)), desc); - } -} - -void osm_dump_path_record(IN osm_log_t * p_log, IN const ib_path_rec_t * p_pr, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char gid_str[INET6_ADDRSTRLEN]; - char gid_str2[INET6_ADDRSTRLEN]; -#ifdef __WIN__ - uint8_t *p_resv = (uint8_t*) &p_pr->resv1; -#endif - osm_log(p_log, log_level, - "PathRecord dump:\n" - "\t\t\t\tservice_id..............0x%016" PRIx64 "\n" - "\t\t\t\tdgid....................%s\n" - "\t\t\t\tsgid....................%s\n" - "\t\t\t\tdlid....................%u\n" - "\t\t\t\tslid....................%u\n" - "\t\t\t\thop_flow_raw............0x%X\n" - "\t\t\t\ttclass..................0x%X\n" - "\t\t\t\tnum_path_revers.........0x%X\n" - "\t\t\t\tpkey....................0x%X\n" - "\t\t\t\tqos_class...............0x%X\n" - "\t\t\t\tsl......................0x%X\n" - "\t\t\t\tmtu.....................0x%X\n" - "\t\t\t\trate....................0x%X\n" - "\t\t\t\tpkt_life................0x%X\n" - "\t\t\t\tpreference..............0x%X\n" - "\t\t\t\tresv2...................0x%02X%02X%02X%02X%02X%02X\n", - cl_ntoh64(p_pr->service_id), - inet_ntop(AF_INET6, p_pr->dgid.raw, gid_str, - sizeof gid_str), - inet_ntop(AF_INET6, p_pr->sgid.raw, gid_str2, - sizeof gid_str2), - cl_ntoh16(p_pr->dlid), cl_ntoh16(p_pr->slid), - cl_ntoh32(p_pr->hop_flow_raw), p_pr->tclass, - p_pr->num_path, cl_ntoh16(p_pr->pkey), - ib_path_rec_qos_class(p_pr), ib_path_rec_sl(p_pr), - p_pr->mtu, p_pr->rate, p_pr->pkt_life, p_pr->preference, -#ifdef __WIN__ - p_resv[0], p_resv[1], p_resv[2], - p_resv[3], p_resv[4], p_resv[5]); -#else - p_pr->resv2[0], p_pr->resv2[1], p_pr->resv2[2], - p_pr->resv2[3], p_pr->resv2[4], p_pr->resv2[5]); -#endif - } -} - -void osm_dump_multipath_record(IN osm_log_t * p_log, - IN const ib_multipath_rec_t * p_mpr, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char gid_str[INET6_ADDRSTRLEN]; - char buf_line[1024]; - ib_gid_t const *p_gid = p_mpr->gids; - int i, n = 0; - - if (p_mpr->sgid_count) { - for (i = 0; i < p_mpr->sgid_count; i++) { - n += sprintf(buf_line + n, - "\t\t\t\tsgid%02d.................." - "%s\n", i + 1, - inet_ntop(AF_INET6, p_gid->raw, - gid_str, - sizeof gid_str)); - p_gid++; - } - } - if (p_mpr->dgid_count) { - for (i = 0; i < p_mpr->dgid_count; i++) { - n += sprintf(buf_line + n, - "\t\t\t\tdgid%02d.................." - "%s\n", i + 1, - inet_ntop(AF_INET6, p_gid->raw, - gid_str, - sizeof gid_str)); - p_gid++; - } - } - osm_log(p_log, log_level, - "MultiPath Record dump:\n" - "\t\t\t\thop_flow_raw............0x%X\n" - "\t\t\t\ttclass..................0x%X\n" - "\t\t\t\tnum_path_revers.........0x%X\n" - "\t\t\t\tpkey....................0x%X\n" - "\t\t\t\tqos_class...............0x%X\n" - "\t\t\t\tsl......................0x%X\n" - "\t\t\t\tmtu.....................0x%X\n" - "\t\t\t\trate....................0x%X\n" - "\t\t\t\tpkt_life................0x%X\n" - "\t\t\t\tindependence............0x%X\n" - "\t\t\t\tsgid_count..............0x%X\n" - "\t\t\t\tdgid_count..............0x%X\n" - "\t\t\t\tservice_id..............0x%016" PRIx64 "\n" - "%s\n", - cl_ntoh32(p_mpr->hop_flow_raw), p_mpr->tclass, - p_mpr->num_path, cl_ntoh16(p_mpr->pkey), - ib_multipath_rec_qos_class(p_mpr), - ib_multipath_rec_sl(p_mpr), p_mpr->mtu, p_mpr->rate, - p_mpr->pkt_life, p_mpr->independence, - p_mpr->sgid_count, p_mpr->dgid_count, - cl_ntoh64(ib_multipath_rec_service_id(p_mpr)), - buf_line); - } -} - -void osm_dump_mc_record(IN osm_log_t * p_log, IN const ib_member_rec_t * p_mcmr, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char gid_str[INET6_ADDRSTRLEN]; - char gid_str2[INET6_ADDRSTRLEN]; - osm_log(p_log, log_level, - "MCMember Record dump:\n" - "\t\t\t\tMGID....................%s\n" - "\t\t\t\tPortGid.................%s\n" - "\t\t\t\tqkey....................0x%X\n" - "\t\t\t\tmlid....................0x%X\n" - "\t\t\t\tmtu.....................0x%X\n" - "\t\t\t\tTClass..................0x%X\n" - "\t\t\t\tpkey....................0x%X\n" - "\t\t\t\trate....................0x%X\n" - "\t\t\t\tpkt_life................0x%X\n" - "\t\t\t\tSLFlowLabelHopLimit.....0x%X\n" - "\t\t\t\tScopeState..............0x%X\n" - "\t\t\t\tProxyJoin...............0x%X\n", - inet_ntop(AF_INET6, p_mcmr->mgid.raw, gid_str, - sizeof gid_str), - inet_ntop(AF_INET6, p_mcmr->port_gid.raw, gid_str2, - sizeof gid_str2), - cl_ntoh32(p_mcmr->qkey), cl_ntoh16(p_mcmr->mlid), - p_mcmr->mtu, p_mcmr->tclass, cl_ntoh16(p_mcmr->pkey), - p_mcmr->rate, p_mcmr->pkt_life, - cl_ntoh32(p_mcmr->sl_flow_hop), - p_mcmr->scope_state, p_mcmr->proxy_join); - } -} - -void osm_dump_service_record(IN osm_log_t * p_log, - IN const ib_service_record_t * p_sr, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char gid_str[INET6_ADDRSTRLEN]; - char buf_service_key[35]; - char buf_service_name[65]; - - sprintf(buf_service_key, - "0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - p_sr->service_key[0], p_sr->service_key[1], - p_sr->service_key[2], p_sr->service_key[3], - p_sr->service_key[4], p_sr->service_key[5], - p_sr->service_key[6], p_sr->service_key[7], - p_sr->service_key[8], p_sr->service_key[9], - p_sr->service_key[10], p_sr->service_key[11], - p_sr->service_key[12], p_sr->service_key[13], - p_sr->service_key[14], p_sr->service_key[15]); - strncpy(buf_service_name, (char *)p_sr->service_name, 64); - buf_service_name[64] = '\0'; - - osm_log(p_log, log_level, - "Service Record dump:\n" - "\t\t\t\tServiceID...............0x%016" PRIx64 "\n" - "\t\t\t\tServiceGID..............%s\n" - "\t\t\t\tServiceP_Key............0x%X\n" - "\t\t\t\tServiceLease............0x%X\n" - "\t\t\t\tServiceKey..............%s\n" - "\t\t\t\tServiceName.............%s\n" - "\t\t\t\tServiceData8.1..........0x%X\n" - "\t\t\t\tServiceData8.2..........0x%X\n" - "\t\t\t\tServiceData8.3..........0x%X\n" - "\t\t\t\tServiceData8.4..........0x%X\n" - "\t\t\t\tServiceData8.5..........0x%X\n" - "\t\t\t\tServiceData8.6..........0x%X\n" - "\t\t\t\tServiceData8.7..........0x%X\n" - "\t\t\t\tServiceData8.8..........0x%X\n" - "\t\t\t\tServiceData8.9..........0x%X\n" - "\t\t\t\tServiceData8.10.........0x%X\n" - "\t\t\t\tServiceData8.11.........0x%X\n" - "\t\t\t\tServiceData8.12.........0x%X\n" - "\t\t\t\tServiceData8.13.........0x%X\n" - "\t\t\t\tServiceData8.14.........0x%X\n" - "\t\t\t\tServiceData8.15.........0x%X\n" - "\t\t\t\tServiceData8.16.........0x%X\n" - "\t\t\t\tServiceData16.1.........0x%X\n" - "\t\t\t\tServiceData16.2.........0x%X\n" - "\t\t\t\tServiceData16.3.........0x%X\n" - "\t\t\t\tServiceData16.4.........0x%X\n" - "\t\t\t\tServiceData16.5.........0x%X\n" - "\t\t\t\tServiceData16.6.........0x%X\n" - "\t\t\t\tServiceData16.7.........0x%X\n" - "\t\t\t\tServiceData16.8.........0x%X\n" - "\t\t\t\tServiceData32.1.........0x%X\n" - "\t\t\t\tServiceData32.2.........0x%X\n" - "\t\t\t\tServiceData32.3.........0x%X\n" - "\t\t\t\tServiceData32.4.........0x%X\n" - "\t\t\t\tServiceData64.1.........0x%016" PRIx64 "\n" - "\t\t\t\tServiceData64.2.........0x%016" PRIx64 "\n", - cl_ntoh64(p_sr->service_id), - inet_ntop(AF_INET6, p_sr->service_gid.raw, gid_str, - sizeof gid_str), - cl_ntoh16(p_sr->service_pkey), - cl_ntoh32(p_sr->service_lease), - buf_service_key, buf_service_name, - p_sr->service_data8[0], p_sr->service_data8[1], - p_sr->service_data8[2], p_sr->service_data8[3], - p_sr->service_data8[4], p_sr->service_data8[5], - p_sr->service_data8[6], p_sr->service_data8[7], - p_sr->service_data8[8], p_sr->service_data8[9], - p_sr->service_data8[10], p_sr->service_data8[11], - p_sr->service_data8[12], p_sr->service_data8[13], - p_sr->service_data8[14], p_sr->service_data8[15], - cl_ntoh16(p_sr->service_data16[0]), - cl_ntoh16(p_sr->service_data16[1]), - cl_ntoh16(p_sr->service_data16[2]), - cl_ntoh16(p_sr->service_data16[3]), - cl_ntoh16(p_sr->service_data16[4]), - cl_ntoh16(p_sr->service_data16[5]), - cl_ntoh16(p_sr->service_data16[6]), - cl_ntoh16(p_sr->service_data16[7]), - cl_ntoh32(p_sr->service_data32[0]), - cl_ntoh32(p_sr->service_data32[1]), - cl_ntoh32(p_sr->service_data32[2]), - cl_ntoh32(p_sr->service_data32[3]), - cl_ntoh64(p_sr->service_data64[0]), - cl_ntoh64(p_sr->service_data64[1])); - } -} - -void osm_dump_inform_info(IN osm_log_t * p_log, - IN const ib_inform_info_t * p_ii, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - uint32_t qpn; - uint8_t resp_time_val; - char gid_str[INET6_ADDRSTRLEN]; - ib_inform_info_get_qpn_resp_time(p_ii->g_or_v.generic. - qpn_resp_time_val, &qpn, - &resp_time_val); - if (p_ii->is_generic) { - osm_log(p_log, log_level, - "InformInfo dump:\n" - "\t\t\t\tgid.....................%s\n" - "\t\t\t\tlid_range_begin.........%u\n" - "\t\t\t\tlid_range_end...........%u\n" - "\t\t\t\tis_generic..............0x%X\n" - "\t\t\t\tsubscribe...............0x%X\n" - "\t\t\t\ttrap_type...............0x%X\n" - "\t\t\t\ttrap_num................%u\n" - "\t\t\t\tqpn.....................0x%06X\n" - "\t\t\t\tresp_time_val...........0x%X\n" - "\t\t\t\tnode_type...............0x%06X\n" "", - inet_ntop(AF_INET6, p_ii->gid.raw, gid_str, - sizeof gid_str), - cl_ntoh16(p_ii->lid_range_begin), - cl_ntoh16(p_ii->lid_range_end), - p_ii->is_generic, p_ii->subscribe, - cl_ntoh16(p_ii->trap_type), - cl_ntoh16(p_ii->g_or_v.generic.trap_num), - cl_ntoh32(qpn), resp_time_val, - cl_ntoh32(ib_inform_info_get_prod_type(p_ii))); - } else { - osm_log(p_log, log_level, - "InformInfo dump:\n" - "\t\t\t\tgid.....................%s\n" - "\t\t\t\tlid_range_begin.........%u\n" - "\t\t\t\tlid_range_end...........%u\n" - "\t\t\t\tis_generic..............0x%X\n" - "\t\t\t\tsubscribe...............0x%X\n" - "\t\t\t\ttrap_type...............0x%X\n" - "\t\t\t\tdev_id..................0x%X\n" - "\t\t\t\tqpn.....................0x%06X\n" - "\t\t\t\tresp_time_val...........0x%X\n" - "\t\t\t\tvendor_id...............0x%06X\n" "", - inet_ntop(AF_INET6, p_ii->gid.raw, gid_str, - sizeof gid_str), - cl_ntoh16(p_ii->lid_range_begin), - cl_ntoh16(p_ii->lid_range_end), - p_ii->is_generic, p_ii->subscribe, - cl_ntoh16(p_ii->trap_type), - cl_ntoh16(p_ii->g_or_v.vend.dev_id), - cl_ntoh32(qpn), resp_time_val, - cl_ntoh32(ib_inform_info_get_prod_type(p_ii))); - } - } -} - -void osm_dump_inform_info_record(IN osm_log_t * p_log, - IN const ib_inform_info_record_t * p_iir, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char gid_str[INET6_ADDRSTRLEN]; - char gid_str2[INET6_ADDRSTRLEN]; - uint32_t qpn; - uint8_t resp_time_val; - - ib_inform_info_get_qpn_resp_time(p_iir->inform_info.g_or_v. - generic.qpn_resp_time_val, - &qpn, &resp_time_val); - if (p_iir->inform_info.is_generic) { - osm_log(p_log, log_level, - "InformInfo Record dump:\n" - "\t\t\t\tRID\n" - "\t\t\t\tSubscriberGID...........%s\n" - "\t\t\t\tSubscriberEnum..........0x%X\n" - "\t\t\t\tInformInfo dump:\n" - "\t\t\t\tgid.....................%s\n" - "\t\t\t\tlid_range_begin.........%u\n" - "\t\t\t\tlid_range_end...........%u\n" - "\t\t\t\tis_generic..............0x%X\n" - "\t\t\t\tsubscribe...............0x%X\n" - "\t\t\t\ttrap_type...............0x%X\n" - "\t\t\t\ttrap_num................%u\n" - "\t\t\t\tqpn.....................0x%06X\n" - "\t\t\t\tresp_time_val...........0x%X\n" - "\t\t\t\tnode_type...............0x%06X\n" "", - inet_ntop(AF_INET6, p_iir->subscriber_gid.raw, - gid_str, sizeof gid_str), - cl_ntoh16(p_iir->subscriber_enum), - inet_ntop(AF_INET6, p_iir->inform_info.gid.raw, - gid_str2, sizeof gid_str2), - cl_ntoh16(p_iir->inform_info.lid_range_begin), - cl_ntoh16(p_iir->inform_info.lid_range_end), - p_iir->inform_info.is_generic, - p_iir->inform_info.subscribe, - cl_ntoh16(p_iir->inform_info.trap_type), - cl_ntoh16(p_iir->inform_info.g_or_v.generic. - trap_num), cl_ntoh32(qpn), - resp_time_val, - cl_ntoh32(ib_inform_info_get_prod_type - (&p_iir->inform_info))); - } else { - osm_log(p_log, log_level, - "InformInfo Record dump:\n" - "\t\t\t\tRID\n" - "\t\t\t\tSubscriberGID...........%s\n" - "\t\t\t\tSubscriberEnum..........0x%X\n" - "\t\t\t\tInformInfo dump:\n" - "\t\t\t\tgid.....................%s\n" - "\t\t\t\tlid_range_begin.........%u\n" - "\t\t\t\tlid_range_end...........%u\n" - "\t\t\t\tis_generic..............0x%X\n" - "\t\t\t\tsubscribe...............0x%X\n" - "\t\t\t\ttrap_type...............0x%X\n" - "\t\t\t\tdev_id..................0x%X\n" - "\t\t\t\tqpn.....................0x%06X\n" - "\t\t\t\tresp_time_val...........0x%X\n" - "\t\t\t\tvendor_id...............0x%06X\n" "", - inet_ntop(AF_INET6, p_iir->subscriber_gid.raw, - gid_str, sizeof gid_str), - cl_ntoh16(p_iir->subscriber_enum), - inet_ntop(AF_INET6, p_iir->inform_info.gid.raw, - gid_str2, sizeof gid_str2), - cl_ntoh16(p_iir->inform_info.lid_range_begin), - cl_ntoh16(p_iir->inform_info.lid_range_end), - p_iir->inform_info.is_generic, - p_iir->inform_info.subscribe, - cl_ntoh16(p_iir->inform_info.trap_type), - cl_ntoh16(p_iir->inform_info.g_or_v.vend. - dev_id), cl_ntoh32(qpn), - resp_time_val, - cl_ntoh32(ib_inform_info_get_prod_type - (&p_iir->inform_info))); - } - } -} - -void osm_dump_link_record(IN osm_log_t * p_log, - IN const ib_link_record_t * p_lr, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - osm_log(p_log, log_level, - "Link Record dump:\n" - "\t\t\t\tfrom_lid................%u\n" - "\t\t\t\tfrom_port_num...........%u\n" - "\t\t\t\tto_port_num.............%u\n" - "\t\t\t\tto_lid..................%u\n", - cl_ntoh16(p_lr->from_lid), - p_lr->from_port_num, - p_lr->to_port_num, cl_ntoh16(p_lr->to_lid)); - } -} - -void osm_dump_switch_info(IN osm_log_t * p_log, - IN const ib_switch_info_t * p_si, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - osm_log(p_log, OSM_LOG_VERBOSE, - "SwitchInfo dump:\n" - "\t\t\t\tlin_cap.................0x%X\n" - "\t\t\t\trand_cap................0x%X\n" - "\t\t\t\tmcast_cap...............0x%X\n" - "\t\t\t\tlin_top.................0x%X\n" - "\t\t\t\tdef_port................%u\n" - "\t\t\t\tdef_mcast_pri_port......%u\n" - "\t\t\t\tdef_mcast_not_port......%u\n" - "\t\t\t\tlife_state..............0x%X\n" - "\t\t\t\tlids_per_port...........%u\n" - "\t\t\t\tpartition_enf_cap.......0x%X\n" - "\t\t\t\tflags...................0x%X\n" - "\t\t\t\tmcast_top...............0x%X\n", - cl_ntoh16(p_si->lin_cap), cl_ntoh16(p_si->rand_cap), - cl_ntoh16(p_si->mcast_cap), cl_ntoh16(p_si->lin_top), - p_si->def_port, p_si->def_mcast_pri_port, - p_si->def_mcast_not_port, p_si->life_state, - cl_ntoh16(p_si->lids_per_port), - cl_ntoh16(p_si->enforce_cap), p_si->flags, - cl_ntoh16(p_si->mcast_top)); - } -} - -void osm_dump_switch_info_record(IN osm_log_t * p_log, - IN const ib_switch_info_record_t * p_sir, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - osm_log(p_log, log_level, - "SwitchInfo Record dump:\n" - "\t\t\t\tRID\n" - "\t\t\t\tlid.....................%u\n" - "\t\t\t\tSwitchInfo dump:\n" - "\t\t\t\tlin_cap.................0x%X\n" - "\t\t\t\trand_cap................0x%X\n" - "\t\t\t\tmcast_cap...............0x%X\n" - "\t\t\t\tlin_top.................0x%X\n" - "\t\t\t\tdef_port................%u\n" - "\t\t\t\tdef_mcast_pri_port......%u\n" - "\t\t\t\tdef_mcast_not_port......%u\n" - "\t\t\t\tlife_state..............0x%X\n" - "\t\t\t\tlids_per_port...........%u\n" - "\t\t\t\tpartition_enf_cap.......0x%X\n" - "\t\t\t\tflags...................0x%X\n", - cl_ntoh16(p_sir->lid), - cl_ntoh16(p_sir->switch_info.lin_cap), - cl_ntoh16(p_sir->switch_info.rand_cap), - cl_ntoh16(p_sir->switch_info.mcast_cap), - cl_ntoh16(p_sir->switch_info.lin_top), - p_sir->switch_info.def_port, - p_sir->switch_info.def_mcast_pri_port, - p_sir->switch_info.def_mcast_not_port, - p_sir->switch_info.life_state, - cl_ntoh16(p_sir->switch_info.lids_per_port), - cl_ntoh16(p_sir->switch_info.enforce_cap), - p_sir->switch_info.flags); - } -} - -void osm_dump_pkey_block(IN osm_log_t * p_log, IN uint64_t port_guid, - IN uint16_t block_num, IN uint8_t port_num, - IN const ib_pkey_table_t * p_pkey_tbl, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char buf_line[1024]; - int i, n; - - for (i = 0, n = 0; i < 32; i++) - n += sprintf(buf_line + n, " 0x%04x |", - cl_ntoh16(p_pkey_tbl->pkey_entry[i])); - - osm_log(p_log, log_level, - "P_Key table dump:\n" - "\t\t\tport_guid...........0x%016" PRIx64 "\n" - "\t\t\tblock_num...........0x%X\n" - "\t\t\tport_num............%u\n\tP_Key Table: %s\n", - cl_ntoh64(port_guid), block_num, port_num, buf_line); - } -} - -void osm_dump_slvl_map_table(IN osm_log_t * p_log, IN uint64_t port_guid, - IN uint8_t in_port_num, IN uint8_t out_port_num, - IN const ib_slvl_table_t * p_slvl_tbl, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char buf_line1[1024], buf_line2[1024]; - int n; - uint8_t i; - - for (i = 0, n = 0; i < 16; i++) - n += sprintf(buf_line1 + n, " %-2u |", i); - for (i = 0, n = 0; i < 16; i++) - n += sprintf(buf_line2 + n, "0x%01X |", - ib_slvl_table_get(p_slvl_tbl, i)); - osm_log(p_log, log_level, - "SLtoVL dump:\n" - "\t\t\tport_guid............0x%016" PRIx64 "\n" - "\t\t\tin_port_num..........%u\n" - "\t\t\tout_port_num.........%u\n\tSL: | %s\n\tVL: | %s\n", - cl_ntoh64(port_guid), in_port_num, out_port_num, - buf_line1, buf_line2); - } -} - -void osm_dump_vl_arb_table(IN osm_log_t * p_log, IN uint64_t port_guid, - IN uint8_t block_num, IN uint8_t port_num, - IN const ib_vl_arb_table_t * p_vla_tbl, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char buf_line1[1024], buf_line2[1024]; - int i, n; - - for (i = 0, n = 0; i < 32; i++) - n += sprintf(buf_line1 + n, " 0x%01X |", - p_vla_tbl->vl_entry[i].vl); - for (i = 0, n = 0; i < 32; i++) - n += sprintf(buf_line2 + n, " 0x%01X |", - p_vla_tbl->vl_entry[i].weight); - osm_log(p_log, log_level, - "VLArb dump:\n" "\t\t\tport_guid...........0x%016" - PRIx64 "\n" "\t\t\tblock_num...........0x%X\n" - "\t\t\tport_num............%u\n\tVL : | %s\n\tWEIGHT:| %s\n", - cl_ntoh64(port_guid), block_num, port_num, buf_line1, - buf_line2); - } -} - -void osm_dump_sm_info(IN osm_log_t * p_log, IN const ib_sm_info_t * p_smi, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - osm_log(p_log, OSM_LOG_DEBUG, - "SMInfo dump:\n" - "\t\t\t\tguid....................0x%016" PRIx64 "\n" - "\t\t\t\tsm_key..................0x%016" PRIx64 "\n" - "\t\t\t\tact_count...............%u\n" - "\t\t\t\tpriority................%u\n" - "\t\t\t\tsm_state................%u\n", - cl_ntoh64(p_smi->guid), cl_ntoh64(p_smi->sm_key), - cl_ntoh32(p_smi->act_count), - ib_sminfo_get_priority(p_smi), - ib_sminfo_get_state(p_smi)); - } -} - -void osm_dump_sm_info_record(IN osm_log_t * p_log, - IN const ib_sminfo_record_t * p_smir, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - osm_log(p_log, OSM_LOG_DEBUG, - "SMInfo Record dump:\n" - "\t\t\t\tRID\n" - "\t\t\t\tLid.....................%u\n" - "\t\t\t\tReserved................0x%X\n" - "\t\t\t\tSMInfo dump:\n" - "\t\t\t\tguid....................0x%016" PRIx64 "\n" - "\t\t\t\tsm_key..................0x%016" PRIx64 "\n" - "\t\t\t\tact_count...............%u\n" - "\t\t\t\tpriority................%u\n" - "\t\t\t\tsm_state................%u\n", - cl_ntoh16(p_smir->lid), cl_ntoh16(p_smir->resv0), - cl_ntoh64(p_smir->sm_info.guid), - cl_ntoh64(p_smir->sm_info.sm_key), - cl_ntoh32(p_smir->sm_info.act_count), - ib_sminfo_get_priority(&p_smir->sm_info), - ib_sminfo_get_state(&p_smir->sm_info)); - } -} - -void osm_dump_notice(IN osm_log_t * p_log, - IN const ib_mad_notice_attr_t * p_ntci, - IN osm_log_level_t log_level) -{ - if (!osm_log_is_active(p_log, log_level)) - return; - - if (ib_notice_is_generic(p_ntci)) { - char gid_str[INET6_ADDRSTRLEN]; - char gid_str2[INET6_ADDRSTRLEN]; - char buff[1024]; - int n; - buff[0] = '\0'; - - /* immediate data based on the trap */ - switch (cl_ntoh16(p_ntci->g_or_v.generic.trap_num)) { - case 64: - case 65: - case 66: - case 67: - sprintf(buff, - "\t\t\t\tsrc_gid..................%s\n", - inet_ntop(AF_INET6, p_ntci->data_details. - ntc_64_67.gid.raw, gid_str, - sizeof gid_str)); - break; - case 128: - sprintf(buff, - "\t\t\t\tsw_lid...................%u\n", - cl_ntoh16(p_ntci->data_details.ntc_128.sw_lid)); - break; - case 129: - case 130: - case 131: - sprintf(buff, - "\t\t\t\tlid......................%u\n" - "\t\t\t\tport_num.................%u\n", - cl_ntoh16(p_ntci->data_details. - ntc_129_131.lid), - p_ntci->data_details.ntc_129_131.port_num); - break; - case 144: - sprintf(buff, - "\t\t\t\tlid......................%u\n" - "\t\t\t\tlocal_changes............%u\n" - "\t\t\t\tnew_cap_mask.............0x%08x\n" - "\t\t\t\tchange_flags.............0x%x\n", - cl_ntoh16(p_ntci->data_details.ntc_144.lid), - p_ntci->data_details.ntc_144.local_changes, - cl_ntoh32(p_ntci->data_details.ntc_144. - new_cap_mask), - cl_ntoh16(p_ntci->data_details.ntc_144. - change_flgs)); - break; - case 145: - sprintf(buff, - "\t\t\t\tlid......................%u\n" - "\t\t\t\tnew_sys_guid.............0x%016" - PRIx64 "\n", - cl_ntoh16(p_ntci->data_details.ntc_145. - lid), - cl_ntoh64(p_ntci->data_details.ntc_145. - new_sys_guid)); - break; - case 256: - n = sprintf(buff, - "\t\t\t\tlid......................%u\n" - "\t\t\t\tdrslid...................%u\n" - "\t\t\t\tmethod...................0x%x\n" - "\t\t\t\tattr_id..................0x%x\n" - "\t\t\t\tattr_mod.................0x%x\n" - "\t\t\t\tm_key....................0x%016" - PRIx64 "\n" - "\t\t\t\tdr_notice................%d\n" - "\t\t\t\tdr_path_truncated........%d\n" - "\t\t\t\tdr_hop_count.............%u\n", - cl_ntoh16(p_ntci->data_details.ntc_256.lid), - cl_ntoh16(p_ntci->data_details.ntc_256. - dr_slid), - p_ntci->data_details.ntc_256.method, - cl_ntoh16(p_ntci->data_details.ntc_256. - attr_id), - cl_ntoh32(p_ntci->data_details.ntc_256. - attr_mod), - cl_ntoh64(p_ntci->data_details.ntc_256. - mkey), - p_ntci->data_details.ntc_256. - dr_trunc_hop >> 7, - p_ntci->data_details.ntc_256. - dr_trunc_hop >> 6, - p_ntci->data_details.ntc_256. - dr_trunc_hop & 0x3f); - n += snprintf(buff + n, sizeof(buff) - n, - "Directed Path Dump of %u hop path:" - "\n\t\t\t\tPath = ", - p_ntci->data_details.ntc_256. - dr_trunc_hop & 0x3f); - n += sprint_uint8_arr(buff + n, sizeof(buff) - n, - p_ntci->data_details.ntc_256. - dr_rtn_path, - (p_ntci->data_details.ntc_256. - dr_trunc_hop & 0x3f) + 1); - if (n >= sizeof(buff)) { - n = sizeof(buff) - 2; - break; - } - snprintf(buff + n, sizeof(buff) - n, "\n"); - break; - case 257: - case 258: - sprintf(buff, - "\t\t\t\tlid1.....................%u\n" - "\t\t\t\tlid2.....................%u\n" - "\t\t\t\tkey......................0x%x\n" - "\t\t\t\tsl.......................%d\n" - "\t\t\t\tqp1......................0x%x\n" - "\t\t\t\tqp2......................0x%x\n" - "\t\t\t\tgid1.....................%s\n" - "\t\t\t\tgid2.....................%s\n", - cl_ntoh16(p_ntci->data_details.ntc_257_258. - lid1), - cl_ntoh16(p_ntci->data_details.ntc_257_258. - lid2), - cl_ntoh32(p_ntci->data_details.ntc_257_258.key), - cl_ntoh32(p_ntci->data_details.ntc_257_258. - qp1) >> 28, - cl_ntoh32(p_ntci->data_details.ntc_257_258. - qp1) & 0xffffff, - cl_ntoh32(p_ntci->data_details.ntc_257_258. - qp2) & 0xffffff, - inet_ntop(AF_INET6, p_ntci->data_details. - ntc_257_258.gid1.raw, gid_str, - sizeof gid_str), - inet_ntop(AF_INET6, p_ntci->data_details. - ntc_257_258.gid2.raw, gid_str2, - sizeof gid_str2)); - break; - case 259: - sprintf(buff, - "\t\t\t\tdata_valid...............0x%x\n" - "\t\t\t\tlid1.....................%u\n" - "\t\t\t\tlid2.....................%u\n" - "\t\t\t\tpkey.....................0x%x\n" - "\t\t\t\tsl.......................%d\n" - "\t\t\t\tqp1......................0x%x\n" - "\t\t\t\tqp2......................0x%x\n" - "\t\t\t\tgid1.....................%s\n" - "\t\t\t\tgid2.....................%s\n" - "\t\t\t\tsw_lid...................%u\n" - "\t\t\t\tport_no..................%u\n", - cl_ntoh16(p_ntci->data_details.ntc_259. - data_valid), - cl_ntoh16(p_ntci->data_details.ntc_259.lid1), - cl_ntoh16(p_ntci->data_details.ntc_259.lid2), - cl_ntoh16(p_ntci->data_details.ntc_259.pkey), - cl_ntoh32(p_ntci->data_details.ntc_259. - sl_qp1) >> 24, - cl_ntoh32(p_ntci->data_details.ntc_259. - sl_qp1) & 0xffffff, - cl_ntoh32(p_ntci->data_details.ntc_259.qp2), - inet_ntop(AF_INET6, p_ntci->data_details. - ntc_259.gid1.raw, gid_str, - sizeof gid_str), - inet_ntop(AF_INET6, p_ntci->data_details. - ntc_259.gid2.raw, gid_str2, - sizeof gid_str2), - cl_ntoh16(p_ntci->data_details.ntc_259.sw_lid), - p_ntci->data_details.ntc_259.port_no); - break; - } - - osm_log(p_log, log_level, - "Generic Notice dump:\n" - "\t\t\t\ttype.....................%u\n" - "\t\t\t\tprod_type................%u (%s)\n" - "\t\t\t\ttrap_num.................%u\n%s", - ib_notice_get_type(p_ntci), - cl_ntoh32(ib_notice_get_prod_type(p_ntci)), - ib_get_producer_type_str(ib_notice_get_prod_type - (p_ntci)), - cl_ntoh16(p_ntci->g_or_v.generic.trap_num), buff); - } else { - osm_log(p_log, log_level, - "Vendor Notice dump:\n" - "\t\t\t\ttype.....................%u\n" - "\t\t\t\tvendor...................%u\n" - "\t\t\t\tdevice_id................%u\n", - cl_ntoh16(ib_notice_get_type(p_ntci)), - cl_ntoh32(ib_notice_get_vend_id(p_ntci)), - cl_ntoh16(p_ntci->g_or_v.vend.dev_id)); - } -} - -void osm_dump_dr_smp(IN osm_log_t * p_log, IN const ib_smp_t * p_smp, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char buf[BUF_SIZE]; - unsigned n; - - n = sprintf(buf, - "SMP dump:\n" - "\t\t\t\tbase_ver................0x%X\n" - "\t\t\t\tmgmt_class..............0x%X\n" - "\t\t\t\tclass_ver...............0x%X\n" - "\t\t\t\tmethod..................0x%X (%s)\n", - p_smp->base_ver, p_smp->mgmt_class, - p_smp->class_ver, p_smp->method, - ib_get_sm_method_str(p_smp->method)); - - if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR) { - n += snprintf(buf + n, sizeof(buf) - n, - "\t\t\t\tD bit...................0x%X\n" - "\t\t\t\tstatus..................0x%X\n", - ib_smp_is_d(p_smp), - cl_ntoh16(ib_smp_get_status(p_smp))); - } else { - n += snprintf(buf + n, sizeof(buf) - n, - "\t\t\t\tstatus..................0x%X\n", - cl_ntoh16(p_smp->status)); - } - - n += snprintf(buf + n, sizeof(buf) - n, - "\t\t\t\thop_ptr.................0x%X\n" - "\t\t\t\thop_count...............0x%X\n" - "\t\t\t\ttrans_id................0x%" PRIx64 "\n" - "\t\t\t\tattr_id.................0x%X (%s)\n" - "\t\t\t\tresv....................0x%X\n" - "\t\t\t\tattr_mod................0x%X\n" - "\t\t\t\tm_key...................0x%016" PRIx64 - "\n", p_smp->hop_ptr, p_smp->hop_count, - cl_ntoh64(p_smp->trans_id), - cl_ntoh16(p_smp->attr_id), - ib_get_sm_attr_str(p_smp->attr_id), - cl_ntoh16(p_smp->resv), - cl_ntoh32(p_smp->attr_mod), - cl_ntoh64(p_smp->m_key)); - - if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR) { - uint32_t i; - n += snprintf(buf + n, sizeof(buf) - n, - "\t\t\t\tdr_slid.................%u\n" - "\t\t\t\tdr_dlid.................%u\n", - cl_ntoh16(p_smp->dr_slid), - cl_ntoh16(p_smp->dr_dlid)); - - n += snprintf(buf + n, sizeof(buf) - n, - "\n\t\t\t\tInitial path: "); - n += sprint_uint8_arr(buf + n, sizeof(buf) - n, - p_smp->initial_path, - p_smp->hop_count + 1); - - n += snprintf(buf + n, sizeof(buf) - n, - "\n\t\t\t\tReturn path: "); - n += sprint_uint8_arr(buf + n, sizeof(buf) - n, - p_smp->return_path, - p_smp->hop_count + 1); - - n += snprintf(buf + n, sizeof(buf) - n, - "\n\t\t\t\tReserved: "); - for (i = 0; i < 7; i++) { - n += snprintf(buf + n, sizeof(buf) - n, - "[%0X]", p_smp->resv1[i]); - } - n += snprintf(buf + n, sizeof(buf) - n, "\n"); - - for (i = 0; i < 64; i += 16) { - n += snprintf(buf + n, sizeof(buf) - n, - "\n\t\t\t\t%02X %02X %02X %02X " - "%02X %02X %02X %02X" - " %02X %02X %02X %02X %02X %02X %02X %02X\n", - p_smp->data[i], - p_smp->data[i + 1], - p_smp->data[i + 2], - p_smp->data[i + 3], - p_smp->data[i + 4], - p_smp->data[i + 5], - p_smp->data[i + 6], - p_smp->data[i + 7], - p_smp->data[i + 8], - p_smp->data[i + 9], - p_smp->data[i + 10], - p_smp->data[i + 11], - p_smp->data[i + 12], - p_smp->data[i + 13], - p_smp->data[i + 14], - p_smp->data[i + 15]); - } - } else { - /* not a Direct Route so provide source and destination lids */ - n += snprintf(buf + n, sizeof(buf) - n, - "\t\t\t\tMAD IS LID ROUTED\n"); - } - - osm_log(p_log, log_level, "%s\n", buf); - } -} - -void osm_dump_sa_mad(IN osm_log_t * p_log, IN const ib_sa_mad_t * p_mad, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char buf[BUF_SIZE]; - - /* make sure the mad is valid */ - if (p_mad == NULL) { - OSM_LOG(p_log, log_level, "NULL MAD POINTER\n"); - return; - } - - sprintf(buf, - "SA MAD dump:\n" - "\t\t\t\tbase_ver................0x%X\n" - "\t\t\t\tmgmt_class..............0x%X\n" - "\t\t\t\tclass_ver...............0x%X\n" - "\t\t\t\tmethod..................0x%X (%s)\n" - "\t\t\t\tstatus..................0x%X\n" - "\t\t\t\tresv....................0x%X\n" - "\t\t\t\ttrans_id................0x%" PRIx64 "\n" - "\t\t\t\tattr_id.................0x%X (%s)\n" - "\t\t\t\tresv1...................0x%X\n" - "\t\t\t\tattr_mod................0x%X\n" - "\t\t\t\trmpp_version............0x%X\n" - "\t\t\t\trmpp_type...............0x%X\n" - "\t\t\t\trmpp_flags..............0x%X\n" - "\t\t\t\trmpp_status.............0x%X\n" - "\t\t\t\tseg_num.................0x%X\n" - "\t\t\t\tpayload_len/new_win.....0x%X\n" - "\t\t\t\tsm_key..................0x%016" PRIx64 "\n" - "\t\t\t\tattr_offset.............0x%X\n" - "\t\t\t\tresv2...................0x%X\n" - "\t\t\t\tcomp_mask...............0x%016" PRIx64 "\n", - p_mad->base_ver, p_mad->mgmt_class, p_mad->class_ver, - p_mad->method, ib_get_sa_method_str(p_mad->method), - cl_ntoh16(p_mad->status), cl_ntoh16(p_mad->resv), - cl_ntoh64(p_mad->trans_id), cl_ntoh16(p_mad->attr_id), - ib_get_sa_attr_str(p_mad->attr_id), - cl_ntoh16(p_mad->resv1), cl_ntoh32(p_mad->attr_mod), - p_mad->rmpp_version, p_mad->rmpp_type, - p_mad->rmpp_flags, p_mad->rmpp_status, - cl_ntoh32(p_mad->seg_num), - cl_ntoh32(p_mad->paylen_newwin), - cl_ntoh64(p_mad->sm_key), cl_ntoh16(p_mad->attr_offset), - cl_ntoh16(p_mad->resv3), cl_ntoh64(p_mad->comp_mask)); - - strcat(buf, "\n"); - - osm_log(p_log, log_level, "%s\n", buf); - } -} - -void osm_dump_dr_path(IN osm_log_t * p_log, IN const osm_dr_path_t * p_path, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char buf[BUF_SIZE]; - unsigned n = 0; - - n = sprintf(buf, "Directed Path Dump of %u hop path: " - "Path = ", p_path->hop_count); - - sprint_uint8_arr(buf + n, sizeof(buf) - n, p_path->path, - p_path->hop_count + 1); - osm_log(p_log, log_level, "%s\n", buf); - } -} - -void osm_dump_smp_dr_path(IN osm_log_t * p_log, IN const ib_smp_t * p_smp, - IN osm_log_level_t log_level) -{ - if (osm_log_is_active(p_log, log_level)) { - char buf[BUF_SIZE]; - unsigned n; - - n = sprintf(buf, "Received SMP on a %u hop path: " - "Initial path = ", p_smp->hop_count); - n += sprint_uint8_arr(buf + n, sizeof(buf) - n, - p_smp->initial_path, - p_smp->hop_count + 1); - - n += sprintf(buf + n, ", Return path = "); - n += sprint_uint8_arr(buf + n, sizeof(buf) - n, - p_smp->return_path, p_smp->hop_count + 1); - - osm_log(p_log, log_level, "%s\n", buf); - } -} - -static const char *sm_signal_str[] = { - "OSM_SIGNAL_NONE", /* 0 */ - "OSM_SIGNAL_SWEEP", /* 1 */ - "OSM_SIGNAL_IDLE_TIME_PROCESS_REQUEST", /* 2 */ - "OSM_SIGNAL_EXIT_STBY", /* 3 */ - "OSM_SIGNAL_PERFMGR_SWEEP", /* 4 */ - "UNKNOWN SIGNAL!!" /* 5 */ -}; - -const char *osm_get_sm_signal_str(IN osm_signal_t signal) -{ - if (signal > OSM_SIGNAL_MAX) - signal = OSM_SIGNAL_MAX; - return sm_signal_str[signal]; -} - -static const char *disp_msg_str[] = { - "OSM_MSG_NONE", - "OSM_MSG_MAD_NODE_INFO", - "OSM_MSG_MAD_PORT_INFO", - "OSM_MSG_MAD_SWITCH_INFO", - "OSM_MSG_MAD_NODE_DESC", - "OSM_MSG_MAD_NODE_RECORD", - "OSM_MSG_MAD_PORTINFO_RECORD", - "OSM_MSG_MAD_SERVICE_RECORD", - "OSM_MSG_MAD_PATH_RECORD", - "OSM_MSG_MAD_MCMEMBER_RECORD", - "OSM_MSG_MAD_LINK_RECORD", - "OSM_MSG_MAD_SMINFO_RECORD", - "OSM_MSG_MAD_CLASS_PORT_INFO", - "OSM_MSG_MAD_INFORM_INFO", - "OSM_MSG_MAD_LFT_RECORD", - "OSM_MSG_MAD_LFT", - "OSM_MSG_MAD_SM_INFO", - "OSM_MSG_MAD_NOTICE", - "OSM_MSG_LIGHT_SWEEP_FAIL", - "OSM_MSG_MAD_MFT", - "OSM_MSG_MAD_PKEY_TBL_RECORD", - "OSM_MSG_MAD_VL_ARB_RECORD", - "OSM_MSG_MAD_SLVL_TBL_RECORD", - "OSM_MSG_MAD_PKEY", - "OSM_MSG_MAD_VL_ARB", - "OSM_MSG_MAD_SLVL", - "OSM_MSG_MAD_GUIDINFO_RECORD", - "OSM_MSG_MAD_INFORM_INFO_RECORD", -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - "OSM_MSG_MAD_MULTIPATH_RECORD", -#endif - "OSM_MSG_MAD_PORT_COUNTERS", - "UNKNOWN!!" -}; - -const char *osm_get_disp_msg_str(IN cl_disp_msgid_t msg) -{ - if (msg > OSM_MSG_MAX) - msg = OSM_MSG_MAX; - return disp_msg_str[msg]; -} - -static const char *port_state_str_fixed_width[] = { - "NOC", - "DWN", - "INI", - "ARM", - "ACT", - "???" -}; - -const char *osm_get_port_state_str_fixed_width(IN uint8_t port_state) -{ - if (port_state > IB_LINK_ACTIVE) - port_state = IB_LINK_ACTIVE + 1; - return port_state_str_fixed_width[port_state]; -} - -static const char *node_type_str_fixed_width[] = { - "??", - "CA", - "SW", - "RT", -}; - -const char *osm_get_node_type_str_fixed_width(IN uint8_t node_type) -{ - if (node_type > IB_NODE_TYPE_ROUTER) - node_type = 0; - return node_type_str_fixed_width[node_type]; -} - -const char *osm_get_manufacturer_str(IN uint64_t guid_ho) -{ - /* note that the max vendor string length is 11 */ - static const char *intel_str = "Intel"; - static const char *mellanox_str = "Mellanox"; - static const char *redswitch_str = "Redswitch"; - static const char *silverstorm_str = "SilverStorm"; - static const char *topspin_str = "Topspin"; - static const char *fujitsu_str = "Fujitsu"; - static const char *voltaire_str = "Voltaire"; - static const char *yotta_str = "YottaYotta"; - static const char *pathscale_str = "PathScale"; - static const char *ibm_str = "IBM"; - static const char *divergenet_str = "DivergeNet"; - static const char *flextronics_str = "Flextronics"; - static const char *agilent_str = "Agilent"; - static const char *obsidian_str = "Obsidian"; - static const char *baymicro_str = "BayMicro"; - static const char *lsilogic_str = "LSILogic"; - static const char *ddn_str = "DataDirect"; - static const char *panta_str = "Panta"; - static const char *hp_str = "HP"; - static const char *rioworks_str = "Rioworks"; - static const char *sun_str = "Sun"; - static const char *leafntwks_str = "3LeafNtwks"; - static const char *xsigo_str = "Xsigo"; - static const char *dell_str = "Dell"; - static const char *supermicro_str = "SuperMicro"; - static const char *unknown_str = "Unknown"; - - switch ((uint32_t) (guid_ho >> (5 * 8))) { - case OSM_VENDOR_ID_INTEL: - return intel_str; - case OSM_VENDOR_ID_MELLANOX: - return mellanox_str; - case OSM_VENDOR_ID_REDSWITCH: - return redswitch_str; - case OSM_VENDOR_ID_SILVERSTORM: - return silverstorm_str; - case OSM_VENDOR_ID_TOPSPIN: - return topspin_str; - case OSM_VENDOR_ID_FUJITSU: - case OSM_VENDOR_ID_FUJITSU2: - return fujitsu_str; - case OSM_VENDOR_ID_VOLTAIRE: - return voltaire_str; - case OSM_VENDOR_ID_YOTTAYOTTA: - return yotta_str; - case OSM_VENDOR_ID_PATHSCALE: - return pathscale_str; - case OSM_VENDOR_ID_IBM: - return ibm_str; - case OSM_VENDOR_ID_DIVERGENET: - return divergenet_str; - case OSM_VENDOR_ID_FLEXTRONICS: - return flextronics_str; - case OSM_VENDOR_ID_AGILENT: - return agilent_str; - case OSM_VENDOR_ID_OBSIDIAN: - return obsidian_str; - case OSM_VENDOR_ID_BAYMICRO: - return baymicro_str; - case OSM_VENDOR_ID_LSILOGIC: - return lsilogic_str; - case OSM_VENDOR_ID_DDN: - return ddn_str; - case OSM_VENDOR_ID_PANTA: - return panta_str; - case OSM_VENDOR_ID_HP: - case OSM_VENDOR_ID_HP2: - case OSM_VENDOR_ID_HP3: - case OSM_VENDOR_ID_HP4: - return hp_str; - case OSM_VENDOR_ID_RIOWORKS: - return rioworks_str; - case OSM_VENDOR_ID_SUN: - case OSM_VENDOR_ID_SUN2: - return sun_str; - case OSM_VENDOR_ID_3LEAFNTWKS: - return leafntwks_str; - case OSM_VENDOR_ID_XSIGO: - return xsigo_str; - case OSM_VENDOR_ID_DELL: - return dell_str; - case OSM_VENDOR_ID_SUPERMICRO: - return supermicro_str; - default: - return unknown_str; - } -} - -static const char *mtu_str_fixed_width[] = { - "??? ", - "256 ", - "512 ", - "1024", - "2048", - "4096" -}; - -const char *osm_get_mtu_str(IN uint8_t mtu) -{ - if (mtu > IB_MTU_LEN_4096) - return mtu_str_fixed_width[0]; - else - return mtu_str_fixed_width[mtu]; -} - -static const char *lwa_str_fixed_width[] = { - "???", - "1x ", - "4x ", - "???", - "8x ", - "???", - "???", - "???", - "12x" -}; - -const char *osm_get_lwa_str(IN uint8_t lwa) -{ - if (lwa > 8) - return lwa_str_fixed_width[0]; - else - return lwa_str_fixed_width[lwa]; -} - -static const char *lsa_str_fixed_width[] = { - "???", - "2.5", - "5 ", - "???", - "10 " -}; - -const char *osm_get_lsa_str(IN uint8_t lsa) -{ - if (lsa > 4) - return lsa_str_fixed_width[0]; - else - return lsa_str_fixed_width[lsa]; -} - -static const char *sm_mgr_signal_str[] = { - "OSM_SM_SIGNAL_NONE", /* 0 */ - "OSM_SM_SIGNAL_DISCOVERY_COMPLETED", /* 2 */ - "OSM_SM_SIGNAL_POLLING_TIMEOUT", /* 3 */ - "OSM_SM_SIGNAL_DISCOVER", /* 4 */ - "OSM_SM_SIGNAL_DISABLE", /* 5 */ - "OSM_SM_SIGNAL_HANDOVER", /* 6 */ - "OSM_SM_SIGNAL_HANDOVER_SENT", /* 7 */ - "OSM_SM_SIGNAL_ACKNOWLEDGE", /* 8 */ - "OSM_SM_SIGNAL_STANDBY", /* 9 */ - "OSM_SM_SIGNAL_MASTER_OR_HIGHER_SM_DETECTED", /* 10 */ - "OSM_SM_SIGNAL_WAIT_FOR_HANDOVER", /* 11 */ - "UNKNOWN STATE!!" /* 12 */ -}; - -const char *osm_get_sm_mgr_signal_str(IN osm_sm_signal_t signal) -{ - if (signal > OSM_SM_SIGNAL_MAX) - signal = OSM_SM_SIGNAL_MAX; - return sm_mgr_signal_str[signal]; -} - -static const char *sm_mgr_state_str[] = { - "NOTACTIVE", /* 0 */ - "DISCOVERING", /* 1 */ - "STANDBY", /* 2 */ - "MASTER", /* 3 */ - "UNKNOWN STATE!!" /* 4 */ -}; - -const char *osm_get_sm_mgr_state_str(IN uint16_t state) -{ - return state < ARR_SIZE(sm_mgr_state_str) ? - sm_mgr_state_str[state] : - sm_mgr_state_str[ARR_SIZE(sm_mgr_state_str) - 1]; -} diff --git a/branches/opensm_3/user/opensm/osm_inform.c b/branches/opensm_3/user/opensm/osm_inform.c deleted file mode 100644 index 2cdf456c..00000000 --- a/branches/opensm_3/user/opensm/osm_inform.c +++ /dev/null @@ -1,617 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of inform record functions. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_infr_match_ctxt { - cl_list_t *p_remove_infr_list; - ib_mad_notice_attr_t *p_ntc; -} osm_infr_match_ctxt_t; - -void osm_infr_delete(IN osm_infr_t * p_infr) -{ - free(p_infr); -} - -osm_infr_t *osm_infr_new(IN const osm_infr_t * p_infr_rec) -{ - osm_infr_t *p_infr; - - CL_ASSERT(p_infr_rec); - - p_infr = (osm_infr_t *) malloc(sizeof(osm_infr_t)); - if (p_infr) - memcpy(p_infr, p_infr_rec, sizeof(osm_infr_t)); - - return p_infr; -} - -static void dump_all_informs(IN const osm_subn_t * p_subn, IN osm_log_t * p_log) -{ - cl_list_item_t *p_list_item; - - if (!osm_log_is_active(p_log, OSM_LOG_DEBUG)) - return; - - p_list_item = cl_qlist_head(&p_subn->sa_infr_list); - while (p_list_item != cl_qlist_end(&p_subn->sa_infr_list)) { - osm_dump_inform_info(p_log, - &((osm_infr_t *) p_list_item)-> - inform_record.inform_info, OSM_LOG_DEBUG); - p_list_item = cl_qlist_next(p_list_item); - } -} - -/********************************************************************** - * Match an infr by the InformInfo and Address vector - **********************************************************************/ -static cl_status_t match_inf_rec(IN const cl_list_item_t * p_list_item, - IN void *context) -{ - osm_infr_t *p_infr_rec = (osm_infr_t *) context; - osm_infr_t *p_infr = (osm_infr_t *) p_list_item; - osm_log_t *p_log = p_infr_rec->sa->p_log; - cl_status_t status = CL_NOT_FOUND; - - OSM_LOG_ENTER(p_log); - - if (memcmp(&p_infr->report_addr, &p_infr_rec->report_addr, - sizeof(p_infr_rec->report_addr))) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "Differ by Address\n"); - goto Exit; - } - - /* if inform_info.gid is not zero, ignore lid range */ - if (ib_gid_is_notzero(&p_infr_rec->inform_record.inform_info.gid)) { - if (memcmp(&p_infr->inform_record.inform_info.gid, - &p_infr_rec->inform_record.inform_info.gid, - sizeof(p_infr->inform_record.inform_info.gid))) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.gid\n"); - goto Exit; - } - } else { - if ((p_infr->inform_record.inform_info.lid_range_begin != - p_infr_rec->inform_record.inform_info.lid_range_begin) || - (p_infr->inform_record.inform_info.lid_range_end != - p_infr_rec->inform_record.inform_info.lid_range_end)) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.LIDRange\n"); - goto Exit; - } - } - - if (p_infr->inform_record.inform_info.trap_type != - p_infr_rec->inform_record.inform_info.trap_type) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.TrapType\n"); - goto Exit; - } - - if (p_infr->inform_record.inform_info.is_generic != - p_infr_rec->inform_record.inform_info.is_generic) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.IsGeneric\n"); - goto Exit; - } - - if (p_infr->inform_record.inform_info.is_generic) { - if (p_infr->inform_record.inform_info.g_or_v.generic.trap_num != - p_infr_rec->inform_record.inform_info.g_or_v.generic. - trap_num) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.Generic.TrapNumber\n"); - else if (p_infr->inform_record.inform_info.g_or_v.generic. - qpn_resp_time_val != - p_infr_rec->inform_record.inform_info.g_or_v.generic. - qpn_resp_time_val) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.Generic.QPNRespTimeVal\n"); - else if (p_infr->inform_record.inform_info.g_or_v.generic. - node_type_msb != - p_infr_rec->inform_record.inform_info.g_or_v.generic. - node_type_msb) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.Generic.NodeTypeMSB\n"); - else if (p_infr->inform_record.inform_info.g_or_v.generic. - node_type_lsb != - p_infr_rec->inform_record.inform_info.g_or_v.generic. - node_type_lsb) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.Generic.NodeTypeLSB\n"); - else - status = CL_SUCCESS; - } else { - if (p_infr->inform_record.inform_info.g_or_v.vend.dev_id != - p_infr_rec->inform_record.inform_info.g_or_v.vend.dev_id) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.Vendor.DeviceID\n"); - else if (p_infr->inform_record.inform_info.g_or_v.vend. - qpn_resp_time_val != - p_infr_rec->inform_record.inform_info.g_or_v.vend. - qpn_resp_time_val) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.Vendor.QPNRespTimeVal\n"); - else if (p_infr->inform_record.inform_info.g_or_v.vend. - vendor_id_msb != - p_infr_rec->inform_record.inform_info.g_or_v.vend. - vendor_id_msb) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.Vendor.VendorIdMSB\n"); - else if (p_infr->inform_record.inform_info.g_or_v.vend. - vendor_id_lsb != - p_infr_rec->inform_record.inform_info.g_or_v.vend. - vendor_id_lsb) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Differ by InformInfo.Vendor.VendorIdLSB\n"); - else - status = CL_SUCCESS; - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -osm_infr_t *osm_infr_get_by_rec(IN osm_subn_t const *p_subn, - IN osm_log_t * p_log, - IN osm_infr_t * p_infr_rec) -{ - cl_list_item_t *p_list_item; - - OSM_LOG_ENTER(p_log); - - dump_all_informs(p_subn, p_log); - - OSM_LOG(p_log, OSM_LOG_DEBUG, "Looking for Inform Record\n"); - osm_dump_inform_info(p_log, &(p_infr_rec->inform_record.inform_info), - OSM_LOG_DEBUG); - OSM_LOG(p_log, OSM_LOG_DEBUG, "InformInfo list size %d\n", - cl_qlist_count(&p_subn->sa_infr_list)); - - p_list_item = cl_qlist_find_from_head(&p_subn->sa_infr_list, - match_inf_rec, p_infr_rec); - - if (p_list_item == cl_qlist_end(&p_subn->sa_infr_list)) - p_list_item = NULL; - - OSM_LOG_EXIT(p_log); - return (osm_infr_t *) p_list_item; -} - -void osm_infr_insert_to_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log, - IN osm_infr_t * p_infr) -{ - OSM_LOG_ENTER(p_log); - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Inserting new InformInfo Record into Database\n"); - OSM_LOG(p_log, OSM_LOG_DEBUG, "Dump before insertion (size %d)\n", - cl_qlist_count(&p_subn->sa_infr_list)); - dump_all_informs(p_subn, p_log); - -#if 0 - osm_dump_inform_info(p_log, - &(p_infr->inform_record.inform_info), - OSM_LOG_DEBUG); -#endif - - cl_qlist_insert_head(&p_subn->sa_infr_list, &p_infr->list_item); - p_subn->p_osm->sa.dirty = TRUE; - - OSM_LOG(p_log, OSM_LOG_DEBUG, "Dump after insertion (size %d)\n", - cl_qlist_count(&p_subn->sa_infr_list)); - dump_all_informs(p_subn, p_log); - OSM_LOG_EXIT(p_log); -} - -void osm_infr_remove_from_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log, - IN osm_infr_t * p_infr) -{ - char gid_str[INET6_ADDRSTRLEN]; - OSM_LOG_ENTER(p_log); - - OSM_LOG(p_log, OSM_LOG_DEBUG, "Removing InformInfo Subscribing GID:%s" - " Enum:0x%X from Database\n", - inet_ntop(AF_INET6, p_infr->inform_record.subscriber_gid.raw, - gid_str, sizeof gid_str), - p_infr->inform_record.subscriber_enum); - - osm_dump_inform_info(p_log, &(p_infr->inform_record.inform_info), - OSM_LOG_DEBUG); - - cl_qlist_remove_item(&p_subn->sa_infr_list, &p_infr->list_item); - p_subn->p_osm->sa.dirty = TRUE; - - osm_infr_delete(p_infr); - - OSM_LOG_EXIT(p_log); -} - -/********************************************************************** - * Send a report: - * Given a target address to send to and the notice. - * We need to send SubnAdmReport - **********************************************************************/ -static ib_api_status_t send_report(IN osm_infr_t * p_infr_rec, /* the informinfo */ - IN ib_mad_notice_attr_t * p_ntc /* notice to send */ - ) -{ - osm_madw_t *p_report_madw; - ib_mad_notice_attr_t *p_report_ntc; - ib_mad_t *p_mad; - ib_sa_mad_t *p_sa_mad; - static atomic32_t trap_fwd_trans_id = 0x02DAB000; - ib_api_status_t status = IB_SUCCESS; - osm_log_t *p_log = p_infr_rec->sa->p_log; - - OSM_LOG_ENTER(p_log); - - /* HACK: who switches or uses the src and dest GIDs in the grh_info ?? */ - - /* it is better to use LIDs since the GIDs might not be there for SMI traps */ - OSM_LOG(p_log, OSM_LOG_DEBUG, "Forwarding Notice Event from LID:%u" - " to InformInfo LID:%u TID:0x%X\n", - cl_ntoh16(p_ntc->issuer_lid), - cl_ntoh16(p_infr_rec->report_addr.dest_lid), trap_fwd_trans_id); - - /* get the MAD to send */ - p_report_madw = osm_mad_pool_get(p_infr_rec->sa->p_mad_pool, - p_infr_rec->h_bind, MAD_BLOCK_SIZE, - &(p_infr_rec->report_addr)); - - if (!p_report_madw) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0203" - "osm_mad_pool_get failed\n"); - status = IB_ERROR; - goto Exit; - } - - p_report_madw->resp_expected = TRUE; - - /* advance trap trans id (cant simply ++ on some systems inside ntoh) */ - p_mad = osm_madw_get_mad_ptr(p_report_madw); - ib_mad_init_new(p_mad, IB_MCLASS_SUBN_ADM, 2, IB_MAD_METHOD_REPORT, - cl_hton64((uint64_t) cl_atomic_inc(&trap_fwd_trans_id)), - IB_MAD_ATTR_NOTICE, 0); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_report_madw); - - p_report_ntc = (ib_mad_notice_attr_t *) & (p_sa_mad->data); - - /* copy the notice */ - *p_report_ntc = *p_ntc; - - /* The TRUE is for: response is expected */ - osm_sa_send(p_infr_rec->sa, p_report_madw, TRUE); - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -/********************************************************************** - * This routine compares a given Notice and a ListItem of InformInfo type. - * PREREQUISITE: - * The Notice.GID should be pre-filled with the trap generator GID - **********************************************************************/ -static void match_notice_to_inf_rec(IN cl_list_item_t * p_list_item, - IN void *context) -{ - osm_infr_match_ctxt_t *p_infr_match = (osm_infr_match_ctxt_t *) context; - ib_mad_notice_attr_t *p_ntc = p_infr_match->p_ntc; - cl_list_t *p_infr_to_remove_list = p_infr_match->p_remove_infr_list; - osm_infr_t *p_infr_rec = (osm_infr_t *) p_list_item; - ib_inform_info_t *p_ii = &(p_infr_rec->inform_record.inform_info); - cl_status_t status = CL_NOT_FOUND; - osm_log_t *p_log = p_infr_rec->sa->p_log; - osm_subn_t *p_subn = p_infr_rec->sa->p_subn; - ib_gid_t source_gid; - osm_port_t *p_src_port; - osm_port_t *p_dest_port; - - OSM_LOG_ENTER(p_log); - - /* matching rules - * InformInfo Notice - * GID IssuerGID if non zero must match the trap - * LIDRange IssuerLID apply only if GID=0 - * IsGeneric IsGeneric is compulsory and must match the trap - * Type Type if not 0xFFFF must match - * TrapNumber TrapNumber if not 0xFFFF must match - * DeviceId DeviceID if not 0xFFFF must match - * QPN dont care - * ProducerType ProducerType match or 0xFFFFFF // EZ: actually my interpretation - * VendorID VendorID match or 0xFFFFFF - */ - - /* GID IssuerGID if non zero must match the trap */ - if (p_ii->gid.unicast.prefix != 0 - || p_ii->gid.unicast.interface_id != 0) { - /* match by GID */ - if (memcmp(&(p_ii->gid), &(p_ntc->issuer_gid), - sizeof(ib_gid_t))) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by GID\n"); - goto Exit; - } - } else { - /* LIDRange IssuerLID apply only if GID=0 */ - /* If lid_range_begin of the informInfo is 0xFFFF - then it should be ignored. */ - if (p_ii->lid_range_begin != 0xFFFF) { - /* a real lid range is given - check it */ - if ((cl_hton16(p_ii->lid_range_begin) > - cl_hton16(p_ntc->issuer_lid)) - || (cl_hton16(p_ntc->issuer_lid) > - cl_hton16(p_ii->lid_range_end))) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Mismatch by LID Range. Needed: %u <= %u <= %u\n", - cl_hton16(p_ii->lid_range_begin), - cl_hton16(p_ntc->issuer_lid), - cl_hton16(p_ii->lid_range_end)); - goto Exit; - } - } - } - - /* IsGeneric IsGeneric is compulsory and must match the trap */ - if ((p_ii->is_generic && !ib_notice_is_generic(p_ntc)) || - (!p_ii->is_generic && ib_notice_is_generic(p_ntc))) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Generic/Vendor\n"); - goto Exit; - } - - /* Type Type if not 0xFFFF must match */ - if ((p_ii->trap_type != 0xFFFF) && - (cl_ntoh16(p_ii->trap_type) != ib_notice_get_type(p_ntc))) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Type\n"); - goto Exit; - } - - /* based on generic type */ - if (p_ii->is_generic) { - /* TrapNumber TrapNumber if not 0xFFFF must match */ - if ((p_ii->g_or_v.generic.trap_num != 0xFFFF) && - (p_ii->g_or_v.generic.trap_num != - p_ntc->g_or_v.generic.trap_num)) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Trap Num\n"); - goto Exit; - } - - /* ProducerType ProducerType match or 0xFFFFFF */ - if ((cl_ntoh32(ib_inform_info_get_prod_type(p_ii)) != 0xFFFFFF) - && (ib_inform_info_get_prod_type(p_ii) != - ib_notice_get_prod_type(p_ntc))) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Mismatch by Node Type: II=0x%06X (%s) Trap=0x%06X (%s)\n", - cl_ntoh32(ib_inform_info_get_prod_type(p_ii)), - ib_get_producer_type_str - (ib_inform_info_get_prod_type(p_ii)), - cl_ntoh32(ib_notice_get_prod_type(p_ntc)), - ib_get_producer_type_str(ib_notice_get_prod_type - (p_ntc))); - goto Exit; - } - } else { - /* DeviceId DeviceID if not 0xFFFF must match */ - if ((p_ii->g_or_v.vend.dev_id != 0xFFFF) && - (p_ii->g_or_v.vend.dev_id != p_ntc->g_or_v.vend.dev_id)) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Dev Id\n"); - goto Exit; - } - - /* VendorID VendorID match or 0xFFFFFF */ - if ((ib_inform_info_get_vend_id(p_ii) != CL_HTON32(0xFFFFFF)) && - (ib_inform_info_get_vend_id(p_ii) != - ib_notice_get_vend_id(p_ntc))) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Mismatch by Vendor ID\n"); - goto Exit; - } - } - - /* Check if there is a pkey match. o13-17.1.1 */ - /* Check if the issuer of the trap is the SM. If it is, then the gid - comparison should be done on the trap source (saved as the gid in the - data details field). - If the issuer gid is not the SM - then it is the guid of the trap - source */ - if ((cl_ntoh64(p_ntc->issuer_gid.unicast.prefix) == - p_subn->opt.subnet_prefix) - && (cl_ntoh64(p_ntc->issuer_gid.unicast.interface_id) == - p_subn->sm_port_guid)) - /* The issuer is the SM then this is trap 64-67 - compare the gid - with the gid saved on the data details */ - source_gid = p_ntc->data_details.ntc_64_67.gid; - else - source_gid = p_ntc->issuer_gid; - - p_src_port = - osm_get_port_by_guid(p_subn, source_gid.unicast.interface_id); - if (!p_src_port) { - OSM_LOG(p_log, OSM_LOG_INFO, - "Cannot find source port with GUID:0x%016" PRIx64 "\n", - cl_ntoh64(source_gid.unicast.interface_id)); - goto Exit; - } - - p_dest_port = osm_get_port_by_lid(p_subn, - p_infr_rec->report_addr.dest_lid); - if (!p_dest_port) { - OSM_LOG(p_log, OSM_LOG_INFO, - "Cannot find destination port with LID:%u\n", - cl_ntoh16(p_infr_rec->report_addr.dest_lid)); - goto Exit; - } - - if (osm_port_share_pkey(p_log, p_src_port, p_dest_port) == FALSE) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Pkey\n"); - /* According to o13-17.1.2 - If this informInfo does not have - lid_range_begin of 0xFFFF, then this informInfo request - should be removed from database */ - if (p_ii->lid_range_begin != 0xFFFF) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Pkey mismatch on lid_range_begin != 0xFFFF. " - "Need to remove this informInfo from db\n"); - /* add the informInfo record to the remove_infr list */ - cl_list_insert_tail(p_infr_to_remove_list, p_infr_rec); - } - goto Exit; - } - - /* send the report to the address provided in the inform record */ - OSM_LOG(p_log, OSM_LOG_DEBUG, "MATCH! Sending Report...\n"); - send_report(p_infr_rec, p_ntc); - status = CL_SUCCESS; - -Exit: - OSM_LOG_EXIT(p_log); -} - -/********************************************************************** - * Once a Trap was received by osm_trap_rcv, or a Trap sourced by - * the SM was sent (Traps 64-67), this routine is called with a copy of - * the notice data. - * Given a notice attribute - compare and see if it matches the InformInfo - * element and if it does - call the Report(Notice) for the - * target QP registered by the address stored in the InformInfo element - **********************************************************************/ -static void log_notice(osm_log_t * log, osm_log_level_t level, - ib_mad_notice_attr_t * ntc) -{ - char gid_str[INET6_ADDRSTRLEN]; - ib_gid_t *gid; - - /* an official Event information log */ - if (ib_notice_is_generic(ntc)) { - if ((ntc->g_or_v.generic.trap_num == CL_HTON16(64)) || - (ntc->g_or_v.generic.trap_num == CL_HTON16(65)) || - (ntc->g_or_v.generic.trap_num == CL_HTON16(66)) || - (ntc->g_or_v.generic.trap_num == CL_HTON16(67))) - gid = &ntc->data_details.ntc_64_67.gid; - else - gid = &ntc->issuer_gid; - OSM_LOG(log, level, - "Reporting Generic Notice type:%u num:%u (%s)" - " from LID:%u GID:%s\n", - ib_notice_get_type(ntc), - cl_ntoh16(ntc->g_or_v.generic.trap_num), - ib_get_trap_str(ntc->g_or_v.generic.trap_num), - cl_ntoh16(ntc->issuer_lid), - inet_ntop(AF_INET6, gid->raw, gid_str, sizeof gid_str)); - } else - OSM_LOG(log, level, - "Reporting Vendor Notice type:%u vend:%u dev:%u" - " from LID:%u GID:%s\n", - ib_notice_get_type(ntc), - cl_ntoh32(ib_notice_get_vend_id(ntc)), - cl_ntoh16(ntc->g_or_v.vend.dev_id), - cl_ntoh16(ntc->issuer_lid), - inet_ntop(AF_INET6, ntc->issuer_gid.raw, gid_str, - sizeof gid_str)); -} - -ib_api_status_t osm_report_notice(IN osm_log_t * p_log, IN osm_subn_t * p_subn, - IN ib_mad_notice_attr_t * p_ntc) -{ - osm_infr_match_ctxt_t context; - cl_list_t infr_to_remove_list; - osm_infr_t *p_infr_rec; - osm_infr_t *p_next_infr_rec; - - OSM_LOG_ENTER(p_log); - - /* - * we must make sure we are ready for this... - * note that the trap receivers might be initialized before - * the osm_infr_init call is performed. - */ - if (p_subn->sa_infr_list.state != CL_INITIALIZED) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Ignoring Notice Reports since Inform List is not initialized yet!\n"); - return IB_ERROR; - } - - if (osm_log_is_active(p_log, OSM_LOG_INFO)) - log_notice(p_log, OSM_LOG_INFO, p_ntc); - - /* Create a list that will hold all the infr records that should - be removed due to violation. o13-17.1.2 */ - cl_list_construct(&infr_to_remove_list); - cl_list_init(&infr_to_remove_list, 5); - context.p_remove_infr_list = &infr_to_remove_list; - context.p_ntc = p_ntc; - - /* go over all inform info available at the subnet */ - /* try match to the given notice and send if match */ - cl_qlist_apply_func(&p_subn->sa_infr_list, match_notice_to_inf_rec, - &context); - - /* If we inserted items into the infr_to_remove_list - we need to - remove them */ - p_infr_rec = (osm_infr_t *) cl_list_remove_head(&infr_to_remove_list); - while (p_infr_rec != NULL) { - p_next_infr_rec = - (osm_infr_t *) cl_list_remove_head(&infr_to_remove_list); - osm_infr_remove_from_db(p_subn, p_log, p_infr_rec); - p_infr_rec = p_next_infr_rec; - } - cl_list_destroy(&infr_to_remove_list); - - /* report IB traps to plugin */ - osm_opensm_report_event(p_subn->p_osm, OSM_EVENT_ID_TRAP, p_ntc); - - OSM_LOG_EXIT(p_log); - - return IB_SUCCESS; -} diff --git a/branches/opensm_3/user/opensm/osm_lid_mgr.c b/branches/opensm_3/user/opensm/osm_lid_mgr.c deleted file mode 100644 index 50860040..00000000 --- a/branches/opensm_3/user/opensm/osm_lid_mgr.c +++ /dev/null @@ -1,1206 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_lid_mgr_t. - * This file implements the LID Manager object which is responsible for - * assigning LIDs to all ports on the subnet. - * - * DATA STRUCTURES: - * p_subn->port_lid_tbl : a vector pointing from lid to its port. - * osm db guid2lid domain : a hash from guid to lid (min lid). - * p_subn->port_guid_tbl : a map from guid to discovered port obj. - * - * ALGORITHM: - * - * 0. we define a function to obtain the correct port lid: - * lid_mgr_get_port_lid( p_mgr, port, &min_lid ): - * 0.1 if the port info lid matches the guid2lid return 0 - * 0.2 if the port info has a lid and that range is empty in - * port_lid_tbl, return 0 and update the port_lid_tbl and - * guid2lid - * 0.3 else find an empty space in port_lid_tbl, update the - * port_lid_tbl and guid2lid, return 1 to flag a change required. - * - * 1. During initialization: - * 1.1 initialize the guid2lid database domain. - * 1.2 if reassign_lid is not set: - * 1.2.1 read the persistent data for the domain. - * 1.2.2 validate no duplicate use of lids and lids are 2^(lmc-1) - * - * 2. During SM port lid assignment: - * 2.1 if reassign_lids is set, make it 2^lmc - * 2.2 cleanup all port_lid_tbl and re-fill it according to guid2lid - * 2.3 call lid_mgr_get_port_lid the SM port - * 2.4 set the port info - * - * 3. During all other ports lid assignment: - * 3.1 go through all ports in the subnet - * 3.1.1 call lid_mgr_get_port_min_lid - * 3.1.2 if a change required send the port info - * 3.2 if any change send the signal PENDING... - * - * 4. Store the guid2lid - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/********************************************************************** - lid range item of qlist - **********************************************************************/ -typedef struct osm_lid_mgr_range { - cl_list_item_t item; - uint16_t min_lid; - uint16_t max_lid; -} osm_lid_mgr_range_t; - -void osm_lid_mgr_construct(IN osm_lid_mgr_t * p_mgr) -{ - memset(p_mgr, 0, sizeof(*p_mgr)); -} - -void osm_lid_mgr_destroy(IN osm_lid_mgr_t * p_mgr) -{ - cl_list_item_t *p_item; - - OSM_LOG_ENTER(p_mgr->p_log); - - while ((p_item = cl_qlist_remove_head(&p_mgr->free_ranges)) != - cl_qlist_end(&p_mgr->free_ranges)) - free((osm_lid_mgr_range_t *) p_item); - OSM_LOG_EXIT(p_mgr->p_log); -} - -/********************************************************************** -Validate the guid to lid data by making sure that under the current -LMC we did not get duplicates. If we do flag them as errors and remove -the entry. -**********************************************************************/ -static void lid_mgr_validate_db(IN osm_lid_mgr_t * p_mgr) -{ - cl_qlist_t guids; - osm_db_guid_elem_t *p_item; - uint16_t lid; - uint16_t min_lid; - uint16_t max_lid; - uint16_t lmc_mask; - boolean_t lids_ok; - - OSM_LOG_ENTER(p_mgr->p_log); - - lmc_mask = ~((1 << p_mgr->p_subn->opt.lmc) - 1); - - cl_qlist_init(&guids); - - if (osm_db_guid2lid_guids(p_mgr->p_g2l, &guids)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 0310: " - "could not get guid list\n"); - goto Exit; - } - - while ((p_item = (osm_db_guid_elem_t *) cl_qlist_remove_head(&guids)) - != (osm_db_guid_elem_t *) cl_qlist_end(&guids)) { - if (osm_db_guid2lid_get(p_mgr->p_g2l, p_item->guid, - &min_lid, &max_lid)) - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 0311: " - "could not get lid for guid:0x%016" PRIx64 "\n", - p_item->guid); - else { - lids_ok = TRUE; - - if (min_lid > max_lid || min_lid == 0 - || p_item->guid == 0 - || max_lid > p_mgr->p_subn->max_ucast_lid_ho) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, - "ERR 0312: " - "Illegal LID range [%u:%u] for " - "guid:0x%016" PRIx64 "\n", min_lid, - max_lid, p_item->guid); - lids_ok = FALSE; - } else if (min_lid != max_lid - && (min_lid & lmc_mask) != min_lid) { - /* check that if the lids define a range that is - valid for the current LMC mask */ - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, - "ERR 0313: " - "LID range [%u:%u] for guid:0x%016" - PRIx64 - " is not aligned according to mask:0x%04x\n", - min_lid, max_lid, p_item->guid, - lmc_mask); - lids_ok = FALSE; - } else { - /* check if the lids were not previously assigned */ - for (lid = min_lid; lid <= max_lid; lid++) { - if (p_mgr->used_lids[lid]) { - OSM_LOG(p_mgr->p_log, - OSM_LOG_ERROR, - "ERR 0314: " - "0x%04x for guid:0x%016" - PRIx64 - " was previously used\n", - lid, p_item->guid); - lids_ok = FALSE; - } - } - } - - if (lids_ok) - /* mark that it was visited */ - for (lid = min_lid; lid <= max_lid; lid++) - p_mgr->used_lids[lid] = 1; - else if (osm_db_guid2lid_delete(p_mgr->p_g2l, - p_item->guid)) - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, - "ERR 0315: failed to delete entry for " - "guid:0x%016" PRIx64 "\n", - p_item->guid); - } /* got a lid */ - free(p_item); - } /* all guids */ -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} - -ib_api_status_t osm_lid_mgr_init(IN osm_lid_mgr_t * p_mgr, IN osm_sm_t * sm) -{ - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sm->p_log); - - osm_lid_mgr_construct(p_mgr); - - p_mgr->sm = sm; - p_mgr->p_log = sm->p_log; - p_mgr->p_subn = sm->p_subn; - p_mgr->p_db = sm->p_db; - p_mgr->p_lock = sm->p_lock; - - /* we initialize and restore the db domain of guid to lid map */ - p_mgr->p_g2l = osm_db_domain_init(p_mgr->p_db, "guid2lid"); - if (!p_mgr->p_g2l) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 0316: " - "Error initializing Guid-to-Lid persistent database\n"); - status = IB_ERROR; - goto Exit; - } - - cl_qlist_init(&p_mgr->free_ranges); - - /* we use the stored guid to lid table if not forced to reassign */ - if (!p_mgr->p_subn->opt.reassign_lids) { - if (osm_db_restore(p_mgr->p_g2l)) { -#ifndef __WIN__ - /* - * When Windows is BSODing, it might corrupt files that - * were previously opened for writing, even if the files - * are closed, so we might see corrupted guid2lid file. - */ - if (p_mgr->p_subn->opt.exit_on_fatal) { - osm_log(p_mgr->p_log, OSM_LOG_SYS, - "FATAL: Error restoring Guid-to-Lid " - "persistent database\n"); - status = IB_ERROR; - goto Exit; - } else -#endif - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, - "ERR 0317: Error restoring Guid-to-Lid " - "persistent database\n"); - } - - /* we need to make sure we did not get duplicates with - current lmc */ - lid_mgr_validate_db(p_mgr); - } - -Exit: - OSM_LOG_EXIT(p_mgr->p_log); - return status; -} - -static uint16_t trim_lid(IN uint16_t lid) -{ - if (lid > IB_LID_UCAST_END_HO || lid < IB_LID_UCAST_START_HO) - return 0; - return lid; -} - -/********************************************************************** - initialize the manager for a new sweep: - scans the known persistent assignment and port_lid_tbl - re-calculate all empty ranges. - cleanup invalid port_lid_tbl entries -**********************************************************************/ -static int lid_mgr_init_sweep(IN osm_lid_mgr_t * p_mgr) -{ - cl_ptr_vector_t *p_discovered_vec = &p_mgr->p_subn->port_lid_tbl; - uint16_t max_defined_lid, max_persistent_lid, max_discovered_lid; - uint16_t disc_min_lid, disc_max_lid, db_min_lid, db_max_lid; - int status = 0; - cl_list_item_t *p_item; - boolean_t is_free; - osm_lid_mgr_range_t *p_range = NULL; - osm_port_t *p_port; - cl_qmap_t *p_port_guid_tbl; - uint8_t lmc_num_lids = (uint8_t) (1 << p_mgr->p_subn->opt.lmc); - uint16_t lmc_mask, req_lid, num_lids, lid; - - OSM_LOG_ENTER(p_mgr->p_log); - - lmc_mask = ~((1 << p_mgr->p_subn->opt.lmc) - 1); - - /* if we came out of standby we need to discard any previous guid2lid - info we might have. - Do this only if the honor_guid2lid_file option is FALSE. If not, then - need to honor this file. */ - if (p_mgr->p_subn->coming_out_of_standby == TRUE) { - osm_db_clear(p_mgr->p_g2l); - memset(p_mgr->used_lids, 0, sizeof(p_mgr->used_lids)); - if (p_mgr->p_subn->opt.honor_guid2lid_file == FALSE) - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Ignore guid2lid file when coming out of standby\n"); - else { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Honor current guid2lid file when coming out " - "of standby\n"); - if (osm_db_restore(p_mgr->p_g2l)) - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, - "ERR 0306: " - "Error restoring Guid-to-Lid " - "persistent database. Ignoring it\n"); - lid_mgr_validate_db(p_mgr); - } - } - - /* we need to cleanup the empty ranges list */ - while ((p_item = cl_qlist_remove_head(&p_mgr->free_ranges)) != - cl_qlist_end(&p_mgr->free_ranges)) - free((osm_lid_mgr_range_t *) p_item); - - /* first clean up the port_by_lid_tbl */ - for (lid = 0; lid < cl_ptr_vector_get_size(p_discovered_vec); lid++) - cl_ptr_vector_set(p_discovered_vec, lid, NULL); - - /* we if are in the first sweep and in reassign lids mode - we should ignore all the available info and simply define one - huge empty range */ - if (p_mgr->p_subn->first_time_master_sweep == TRUE && - p_mgr->p_subn->opt.reassign_lids == TRUE) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Skipping all lids as we are reassigning them\n"); - p_range = malloc(sizeof(osm_lid_mgr_range_t)); - if (p_range) - p_range->min_lid = 1; - goto AfterScanningLids; - } - - /* go over all discovered ports and mark their entries */ - p_port_guid_tbl = &p_mgr->p_subn->port_guid_tbl; - - for (p_port = (osm_port_t *) cl_qmap_head(p_port_guid_tbl); - p_port != (osm_port_t *) cl_qmap_end(p_port_guid_tbl); - p_port = (osm_port_t *) cl_qmap_next(&p_port->map_item)) { - osm_port_get_lid_range_ho(p_port, &disc_min_lid, &disc_max_lid); - disc_min_lid = trim_lid(disc_min_lid); - disc_max_lid = trim_lid(disc_max_lid); - for (lid = disc_min_lid; lid <= disc_max_lid; lid++) - cl_ptr_vector_set(p_discovered_vec, lid, p_port); - /* make sure the guid2lid entry is valid. If not, clean it. */ - if (osm_db_guid2lid_get(p_mgr->p_g2l, - cl_ntoh64(osm_port_get_guid(p_port)), - &db_min_lid, &db_max_lid)) - continue; - - if (!p_port->p_node->sw || - osm_switch_sp0_is_lmc_capable(p_port->p_node->sw, - p_mgr->p_subn)) - num_lids = lmc_num_lids; - else - num_lids = 1; - - if (num_lids != 1 && - ((db_min_lid & lmc_mask) != db_min_lid || - db_max_lid - db_min_lid + 1 < num_lids)) { - /* Not aligned, or not wide enough, then remove the entry */ - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Cleaning persistent entry for guid:" - "0x%016" PRIx64 " illegal range:[0x%x:0x%x]\n", - cl_ntoh64(osm_port_get_guid(p_port)), - db_min_lid, db_max_lid); - osm_db_guid2lid_delete(p_mgr->p_g2l, - cl_ntoh64 - (osm_port_get_guid(p_port))); - for (lid = db_min_lid; lid <= db_max_lid; lid++) - p_mgr->used_lids[lid] = 0; - } - } - - /* - Our task is to find free lid ranges. - A lid can be used if - 1. a persistent assignment exists - 2. the lid is used by a discovered port that does not have a - persistent assignment. - - scan through all lid values of both the persistent table and - discovered table. - If the lid has an assigned port in the discovered table: - * make sure the lid matches the persistent table, or - * there is no other persistent assignment for that lid. - * else cleanup the port_by_lid_tbl, mark this as empty range. - Else if the lid does not have an entry in the persistent table - mark it as free. - */ - - /* find the range of lids to scan */ - max_discovered_lid = - (uint16_t) cl_ptr_vector_get_size(p_discovered_vec); - max_persistent_lid = sizeof(p_mgr->used_lids) - 1; - - /* but the vectors have one extra entry for lid=0 */ - if (max_discovered_lid) - max_discovered_lid--; - - if (max_persistent_lid > max_discovered_lid) - max_defined_lid = max_persistent_lid; - else - max_defined_lid = max_discovered_lid; - - for (lid = 1; lid <= max_defined_lid; lid++) { - is_free = TRUE; - /* first check to see if the lid is used by a persistent assignment */ - if (lid <= max_persistent_lid && p_mgr->used_lids[lid]) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "0x%04x is not free as its mapped by the " - "persistent db\n", lid); - is_free = FALSE; - /* check this is a discovered port */ - } else if (lid <= max_discovered_lid && - (p_port = cl_ptr_vector_get(p_discovered_vec, - lid))) { - /* we have a port. Now lets see if we can preserve its lid range. */ - /* For that, we need to make sure: - 1. The port has a (legal) persistency entry. Then the - local lid is free (we will use the persistency value). - 2. Can the port keep its local assignment? - a. Make sure the lid a aligned. - b. Make sure all needed lids (for the lmc) are free - according to persistency table. - */ - /* qualify the guid of the port is not persistently - mapped to another range */ - if (!osm_db_guid2lid_get(p_mgr->p_g2l, - cl_ntoh64 - (osm_port_get_guid(p_port)), - &db_min_lid, &db_max_lid)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "0x%04x is free as it was " - "discovered but mapped by the " - "persistent db to [0x%04x:0x%04x]\n", - lid, db_min_lid, db_max_lid); - } else { - /* can the port keep its assignment ? */ - /* get the lid range of that port, and the - required number of lids we are about to - assign to it */ - osm_port_get_lid_range_ho(p_port, - &disc_min_lid, - &disc_max_lid); - if (!p_port->p_node->sw || - osm_switch_sp0_is_lmc_capable - (p_port->p_node->sw, p_mgr->p_subn)) { - disc_max_lid = - disc_min_lid + lmc_num_lids - 1; - num_lids = lmc_num_lids; - } else - num_lids = 1; - - /* Make sure the lid is aligned */ - if (num_lids != 1 - && (disc_min_lid & lmc_mask) != - disc_min_lid) { - /* The lid cannot be used */ - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "0x%04x is free as it was " - "discovered but not aligned\n", - lid); - } else { - /* check that all needed lids are not persistently mapped */ - is_free = FALSE; - for (req_lid = disc_min_lid + 1; - req_lid <= disc_max_lid; - req_lid++) { - if (req_lid <= - max_persistent_lid && - p_mgr->used_lids[req_lid]) { - OSM_LOG(p_mgr->p_log, - OSM_LOG_DEBUG, - "0x%04x is free as it was discovered " - "but mapped\n", - lid); - is_free = TRUE; - break; - } - } - - if (is_free == FALSE) { - /* This port will use its local lid, and consume the entire required lid range. - Thus we can skip that range. */ - /* If the disc_max_lid is greater then lid, we can skip right to it, - since we've done all neccessary checks on the lids in between. */ - if (disc_max_lid > lid) - lid = disc_max_lid; - } - } - } - } - - if (is_free) { - if (p_range) - p_range->max_lid = lid; - else { - p_range = malloc(sizeof(osm_lid_mgr_range_t)); - if (p_range) { - p_range->min_lid = lid; - p_range->max_lid = lid; - } - } - /* this lid is used so we need to finalize the previous free range */ - } else if (p_range) { - cl_qlist_insert_tail(&p_mgr->free_ranges, - &p_range->item); - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "new free lid range [%u:%u]\n", - p_range->min_lid, p_range->max_lid); - p_range = NULL; - } - } - -AfterScanningLids: - /* after scanning all known lids we need to extend the last range - to the max allowed lid */ - if (!p_range) { - p_range = malloc(sizeof(osm_lid_mgr_range_t)); - /* - The p_range can be NULL in one of 2 cases: - 1. If max_defined_lid == 0. In this case, we want the - entire range. - 2. If all lids discovered in the loop where mapped. In this - case, no free range exists and we want to define it after the - last mapped lid. - */ - if (p_range) - p_range->min_lid = lid; - } - if (p_range) { - p_range->max_lid = p_mgr->p_subn->max_ucast_lid_ho; - cl_qlist_insert_tail(&p_mgr->free_ranges, &p_range->item); - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "final free lid range [%u:%u]\n", - p_range->min_lid, p_range->max_lid); - } - - OSM_LOG_EXIT(p_mgr->p_log); - return status; -} - -/********************************************************************** - check if the given range of lids is free -**********************************************************************/ -static boolean_t lid_mgr_is_range_not_persistent(IN osm_lid_mgr_t * p_mgr, - IN uint16_t lid, - IN uint16_t num_lids) -{ - uint16_t i; - uint8_t start_lid = (uint8_t) (1 << p_mgr->p_subn->opt.lmc); - - if (lid < start_lid) - return FALSE; - - for (i = lid; i < lid + num_lids; i++) - if (p_mgr->used_lids[i]) - return FALSE; - - return TRUE; -} - -/********************************************************************** -find a free lid range -**********************************************************************/ -static void lid_mgr_find_free_lid_range(IN osm_lid_mgr_t * p_mgr, - IN uint8_t num_lids, - OUT uint16_t * p_min_lid, - OUT uint16_t * p_max_lid) -{ - uint16_t lid; - cl_list_item_t *p_item; - cl_list_item_t *p_next_item; - osm_lid_mgr_range_t *p_range = NULL; - uint8_t lmc_num_lids; - uint16_t lmc_mask; - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, "LMC = %u, number LIDs = %u\n", - p_mgr->p_subn->opt.lmc, num_lids); - - lmc_num_lids = (1 << p_mgr->p_subn->opt.lmc); - lmc_mask = ~((1 << p_mgr->p_subn->opt.lmc) - 1); - - /* - Search the list of free lid ranges for a range which is big enough - */ - p_item = cl_qlist_head(&p_mgr->free_ranges); - while (p_item != cl_qlist_end(&p_mgr->free_ranges)) { - p_next_item = cl_qlist_next(p_item); - p_range = (osm_lid_mgr_range_t *) p_item; - - lid = p_range->min_lid; - - /* if we require more then one lid we must align to LMC */ - if (num_lids > 1) { - if ((lid & lmc_mask) != lid) - lid = (lid + lmc_num_lids) & lmc_mask; - } - - /* but we can be out of the range */ - if (lid + num_lids - 1 <= p_range->max_lid) { - /* ok let us use that range */ - if (lid + num_lids - 1 == p_range->max_lid) { - /* we consumed the entire range */ - cl_qlist_remove_item(&p_mgr->free_ranges, - p_item); - free(p_item); - } else - /* only update the available range */ - p_range->min_lid = lid + num_lids; - - *p_min_lid = lid; - *p_max_lid = (uint16_t) (lid + num_lids - 1); - return; - } - p_item = p_next_item; - } - - /* - Couldn't find a free range of lids. - */ - *p_min_lid = *p_max_lid = 0; - /* if we run out of lids, give an error and abort! */ - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 0307: " - "OPENSM RAN OUT OF LIDS!!!\n"); - CL_ASSERT(0); -} - -static void lid_mgr_cleanup_discovered_port_lid_range(IN osm_lid_mgr_t * p_mgr, - IN osm_port_t * p_port) -{ - cl_ptr_vector_t *p_discovered_vec = &p_mgr->p_subn->port_lid_tbl; - uint16_t lid, min_lid, max_lid; - uint16_t max_tbl_lid = - (uint16_t) (cl_ptr_vector_get_size(p_discovered_vec)); - - osm_port_get_lid_range_ho(p_port, &min_lid, &max_lid); - min_lid = trim_lid(min_lid); - max_lid = trim_lid(max_lid); - for (lid = min_lid; lid <= max_lid; lid++) - if (lid < max_tbl_lid && - p_port == cl_ptr_vector_get(p_discovered_vec, lid)) - cl_ptr_vector_set(p_discovered_vec, lid, NULL); -} - -/********************************************************************** - 0.1 if the port info lid matches the guid2lid return 0 - 0.2 if the port info has a lid and that range is empty in - port_lid_tbl, return 0 and update the port_lid_tbl and - guid2lid - 0.3 else find an empty space in port_lid_tbl, update the - port_lid_tbl and guid2lid, return 1 to flag a change required. -**********************************************************************/ -static int lid_mgr_get_port_lid(IN osm_lid_mgr_t * p_mgr, - IN osm_port_t * p_port, - OUT uint16_t * p_min_lid, - OUT uint16_t * p_max_lid) -{ - uint16_t lid, min_lid, max_lid; - uint64_t guid; - uint8_t num_lids = (1 << p_mgr->p_subn->opt.lmc); - int lid_changed = 0; - uint16_t lmc_mask; - - OSM_LOG_ENTER(p_mgr->p_log); - - /* get the lid from the guid2lid */ - guid = cl_ntoh64(osm_port_get_guid(p_port)); - - /* if the port is a base switch port 0 then we only need one lid */ - if (p_port->p_node->sw && - !osm_switch_sp0_is_lmc_capable(p_port->p_node->sw, p_mgr->p_subn)) - num_lids = 1; - - if (p_mgr->p_subn->first_time_master_sweep == TRUE && - p_mgr->p_subn->opt.reassign_lids == TRUE) - goto AssignLid; - - lmc_mask = ~(num_lids - 1); - - /* if the port matches the guid2lid */ - if (!osm_db_guid2lid_get(p_mgr->p_g2l, guid, &min_lid, &max_lid)) { - *p_min_lid = min_lid; - *p_max_lid = min_lid + num_lids - 1; - if (min_lid == cl_ntoh16(osm_port_get_base_lid(p_port))) - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, "0x%016" PRIx64 - " matches its known lid:%u\n", guid, min_lid); - else { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "0x%016" PRIx64 " with lid:%u " - "does not match its known lid:%u\n", - guid, cl_ntoh16(osm_port_get_base_lid(p_port)), - min_lid); - lid_mgr_cleanup_discovered_port_lid_range(p_mgr, - p_port); - /* we still need to send the setting to the target port */ - lid_changed = 1; - } - goto NewLidSet; - } else - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "0x%016" PRIx64 " has no persistent lid assigned\n", - guid); - - /* if the port info carries a lid it must be lmc aligned and not mapped - by the pesistent storage */ - min_lid = cl_ntoh16(osm_port_get_base_lid(p_port)); - - /* we want to ignore the discovered lid if we are also on first sweep of - reassign lids flow */ - if (min_lid) { - /* make sure lid is valid */ - if ((min_lid & lmc_mask) == min_lid) { - /* is it free */ - if (lid_mgr_is_range_not_persistent - (p_mgr, min_lid, num_lids)) { - *p_min_lid = min_lid; - *p_max_lid = min_lid + num_lids - 1; - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "0x%016" PRIx64 - " lid range:[%u-%u] is free\n", - guid, *p_min_lid, *p_max_lid); - goto NewLidSet; - } else - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "0x%016" PRIx64 " existing lid " - "range:[%u:%u] is not free\n", - guid, min_lid, min_lid + num_lids - 1); - } else - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "0x%016" PRIx64 " existing lid range:" - "[%u:%u] is not lmc aligned\n", - guid, min_lid, min_lid + num_lids - 1); - } - -AssignLid: - /* first cleanup the existing discovered lid range */ - lid_mgr_cleanup_discovered_port_lid_range(p_mgr, p_port); - - /* find an empty space */ - lid_mgr_find_free_lid_range(p_mgr, num_lids, p_min_lid, p_max_lid); - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "0x%016" PRIx64 " assigned a new lid range:[%u-%u]\n", - guid, *p_min_lid, *p_max_lid); - lid_changed = 1; - -NewLidSet: - /* update the guid2lid db and used_lids */ - osm_db_guid2lid_set(p_mgr->p_g2l, guid, *p_min_lid, *p_max_lid); - for (lid = *p_min_lid; lid <= *p_max_lid; lid++) - p_mgr->used_lids[lid] = 1; - - /* make sure the assigned lids are marked in port_lid_tbl */ - for (lid = *p_min_lid; lid <= *p_max_lid; lid++) - cl_ptr_vector_set(&p_mgr->p_subn->port_lid_tbl, lid, p_port); - - OSM_LOG_EXIT(p_mgr->p_log); - return lid_changed; -} - -/********************************************************************** - Set to INIT the remote port of the given physical port - **********************************************************************/ -static void lid_mgr_set_remote_pi_state_to_init(IN osm_lid_mgr_t * p_mgr, - IN osm_physp_t * p_physp) -{ - osm_physp_t *p_rem_physp = osm_physp_get_remote(p_physp); - - if (p_rem_physp == NULL) - return; - - /* but in some rare cases the remote side might be non responsive */ - ib_port_info_set_port_state(&p_rem_physp->port_info, IB_LINK_INIT); -} - -static int lid_mgr_set_physp_pi(IN osm_lid_mgr_t * p_mgr, - IN osm_port_t * p_port, - IN osm_physp_t * p_physp, IN ib_net16_t lid) -{ - uint8_t payload[IB_SMP_DATA_SIZE]; - ib_port_info_t *p_pi = (ib_port_info_t *) payload; - const ib_port_info_t *p_old_pi; - osm_madw_context_t context; - osm_node_t *p_node; - ib_api_status_t status; - uint8_t mtu; - uint8_t op_vls; - uint8_t port_num; - boolean_t send_set = FALSE; - int ret = 0; - - OSM_LOG_ENTER(p_mgr->p_log); - - /* - Don't bother doing anything if this Physical Port is not valid. - This allows simplified code in the caller. - */ - if (!p_physp) - goto Exit; - - port_num = osm_physp_get_port_num(p_physp); - p_node = osm_physp_get_node_ptr(p_physp); - - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH && port_num != 0) { - /* - Switch ports that are not numbered 0 should not be set - with the following attributes as they are set later - (during NO_CHANGE state in link mgr). - */ - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Skipping switch port %u, GUID 0x%016" PRIx64 "\n", - port_num, cl_ntoh64(osm_physp_get_port_guid(p_physp))); - goto Exit; - } - - p_old_pi = &p_physp->port_info; - - /* - First, copy existing parameters from the PortInfo attribute we - already have for this node. - - Second, update with default values that we know must be set for - every Physical Port and the LID and set the neighbor MTU field - appropriately. - - Third, send the SMP to this physical port. - */ - - memcpy(payload, p_old_pi, sizeof(ib_port_info_t)); - memset(payload + sizeof(ib_port_info_t), 0, - IB_SMP_DATA_SIZE - sizeof(ib_port_info_t)); - - /* - Should never write back a value that is bigger then 3 in - the PortPhysicalState field, so cannot simply copy! - - Actually we want to write there: - port physical state - no change - link down default state = polling - port state - no change - */ - p_pi->state_info2 = 0x02; - ib_port_info_set_port_state(p_pi, IB_LINK_NO_CHANGE); - - if (ib_port_info_get_link_down_def_state(p_pi) != - ib_port_info_get_link_down_def_state(p_old_pi)) - send_set = TRUE; - - /* didn't get PortInfo before */ - if (!ib_port_info_get_port_state(p_old_pi)) - send_set = TRUE; - - p_pi->m_key = p_mgr->p_subn->opt.m_key; - if (memcmp(&p_pi->m_key, &p_old_pi->m_key, sizeof(p_pi->m_key))) - send_set = TRUE; - - p_pi->subnet_prefix = p_mgr->p_subn->opt.subnet_prefix; - if (memcmp(&p_pi->subnet_prefix, &p_old_pi->subnet_prefix, - sizeof(p_pi->subnet_prefix))) - send_set = TRUE; - - p_pi->base_lid = lid; - if (memcmp(&p_pi->base_lid, &p_old_pi->base_lid, - sizeof(p_pi->base_lid))) - send_set = TRUE; - - /* we are updating the ports with our local sm_base_lid */ - p_pi->master_sm_base_lid = p_mgr->p_subn->sm_base_lid; - if (memcmp(&p_pi->master_sm_base_lid, &p_old_pi->master_sm_base_lid, - sizeof(p_pi->master_sm_base_lid))) - send_set = TRUE; - - p_pi->m_key_lease_period = p_mgr->p_subn->opt.m_key_lease_period; - if (memcmp(&p_pi->m_key_lease_period, &p_old_pi->m_key_lease_period, - sizeof(p_pi->m_key_lease_period))) - send_set = TRUE; - - /* - we want to set the timeout for both the switch port 0 - and the CA ports - */ - ib_port_info_set_timeout(p_pi, p_mgr->p_subn->opt.subnet_timeout); - if (ib_port_info_get_timeout(p_pi) != - ib_port_info_get_timeout(p_old_pi)) - send_set = TRUE; - - if (port_num != 0) { - /* - CAs don't have a port 0, and for switch port 0, - the state bits are ignored. - This is not the switch management port - */ - p_pi->link_width_enabled = p_old_pi->link_width_supported; - if (memcmp(&p_pi->link_width_enabled, - &p_old_pi->link_width_enabled, - sizeof(p_pi->link_width_enabled))) - send_set = TRUE; - - /* M_KeyProtectBits are always zero */ - p_pi->mkey_lmc = p_mgr->p_subn->opt.lmc; - if (memcmp(&p_pi->mkey_lmc, &p_old_pi->mkey_lmc, - sizeof(p_pi->mkey_lmc))) - send_set = TRUE; - - /* calc new op_vls and mtu */ - op_vls = osm_physp_calc_link_op_vls(p_mgr->p_log, p_mgr->p_subn, - p_physp); - mtu = osm_physp_calc_link_mtu(p_mgr->p_log, p_physp); - - ib_port_info_set_neighbor_mtu(p_pi, mtu); - - if (ib_port_info_get_neighbor_mtu(p_pi) != - ib_port_info_get_neighbor_mtu(p_old_pi)) - send_set = TRUE; - - ib_port_info_set_op_vls(p_pi, op_vls); - if (ib_port_info_get_op_vls(p_pi) != - ib_port_info_get_op_vls(p_old_pi)) - send_set = TRUE; - - /* - Several timeout mechanisms: - */ - ib_port_info_set_phy_and_overrun_err_thd(p_pi, - p_mgr->p_subn->opt. - local_phy_errors_threshold, - p_mgr->p_subn->opt. - overrun_errors_threshold); - - if (memcmp(&p_pi->error_threshold, &p_old_pi->error_threshold, - sizeof(p_pi->error_threshold))) - send_set = TRUE; - - /* - To reset the port state machine we can send - PortInfo.State = DOWN. (see: 7.2.7 p171 lines:10-19) - */ - if (mtu != ib_port_info_get_neighbor_mtu(p_old_pi) || - op_vls != ib_port_info_get_op_vls(p_old_pi)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Sending Link Down to GUID 0x%016" - PRIx64 " port %d due to op_vls or " - "mtu change. MTU:%u,%u VL_CAP:%u,%u\n", - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - port_num, mtu, - ib_port_info_get_neighbor_mtu(p_old_pi), - op_vls, ib_port_info_get_op_vls(p_old_pi)); - - /* - we need to make sure the internal DB will follow the - fact that the remote port is also going through - "down" state into "init"... - */ - lid_mgr_set_remote_pi_state_to_init(p_mgr, p_physp); - - ib_port_info_set_port_state(p_pi, IB_LINK_DOWN); - if (ib_port_info_get_port_state(p_pi) != - ib_port_info_get_port_state(p_old_pi)) - send_set = TRUE; - } - } else { - /* - For Port 0, NeighborMTU is relevant only for Enh. SP0. - In this case, we'll set the MTU according to the mtu_cap - */ - ib_port_info_set_neighbor_mtu(p_pi, - ib_port_info_get_mtu_cap - (p_old_pi)); - if (ib_port_info_get_neighbor_mtu(p_pi) != - ib_port_info_get_neighbor_mtu(p_old_pi)) - send_set = TRUE; - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Updating neighbor_mtu on switch GUID 0x%016" PRIx64 - " port 0 to:%u\n", - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - ib_port_info_get_neighbor_mtu(p_pi)); - - /* Determine if enhanced switch port 0 and if so set LMC */ - if (osm_switch_sp0_is_lmc_capable(p_node->sw, p_mgr->p_subn)) { - /* M_KeyProtectBits are always zero */ - p_pi->mkey_lmc = p_mgr->p_subn->opt.lmc; - if (memcmp(&p_pi->mkey_lmc, &p_old_pi->mkey_lmc, - sizeof(p_pi->mkey_lmc))) - send_set = TRUE; - } - } - - context.pi_context.node_guid = osm_node_get_node_guid(p_node); - context.pi_context.port_guid = osm_physp_get_port_guid(p_physp); - context.pi_context.set_method = TRUE; - context.pi_context.light_sweep = FALSE; - context.pi_context.active_transition = FALSE; - - /* - We need to set the cli_rereg bit when we are in first_time_master_sweep - for ports supporting the ClientReregistration Vol1 (v1.2) p811 14.4.11 - Also, if this port was just now discovered, then we should also set - the cli_rereg bit. We know that the port was just discovered if its - is_new field is set. - */ - if ((p_mgr->p_subn->first_time_master_sweep == TRUE || p_port->is_new) - && !p_mgr->p_subn->opt.no_clients_rereg - && (p_old_pi->capability_mask & IB_PORT_CAP_HAS_CLIENT_REREG)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Setting client rereg on %s, port %d\n", - p_port->p_node->print_desc, p_port->p_physp->port_num); - ib_port_info_set_client_rereg(p_pi, 1); - send_set = TRUE; - } else - ib_port_info_set_client_rereg(p_pi, 0); - - /* We need to send the PortInfo Set request with the new sm_lid - in the following cases: - 1. There is a change in the values (send_set == TRUE) - 2. first_time_master_sweep flag on the subnet is TRUE. This means the - SM just became master, and it then needs to send a PortInfo Set to - every port. - */ - if (p_mgr->p_subn->first_time_master_sweep == TRUE) - send_set = TRUE; - - if (!send_set) - goto Exit; - - status = osm_req_set(p_mgr->sm, osm_physp_get_dr_path_ptr(p_physp), - payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO, - cl_hton32(osm_physp_get_port_num(p_physp)), - CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) - ret = -1; - -Exit: - OSM_LOG_EXIT(p_mgr->p_log); - return ret; -} - -/********************************************************************** - Processes our own node - Lock must already be held. -**********************************************************************/ -static int lid_mgr_process_our_sm_node(IN osm_lid_mgr_t * p_mgr) -{ - osm_port_t *p_port; - uint16_t min_lid_ho; - uint16_t max_lid_ho; - int ret; - - OSM_LOG_ENTER(p_mgr->p_log); - - /* - Acquire our own port object. - */ - p_port = osm_get_port_by_guid(p_mgr->p_subn, - p_mgr->p_subn->sm_port_guid); - if (!p_port) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 0308: " - "Can't acquire SM's port object, GUID 0x%016" PRIx64 - "\n", cl_ntoh64(p_mgr->p_subn->sm_port_guid)); - ret = -1; - goto Exit; - } - - /* - Determine the LID this SM will use for its own port. - Be careful. With an LMC > 0, the bottom of the LID range becomes - unusable, since port hardware will mask off least significant bits, - leaving a LID of 0 (invalid). Therefore, make sure that we always - configure the SM with a LID that has non-zero bits, even after - LMC masking by hardware. - */ - lid_mgr_get_port_lid(p_mgr, p_port, &min_lid_ho, &max_lid_ho); - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Current base LID is %u\n", min_lid_ho); - /* - Update subnet object. - */ - p_mgr->p_subn->master_sm_base_lid = cl_hton16(min_lid_ho); - p_mgr->p_subn->sm_base_lid = cl_hton16(min_lid_ho); - - OSM_LOG(p_mgr->p_log, OSM_LOG_VERBOSE, - "Assigning SM's port 0x%016" PRIx64 - "\n\t\t\t\tto LID range [%u,%u]\n", - cl_ntoh64(osm_port_get_guid(p_port)), min_lid_ho, max_lid_ho); - - /* - Set the PortInfo the Physical Port associated with this Port. - */ - ret = lid_mgr_set_physp_pi(p_mgr, p_port, p_port->p_physp, - cl_hton16(min_lid_ho)); - -Exit: - OSM_LOG_EXIT(p_mgr->p_log); - return ret; -} - -int osm_lid_mgr_process_sm(IN osm_lid_mgr_t * p_mgr) -{ - int ret; - - OSM_LOG_ENTER(p_mgr->p_log); - - CL_ASSERT(p_mgr->p_subn->sm_port_guid); - - CL_PLOCK_EXCL_ACQUIRE(p_mgr->p_lock); - - /* initialize the port_lid_tbl and empty ranges list following the - persistent db */ - lid_mgr_init_sweep(p_mgr); - - ret = lid_mgr_process_our_sm_node(p_mgr); - - CL_PLOCK_RELEASE(p_mgr->p_lock); - - OSM_LOG_EXIT(p_mgr->p_log); - return ret; -} - -/********************************************************************** - 1 go through all ports in the subnet. - 1.1 call lid_mgr_get_port_min_lid - 1.2 if a change is required send the port info - 2 if any change send the signal PENDING... -**********************************************************************/ -int osm_lid_mgr_process_subnet(IN osm_lid_mgr_t * p_mgr) -{ - cl_qmap_t *p_port_guid_tbl; - osm_port_t *p_port; - ib_net64_t port_guid; - int lid_changed, ret = 0; - uint16_t min_lid_ho, max_lid_ho; - - CL_ASSERT(p_mgr); - - OSM_LOG_ENTER(p_mgr->p_log); - - CL_PLOCK_EXCL_ACQUIRE(p_mgr->p_lock); - - CL_ASSERT(p_mgr->p_subn->sm_port_guid); - - p_port_guid_tbl = &p_mgr->p_subn->port_guid_tbl; - - for (p_port = (osm_port_t *) cl_qmap_head(p_port_guid_tbl); - p_port != (osm_port_t *) cl_qmap_end(p_port_guid_tbl); - p_port = (osm_port_t *) cl_qmap_next(&p_port->map_item)) { - port_guid = osm_port_get_guid(p_port); - - /* - Our own port is a special case in that we want to - assign a LID to ourselves first, since we have to - advertise that LID value to the other ports. - - For that reason, our node is treated separately and - we will not add it to any of these lists. - */ - if (port_guid == p_mgr->p_subn->sm_port_guid) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Skipping our own port 0x%016" PRIx64 "\n", - cl_ntoh64(port_guid)); - continue; - } - - /* - get the port lid range - we need to send it on first active - sweep or if there was a change (the result of - lid_mgr_get_port_lid) - */ - lid_changed = lid_mgr_get_port_lid(p_mgr, p_port, - &min_lid_ho, &max_lid_ho); - - /* we can call the function to update the port info as it known - to look for any field change and will only send an updated - if required */ - OSM_LOG(p_mgr->p_log, OSM_LOG_VERBOSE, - "Assigned port 0x%016" PRIx64 ", LID [%u,%u]\n", - cl_ntoh64(port_guid), min_lid_ho, max_lid_ho); - - /* the proc returns the fact it sent a set port info */ - if (lid_mgr_set_physp_pi(p_mgr, p_port, p_port->p_physp, - cl_hton16(min_lid_ho))) - ret = -1; - } /* all ports */ - - /* store the guid to lid table in persistent db */ - osm_db_store(p_mgr->p_g2l); - - CL_PLOCK_RELEASE(p_mgr->p_lock); - - OSM_LOG_EXIT(p_mgr->p_log); - return ret; -} diff --git a/branches/opensm_3/user/opensm/osm_lin_fwd_rcv.c b/branches/opensm_3/user/opensm/osm_lin_fwd_rcv.c deleted file mode 100644 index f2567d6e..00000000 --- a/branches/opensm_3/user/opensm/osm_lin_fwd_rcv.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_lft_rcv_t. - * This object represents the Linear Forwarding Table Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include - -void osm_lft_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_smp_t *p_smp; - uint32_t block_num; - osm_switch_t *p_sw; - osm_lft_context_t *p_lft_context; - uint8_t *p_block; - ib_net64_t node_guid; - ib_api_status_t status; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_block = ib_smp_get_payload_ptr(p_smp); - block_num = cl_ntoh32(p_smp->attr_mod); - - /* - Acquire the switch object for this switch. - */ - p_lft_context = osm_madw_get_lft_context_ptr(p_madw); - node_guid = p_lft_context->node_guid; - - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - p_sw = osm_get_switch_by_guid(sm->p_subn, node_guid); - - if (!p_sw) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0401: " - "LFT received for nonexistent node " - "0x%" PRIx64 "\n", cl_ntoh64(node_guid)); - } else { - status = osm_switch_set_lft_block(p_sw, p_block, block_num); - if (status != IB_SUCCESS) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0402: " - "Setting forwarding table block failed (%s)" - ", Switch 0x%" PRIx64 " %s\n", - ib_get_err_str(status), cl_ntoh64(node_guid), - p_sw->p_node->print_desc); - } - } - - CL_PLOCK_RELEASE(sm->p_lock); - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_link_mgr.c b/branches/opensm_3/user/opensm/osm_link_mgr.c deleted file mode 100644 index 75b44a3e..00000000 --- a/branches/opensm_3/user/opensm/osm_link_mgr.c +++ /dev/null @@ -1,474 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_link_mgr_t. - * This file implements the Link Manager object. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static uint8_t link_mgr_get_smsl(IN osm_sm_t * sm, IN osm_physp_t * p_physp) -{ - osm_opensm_t *p_osm = sm->p_subn->p_osm; - const osm_port_t *p_sm_port, *p_src_port; - ib_net16_t slid; - uint8_t sl; - - OSM_LOG_ENTER(sm->p_log); - - if (p_osm->routing_engine_used != OSM_ROUTING_ENGINE_TYPE_LASH - || !(slid = osm_physp_get_base_lid(p_physp))) { - /* Use default SL if lash routing is not used */ - OSM_LOG_EXIT(sm->p_log); - return sm->p_subn->opt.sm_sl; - } - - /* Find osm_port of the SM itself = dest_port */ - p_sm_port = osm_get_port_by_lid(sm->p_subn, sm->p_subn->sm_base_lid); - - /* Find osm_port of the source = p_physp */ - p_src_port = osm_get_port_by_lid(sm->p_subn, slid); - - /* Call lash to find proper SL */ - sl = osm_get_lash_sl(p_osm, p_src_port, p_sm_port); - - OSM_LOG_EXIT(sm->p_log); - return sl; -} - -static int link_mgr_set_physp_pi(osm_sm_t * sm, IN osm_physp_t * p_physp, - IN uint8_t port_state) -{ - uint8_t payload[IB_SMP_DATA_SIZE]; - ib_port_info_t *p_pi = (ib_port_info_t *) payload; - const ib_port_info_t *p_old_pi; - osm_madw_context_t context; - osm_node_t *p_node; - ib_api_status_t status; - uint8_t port_num, mtu, op_vls, smsl = OSM_DEFAULT_SL; - boolean_t esp0 = FALSE, send_set = FALSE; - osm_physp_t *p_remote_physp; - int ret = 0; - - OSM_LOG_ENTER(sm->p_log); - - p_node = osm_physp_get_node_ptr(p_physp); - - p_old_pi = &p_physp->port_info; - - port_num = osm_physp_get_port_num(p_physp); - - if (port_num == 0) { - /* - CAs don't have a port 0, and for switch port 0, - we need to check if this is enhanced or base port 0. - For base port 0 the following parameters are not valid - (IBA 1.2.1 p.830 table 146). - */ - if (!p_node->sw) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 4201: " - "Cannot find switch by guid: 0x%" PRIx64 "\n", - cl_ntoh64(p_node->node_info.node_guid)); - goto Exit; - } - - if (ib_switch_info_is_enhanced_port0(&p_node->sw->switch_info) - == FALSE) { - - /* Even for base port 0 we might have to set smsl - (if we are using lash routing) */ - smsl = link_mgr_get_smsl(sm, p_physp); - if (smsl != ib_port_info_get_master_smsl(p_old_pi)) { - send_set = TRUE; - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Setting SMSL to %d on port 0 GUID 0x%016" - PRIx64 "\n", smsl, - cl_ntoh64(osm_physp_get_port_guid - (p_physp))); - } else { - /* This means the switch doesn't support - enhanced port 0 and we don't need to - change SMSL. Can skip it. */ - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Skipping port 0, GUID 0x%016" PRIx64 - "\n", - cl_ntoh64(osm_physp_get_port_guid - (p_physp))); - goto Exit; - } - } else - esp0 = TRUE; - } - - memcpy(payload, p_old_pi, sizeof(ib_port_info_t)); - memset(payload + sizeof(ib_port_info_t), 0, - IB_SMP_DATA_SIZE - sizeof(ib_port_info_t)); - - /* - Should never write back a value that is bigger then 3 in - the PortPhysicalState field - so can not simply copy! - - Actually we want to write there: - port physical state - no change, - link down default state = polling - port state - as requested. - */ - p_pi->state_info2 = 0x02; - ib_port_info_set_port_state(p_pi, port_state); - - /* Check whether this is base port0 smsl handling only */ - if (port_num == 0 && esp0 == FALSE) { - ib_port_info_set_master_smsl(p_pi, smsl); - goto Send; - } - - /* - PAST THIS POINT WE ARE HANDLING EITHER A NON PORT 0 OR ENHANCED PORT 0 - */ - - if (ib_port_info_get_link_down_def_state(p_pi) != - ib_port_info_get_link_down_def_state(p_old_pi)) - send_set = TRUE; - - /* didn't get PortInfo before */ - if (!ib_port_info_get_port_state(p_old_pi)) - send_set = TRUE; - - /* we only change port fields if we do not change state */ - if (port_state == IB_LINK_NO_CHANGE) { - /* The following fields are relevant only for CA port, router, or Enh. SP0 */ - if (osm_node_get_type(p_node) != IB_NODE_TYPE_SWITCH || - port_num == 0) { - p_pi->m_key = sm->p_subn->opt.m_key; - if (memcmp(&p_pi->m_key, &p_old_pi->m_key, - sizeof(p_pi->m_key))) - send_set = TRUE; - - p_pi->subnet_prefix = sm->p_subn->opt.subnet_prefix; - if (memcmp(&p_pi->subnet_prefix, - &p_old_pi->subnet_prefix, - sizeof(p_pi->subnet_prefix))) - send_set = TRUE; - - p_pi->base_lid = osm_physp_get_base_lid(p_physp); - if (memcmp(&p_pi->base_lid, &p_old_pi->base_lid, - sizeof(p_pi->base_lid))) - send_set = TRUE; - - /* we are initializing the ports with our local sm_base_lid */ - p_pi->master_sm_base_lid = sm->p_subn->sm_base_lid; - if (memcmp(&p_pi->master_sm_base_lid, - &p_old_pi->master_sm_base_lid, - sizeof(p_pi->master_sm_base_lid))) - send_set = TRUE; - - smsl = link_mgr_get_smsl(sm, p_physp); - if (smsl != ib_port_info_get_master_smsl(p_old_pi)) { - - ib_port_info_set_master_smsl(p_pi, smsl); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Setting SMSL to %d on GUID 0x%016" - PRIx64 ", port %d\n", smsl, - cl_ntoh64(osm_physp_get_port_guid - (p_physp)), port_num); - - send_set = TRUE; - } - - p_pi->m_key_lease_period = - sm->p_subn->opt.m_key_lease_period; - if (memcmp(&p_pi->m_key_lease_period, - &p_old_pi->m_key_lease_period, - sizeof(p_pi->m_key_lease_period))) - send_set = TRUE; - - if (esp0 == FALSE) - p_pi->mkey_lmc = sm->p_subn->opt.lmc; - else { - if (sm->p_subn->opt.lmc_esp0) - p_pi->mkey_lmc = sm->p_subn->opt.lmc; - else - p_pi->mkey_lmc = 0; - } - if (memcmp(&p_pi->mkey_lmc, &p_old_pi->mkey_lmc, - sizeof(p_pi->mkey_lmc))) - send_set = TRUE; - - ib_port_info_set_timeout(p_pi, - sm->p_subn->opt. - subnet_timeout); - if (ib_port_info_get_timeout(p_pi) != - ib_port_info_get_timeout(p_old_pi)) - send_set = TRUE; - } - - /* - Several timeout mechanisms: - */ - p_remote_physp = osm_physp_get_remote(p_physp); - if (port_num != 0 && p_remote_physp) { - if (osm_node_get_type(osm_physp_get_node_ptr(p_physp)) - == IB_NODE_TYPE_ROUTER) { - ib_port_info_set_hoq_lifetime(p_pi, - sm->p_subn-> - opt. - leaf_head_of_queue_lifetime); - } else - if (osm_node_get_type - (osm_physp_get_node_ptr(p_physp)) == - IB_NODE_TYPE_SWITCH) { - /* Is remote end CA or router (a leaf port) ? */ - if (osm_node_get_type - (osm_physp_get_node_ptr(p_remote_physp)) != - IB_NODE_TYPE_SWITCH) { - ib_port_info_set_hoq_lifetime(p_pi, - sm-> - p_subn-> - opt. - leaf_head_of_queue_lifetime); - ib_port_info_set_vl_stall_count(p_pi, - sm-> - p_subn-> - opt. - leaf_vl_stall_count); - } else { - ib_port_info_set_hoq_lifetime(p_pi, - sm-> - p_subn-> - opt. - head_of_queue_lifetime); - ib_port_info_set_vl_stall_count(p_pi, - sm-> - p_subn-> - opt. - vl_stall_count); - } - } - if (ib_port_info_get_hoq_lifetime(p_pi) != - ib_port_info_get_hoq_lifetime(p_old_pi) || - ib_port_info_get_vl_stall_count(p_pi) != - ib_port_info_get_vl_stall_count(p_old_pi)) - send_set = TRUE; - } - - ib_port_info_set_phy_and_overrun_err_thd(p_pi, - sm->p_subn->opt. - local_phy_errors_threshold, - sm->p_subn->opt. - overrun_errors_threshold); - if (memcmp(&p_pi->error_threshold, &p_old_pi->error_threshold, - sizeof(p_pi->error_threshold))) - send_set = TRUE; - - /* - Set the easy common parameters for all port types, - then determine the neighbor MTU. - */ - p_pi->link_width_enabled = p_old_pi->link_width_supported; - if (memcmp(&p_pi->link_width_enabled, - &p_old_pi->link_width_enabled, - sizeof(p_pi->link_width_enabled))) - send_set = TRUE; - - if (sm->p_subn->opt.force_link_speed && - (sm->p_subn->opt.force_link_speed != 15 || - ib_port_info_get_link_speed_enabled(p_pi) != - ib_port_info_get_link_speed_sup(p_pi))) { - ib_port_info_set_link_speed_enabled(p_pi, - sm->p_subn->opt. - force_link_speed); - if (memcmp(&p_pi->link_speed, &p_old_pi->link_speed, - sizeof(p_pi->link_speed))) - send_set = TRUE; - } - - /* calc new op_vls and mtu */ - op_vls = - osm_physp_calc_link_op_vls(sm->p_log, sm->p_subn, p_physp); - mtu = osm_physp_calc_link_mtu(sm->p_log, p_physp); - - ib_port_info_set_neighbor_mtu(p_pi, mtu); - if (ib_port_info_get_neighbor_mtu(p_pi) != - ib_port_info_get_neighbor_mtu(p_old_pi)) - send_set = TRUE; - - ib_port_info_set_op_vls(p_pi, op_vls); - if (ib_port_info_get_op_vls(p_pi) != - ib_port_info_get_op_vls(p_old_pi)) - send_set = TRUE; - - /* provide the vl_high_limit from the qos mgr */ - if (sm->p_subn->opt.qos && - p_physp->vl_high_limit != p_old_pi->vl_high_limit) { - send_set = TRUE; - p_pi->vl_high_limit = p_physp->vl_high_limit; - } - } - -Send: - if (port_state != IB_LINK_NO_CHANGE && - port_state != ib_port_info_get_port_state(p_old_pi)) { - send_set = TRUE; - if (port_state == IB_LINK_ACTIVE) - context.pi_context.active_transition = TRUE; - else - context.pi_context.active_transition = FALSE; - } - - context.pi_context.node_guid = osm_node_get_node_guid(p_node); - context.pi_context.port_guid = osm_physp_get_port_guid(p_physp); - context.pi_context.set_method = TRUE; - context.pi_context.light_sweep = FALSE; - - /* We need to send the PortInfoSet request with the new sm_lid - in the following cases: - 1. There is a change in the values (send_set == TRUE) - 2. This is a switch external port (so it wasn't handled yet by - osm_lid_mgr) and first_time_master_sweep flag on the subnet is TRUE, - which means the SM just became master, and it then needs to send at - PortInfoSet to every port. - */ - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH && port_num - && sm->p_subn->first_time_master_sweep == TRUE) - send_set = TRUE; - - if (!send_set) - goto Exit; - - status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p_physp), - payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO, - cl_hton32(port_num), CL_DISP_MSGID_NONE, &context); - if (status) - ret = -1; - -Exit: - OSM_LOG_EXIT(sm->p_log); - return ret; -} - -static int link_mgr_process_node(osm_sm_t * sm, IN osm_node_t * p_node, - IN const uint8_t link_state) -{ - osm_physp_t *p_physp; - uint32_t i, num_physp; - int ret = 0; - uint8_t current_state; - - OSM_LOG_ENTER(sm->p_log); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Node 0x%" PRIx64 " going to %s\n", - cl_ntoh64(osm_node_get_node_guid(p_node)), - ib_get_port_state_str(link_state)); - - /* - Set the PortInfo for every Physical Port associated - with this Port. Start iterating with port 1, since the linkstate - is not applicable to the management port on switches. - */ - num_physp = osm_node_get_num_physp(p_node); - for (i = 0; i < num_physp; i++) { - /* - Don't bother doing anything if this Physical Port is not valid. - or if the state of the port is already better then the - specified state. - */ - p_physp = osm_node_get_physp_ptr(p_node, (uint8_t) i); - if (!p_physp) - continue; - - current_state = osm_physp_get_port_state(p_physp); - if (current_state == IB_LINK_DOWN) - continue; - - /* - Normally we only send state update if state is lower - then required state. However, we need to send update if - no state change required. - */ - if (link_state != IB_LINK_NO_CHANGE && - link_state <= current_state) - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Physical port %u already %s. Skipping\n", - p_physp->port_num, - ib_get_port_state_str(current_state)); - else if (link_mgr_set_physp_pi(sm, p_physp, link_state)) - ret = -1; - } - - OSM_LOG_EXIT(sm->p_log); - return ret; -} - -int osm_link_mgr_process(osm_sm_t * sm, IN const uint8_t link_state) -{ - cl_qmap_t *p_node_guid_tbl; - osm_node_t *p_node; - int ret = 0; - - OSM_LOG_ENTER(sm->p_log); - - p_node_guid_tbl = &sm->p_subn->node_guid_tbl; - - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - - for (p_node = (osm_node_t *) cl_qmap_head(p_node_guid_tbl); - p_node != (osm_node_t *) cl_qmap_end(p_node_guid_tbl); - p_node = (osm_node_t *) cl_qmap_next(&p_node->map_item)) - if (link_mgr_process_node(sm, p_node, link_state)) - ret = -1; - - CL_PLOCK_RELEASE(sm->p_lock); - - OSM_LOG_EXIT(sm->p_log); - return ret; -} diff --git a/branches/opensm_3/user/opensm/osm_log.c b/branches/opensm_3/user/opensm/osm_log.c deleted file mode 100644 index d67a0b58..00000000 --- a/branches/opensm_3/user/opensm/osm_log.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_log_t. - * This object represents the log file. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include - -static int log_exit_count = 0; - -#ifndef __WIN__ -#include -#include -#include - -static char *month_str[] = { - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" -}; -#else -void OsmReportState(IN const char *p_str); -#endif /* ndef __WIN__ */ - -#ifndef __WIN__ - -static void truncate_log_file(osm_log_t * p_log) -{ - int fd = fileno(p_log->out_port); - if (ftruncate(fd, 0) < 0) - fprintf(stderr, "truncate_log_file: cannot truncate: %s\n", - strerror(errno)); - if (lseek(fd, 0, SEEK_SET) < 0) - fprintf(stderr, "truncate_log_file: cannot rewind: %s\n", - strerror(errno)); - p_log->count = 0; -} - -#else /* Windows */ - -static void truncate_log_file(osm_log_t * p_log) -{ - int fd = _fileno(p_log->out_port); - HANDLE hFile = (HANDLE) _get_osfhandle(fd); - - if (_lseek(fd, 0, SEEK_SET) < 0) - fprintf(stderr, "truncate_log_file: cannot rewind: %s\n", - strerror(errno)); - SetEndOfFile(hFile); - p_log->count = 0; -} -#endif /* ndef __WIN__ */ - -void osm_log(IN osm_log_t * p_log, IN osm_log_level_t verbosity, - IN const char *p_str, ...) -{ - char buffer[LOG_ENTRY_SIZE_MAX]; - va_list args; - int ret; -#ifdef __WIN__ - SYSTEMTIME st; - uint32_t pid = GetCurrentThreadId(); -#else - pid_t pid = 0; - time_t tim; - struct tm result; - uint64_t time_usecs; - uint32_t usecs; -#endif /* __WIN__ */ - - /* If this is a call to syslog - always print it */ - if (!(verbosity & p_log->level)) - return; - - va_start(args, p_str); -#ifndef __WIN__ - if (p_log->log_prefix == NULL) - vsprintf(buffer, p_str, args); - else { - int n = snprintf(buffer, sizeof(buffer), "%s: ", p_log->log_prefix); - vsprintf(buffer + n, p_str, args); - } -#else - if (p_log->log_prefix == NULL) - _vsnprintf(buffer, sizeof(buffer), (LPSTR)p_str, args); - else { - int n = snprintf(buffer, sizeof(buffer), "%s: ", p_log->log_prefix); - _vsnprintf(buffer + n, (sizeof(buffer) - n), (LPSTR)p_str, args); - } -#endif - va_end(args); - - /* this is a call to the syslog */ - if (verbosity & OSM_LOG_SYS) { - syslog(LOG_INFO, "%s\n", buffer); - - /* SYSLOG should go to stdout too */ - if (p_log->out_port != stdout) { - printf("%s\n", buffer); - fflush(stdout); - } -#ifdef __WIN__ - OsmReportState(buffer); -#endif /* __WIN__ */ - } - - /* regular log to default out_port */ - cl_spinlock_acquire(&p_log->lock); - - if (p_log->max_size && p_log->count > p_log->max_size) { - /* truncate here */ - fprintf(stderr, - "osm_log: log file exceeds the limit %lu. Truncating.\n", - p_log->max_size); - truncate_log_file(p_log); - } -#ifdef __WIN__ - GetLocalTime(&st); -_retry: - ret = - fprintf(p_log->out_port, - "[%02d:%02d:%02d:%03d][%04X] 0x%02x -> %s", - st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, - pid, verbosity, buffer); -#else - time_usecs = cl_get_time_stamp(); - tim = time_usecs / 1000000; - usecs = time_usecs % 1000000; - localtime_r(&tim, &result); - pid = pthread_self(); -_retry: - ret = - fprintf(p_log->out_port, - "%s %02d %02d:%02d:%02d %06d [%04X] 0x%02x -> %s", - (result.tm_mon < - 12 ? month_str[result.tm_mon] : "???"), - result.tm_mday, result.tm_hour, result.tm_min, - result.tm_sec, usecs, pid, verbosity, buffer); -#endif - - /* flush log */ - if (ret > 0 && - (p_log->flush || (verbosity & (OSM_LOG_ERROR | OSM_LOG_SYS))) - && fflush(p_log->out_port) < 0) - ret = -1; - - if (ret >= 0) { - log_exit_count = 0; - p_log->count += ret; - } else if (log_exit_count < 3) { - log_exit_count++; - if (errno == ENOSPC && p_log->max_size) { - fprintf(stderr, - "osm_log: write failed: %s. Truncating log file.\n", - strerror(errno)); - truncate_log_file(p_log); - goto _retry; - } - fprintf(stderr, "osm_log: write failed: %s\n", strerror(errno)); - } - - cl_spinlock_release(&p_log->lock); -} - -void osm_log_raw(IN osm_log_t * p_log, IN osm_log_level_t verbosity, - IN const char *p_buf) -{ - if (p_log->level & verbosity) { - cl_spinlock_acquire(&p_log->lock); - printf("%s", p_buf); - cl_spinlock_release(&p_log->lock); - - /* - Flush log on errors too. - */ - if (p_log->flush || (verbosity & OSM_LOG_ERROR)) - fflush(stdout); - } -} - -void osm_log_msg_box(IN osm_log_t * log, osm_log_level_t level, - const char *func_name, const char *msg) -{ -#define MSG_BOX_LENGTH 66 - char buf[MSG_BOX_LENGTH + 1]; - int i, n; - - if (!osm_log_is_active(log, level)) - return; - - n = (MSG_BOX_LENGTH - strlen(msg)) / 2 - 1; - if (n < 0) - n = 0; - for (i = 0; i < n; i++) - sprintf(buf + i, "*"); - n += snprintf(buf + n, sizeof(buf) - n, " %s ", msg); - for (i = n; i < MSG_BOX_LENGTH; i++) - buf[i] = '*'; - buf[i] = '\0'; - - osm_log(log, level, "%s:\n\n\n" - "*********************************************" - "*********************\n%s\n" - "*********************************************" - "*********************\n\n\n", func_name, buf); -} - -boolean_t osm_is_debug(void) -{ -#if defined( _DEBUG_ ) - return TRUE; -#else - return FALSE; -#endif /* defined( _DEBUG_ ) */ -} - -static int open_out_port(IN osm_log_t * p_log) -{ - struct stat st; - - if (p_log->accum_log_file) - p_log->out_port = fopen(p_log->log_file_name, "a+"); - else - p_log->out_port = fopen(p_log->log_file_name, "w+"); - - if (!p_log->out_port) { - syslog(LOG_CRIT, "Cannot open file \'%s\' for %s: %s\n", - p_log->log_file_name, - p_log->accum_log_file ? "appending" : "writing", - strerror(errno)); - fprintf(stderr, "Cannot open file \'%s\': %s\n", - p_log->log_file_name, strerror(errno)); - return -1; - } - - if (fstat(fileno(p_log->out_port), &st) == 0) - p_log->count = st.st_size; - - syslog(LOG_NOTICE, "%s log file opened\n", p_log->log_file_name); - - if (p_log->daemon) { - dup2(fileno(p_log->out_port), 0); - dup2(fileno(p_log->out_port), 1); - dup2(fileno(p_log->out_port), 2); - } - - return 0; -} - -int osm_log_reopen_file(osm_log_t * p_log) -{ - int ret; - - if (p_log->out_port == stdout || p_log->out_port == stderr) - return 0; - cl_spinlock_acquire(&p_log->lock); - fclose(p_log->out_port); - ret = open_out_port(p_log); - cl_spinlock_release(&p_log->lock); - return ret; -} - -ib_api_status_t osm_log_init_v2(IN osm_log_t * p_log, IN boolean_t flush, - IN uint8_t log_flags, IN const char *log_file, - IN unsigned long max_size, - IN boolean_t accum_log_file) -{ - p_log->level = log_flags | OSM_LOG_SYS; - p_log->flush = flush; - p_log->count = 0; - p_log->max_size = max_size << 20; /* convert size in MB to bytes */ - p_log->accum_log_file = accum_log_file; - p_log->log_file_name = (char *)log_file; - - openlog("OpenSM", LOG_CONS | LOG_PID, LOG_USER); - - if (log_file == NULL || !strcmp(log_file, "-") || - !strcmp(log_file, "stdout")) - p_log->out_port = stdout; - else if (!strcmp(log_file, "stderr")) - p_log->out_port = stderr; - else if (open_out_port(p_log)) - return IB_ERROR; - - if (cl_spinlock_init(&p_log->lock) == CL_SUCCESS) - return IB_SUCCESS; - else - return IB_ERROR; -} - -ib_api_status_t osm_log_init(IN osm_log_t * p_log, IN boolean_t flush, - IN uint8_t log_flags, IN const char *log_file, - IN boolean_t accum_log_file) -{ - return osm_log_init_v2(p_log, flush, log_flags, log_file, 0, - accum_log_file); -} diff --git a/branches/opensm_3/user/opensm/osm_mad_pool.c b/branches/opensm_3/user/opensm/osm_mad_pool.c deleted file mode 100644 index 62dff416..00000000 --- a/branches/opensm_3/user/opensm/osm_mad_pool.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_mad_pool_t. - * This object represents a pool of management datagram (MAD) objects. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include - -void osm_mad_pool_construct(IN osm_mad_pool_t * p_pool) -{ - CL_ASSERT(p_pool); - - memset(p_pool, 0, sizeof(*p_pool)); -} - -void osm_mad_pool_destroy(IN osm_mad_pool_t * p_pool) -{ - CL_ASSERT(p_pool); -} - -ib_api_status_t osm_mad_pool_init(IN osm_mad_pool_t * p_pool) -{ - p_pool->mads_out = 0; - - return IB_SUCCESS; -} - -osm_madw_t *osm_mad_pool_get(IN osm_mad_pool_t * p_pool, - IN osm_bind_handle_t h_bind, - IN uint32_t total_size, - IN const osm_mad_addr_t * p_mad_addr) -{ - osm_madw_t *p_madw; - ib_mad_t *p_mad; - - CL_ASSERT(h_bind != OSM_BIND_INVALID_HANDLE); - CL_ASSERT(total_size); - - /* - First, acquire a mad wrapper from the mad wrapper pool. - */ - p_madw = malloc(sizeof(*p_madw)); - if (p_madw == NULL) - goto Exit; - - osm_madw_init(p_madw, h_bind, total_size, p_mad_addr); - - /* - Next, acquire a wire mad of the specified size. - */ - p_mad = osm_vendor_get(h_bind, total_size, &p_madw->vend_wrap); - if (p_mad == NULL) { - /* Don't leak wrappers! */ - free(p_madw); - p_madw = NULL; - goto Exit; - } - - cl_atomic_inc(&p_pool->mads_out); - /* - Finally, attach the wire MAD to this wrapper. - */ - osm_madw_set_mad(p_madw, p_mad); - -Exit: - return p_madw; -} - -osm_madw_t *osm_mad_pool_get_wrapper(IN osm_mad_pool_t * p_pool, - IN osm_bind_handle_t h_bind, - IN uint32_t total_size, - IN const ib_mad_t * p_mad, - IN const osm_mad_addr_t * p_mad_addr) -{ - osm_madw_t *p_madw; - - CL_ASSERT(h_bind != OSM_BIND_INVALID_HANDLE); - CL_ASSERT(total_size); - CL_ASSERT(p_mad); - - /* - First, acquire a mad wrapper from the mad wrapper pool. - */ - p_madw = malloc(sizeof(*p_madw)); - if (p_madw == NULL) - goto Exit; - - /* - Finally, initialize the wrapper object. - */ - cl_atomic_inc(&p_pool->mads_out); - osm_madw_init(p_madw, h_bind, total_size, p_mad_addr); - osm_madw_set_mad(p_madw, p_mad); - -Exit: - return p_madw; -} - -osm_madw_t *osm_mad_pool_get_wrapper_raw(IN osm_mad_pool_t * p_pool) -{ - osm_madw_t *p_madw; - - p_madw = malloc(sizeof(*p_madw)); - if (!p_madw) - return NULL; - - osm_madw_init(p_madw, 0, 0, 0); - osm_madw_set_mad(p_madw, 0); - cl_atomic_inc(&p_pool->mads_out); - - return p_madw; -} - -void osm_mad_pool_put(IN osm_mad_pool_t * p_pool, IN osm_madw_t * p_madw) -{ - CL_ASSERT(p_madw); - - /* - First, return the wire mad to the pool - */ - if (p_madw->p_mad) - osm_vendor_put(p_madw->h_bind, &p_madw->vend_wrap); - - /* - Return the mad wrapper to the wrapper pool - */ - free(p_madw); - cl_atomic_dec(&p_pool->mads_out); -} diff --git a/branches/opensm_3/user/opensm/osm_mcast_fwd_rcv.c b/branches/opensm_3/user/opensm/osm_mcast_fwd_rcv.c deleted file mode 100644 index 4e053323..00000000 --- a/branches/opensm_3/user/opensm/osm_mcast_fwd_rcv.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_mft_rcv_t. - * This object represents the Multicast Forwarding Table Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void osm_mft_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_smp_t *p_smp; - uint32_t block_num; - uint8_t position; - osm_switch_t *p_sw; - osm_mft_context_t *p_mft_context; - uint16_t *p_block; - ib_net64_t node_guid; - ib_api_status_t status; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_block = ib_smp_get_payload_ptr(p_smp); - block_num = cl_ntoh32(p_smp->attr_mod) & IB_MCAST_BLOCK_ID_MASK_HO; - position = (uint8_t) ((cl_ntoh32(p_smp->attr_mod) & - IB_MCAST_POSITION_MASK_HO) >> - IB_MCAST_POSITION_SHIFT); - - /* - Acquire the switch object for this switch. - */ - p_mft_context = osm_madw_get_mft_context_ptr(p_madw); - node_guid = p_mft_context->node_guid; - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Setting MFT block %u, position %u, " - "Switch 0x%016" PRIx64 ", TID 0x%" PRIx64 "\n", - block_num, position, cl_ntoh64(node_guid), - cl_ntoh64(p_smp->trans_id)); - - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - p_sw = osm_get_switch_by_guid(sm->p_subn, node_guid); - - if (!p_sw) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0801: " - "MFT received for nonexistent node " - "0x%016" PRIx64 "\n", cl_ntoh64(node_guid)); - } else { - status = osm_switch_set_mft_block(p_sw, p_block, - (uint16_t) block_num, - position); - if (status != IB_SUCCESS) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0802: " - "Setting MFT block failed (%s)" - ", Switch 0x%016" PRIx64 - " (%s), block %u, position %u\n", - ib_get_err_str(status), cl_ntoh64(node_guid), - p_sw->p_node->print_desc, block_num, position); - } - } - - CL_PLOCK_RELEASE(sm->p_lock); - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_mcast_mgr.c b/branches/opensm_3/user/opensm/osm_mcast_mgr.c deleted file mode 100644 index 32da52f5..00000000 --- a/branches/opensm_3/user/opensm/osm_mcast_mgr.c +++ /dev/null @@ -1,1171 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_mcast_mgr_t. - * This file implements the Multicast Manager object. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_mcast_work_obj { - cl_list_item_t list_item; - osm_port_t *p_port; - cl_map_item_t map_item; -} osm_mcast_work_obj_t; - -static osm_mcast_work_obj_t *mcast_work_obj_new(IN osm_port_t * p_port) -{ - osm_mcast_work_obj_t *p_obj; - - /* - clean allocated memory to avoid assertion when trying to insert to - qlist. - see cl_qlist_insert_tail(): CL_ASSERT(p_list_item->p_list != p_list) - */ - p_obj = malloc(sizeof(*p_obj)); - if (p_obj) { - memset(p_obj, 0, sizeof(*p_obj)); - p_obj->p_port = p_port; - } - - return p_obj; -} - -static void mcast_work_obj_delete(IN osm_mcast_work_obj_t * p_wobj) -{ - free(p_wobj); -} - -static int make_port_list(cl_qlist_t * list, osm_mgrp_box_t * mbox) -{ - cl_qmap_t map; - cl_map_item_t *map_item; - cl_list_item_t *list_item; - osm_mgrp_t *mgrp=NULL; - osm_mcm_port_t *mcm_port=NULL; - osm_mcast_work_obj_t *wobj; - - cl_qmap_init(&map); - cl_qlist_init(list); - - for (list_item = cl_qlist_head(&mbox->mgrp_list); - list_item != cl_qlist_end(&mbox->mgrp_list); - list_item = cl_qlist_next(list_item)) { - mgrp = cl_item_obj(list_item, mgrp, list_item); - for (map_item = cl_qmap_head(&mgrp->mcm_port_tbl); - map_item != cl_qmap_end(&mgrp->mcm_port_tbl); - map_item = cl_qmap_next(map_item)) { - /* Acquire the port object for this port guid, then - create the new worker object to build the list. */ - mcm_port = cl_item_obj(map_item, mcm_port, map_item); - if (cl_qmap_get(&map, mcm_port->port->guid) != - cl_qmap_end(&map)) - continue; - wobj = mcast_work_obj_new(mcm_port->port); - if (!wobj) - return -1; - cl_qlist_insert_tail(list, &wobj->list_item); - cl_qmap_insert(&map, mcm_port->port->guid, - &wobj->map_item); - } - } - return 0; -} - -static void drop_port_list(cl_qlist_t * list) -{ - while (cl_qlist_count(list)) - mcast_work_obj_delete((osm_mcast_work_obj_t *) - cl_qlist_remove_head(list)); -} - -/********************************************************************** - Recursively remove nodes from the tree - *********************************************************************/ -static void mcast_mgr_purge_tree_node(IN osm_mtree_node_t * p_mtn) -{ - uint8_t i; - - for (i = 0; i < p_mtn->max_children; i++) { - if (p_mtn->child_array[i] && - (p_mtn->child_array[i] != OSM_MTREE_LEAF)) - mcast_mgr_purge_tree_node(p_mtn->child_array[i]); - p_mtn->child_array[i] = NULL; - } - - free(p_mtn); -} - -static void mcast_mgr_purge_tree(osm_sm_t * sm, IN osm_mgrp_box_t * mbox) -{ - OSM_LOG_ENTER(sm->p_log); - - if (mbox->root) - mcast_mgr_purge_tree_node(mbox->root); - mbox->root = NULL; - - OSM_LOG_EXIT(sm->p_log); -} - -static void create_mgrp_switch_map(cl_qmap_t * m, cl_qlist_t * port_list) -{ - osm_mcast_work_obj_t *wobj=NULL; - osm_port_t *port; - osm_switch_t *sw; - ib_net64_t guid; - cl_list_item_t *i; - - cl_qmap_init(m); - for (i = cl_qlist_head(port_list); i != cl_qlist_end(port_list); - i = cl_qlist_next(i)) { - wobj = cl_item_obj(i, wobj, list_item); - port = wobj->p_port; - if (port->p_node->sw) { - sw = port->p_node->sw; - sw->is_mc_member = 1; - } else { - sw = port->p_physp->p_remote_physp->p_node->sw; - sw->num_of_mcm++; - } - guid = osm_node_get_node_guid(sw->p_node); - if (cl_qmap_get(m, guid) == cl_qmap_end(m)) - cl_qmap_insert(m, guid, &sw->mgrp_item); - } -} - -static void destroy_mgrp_switch_map(cl_qmap_t * m) -{ - osm_switch_t *sw=NULL; - cl_map_item_t *i; - - for (i = cl_qmap_head(m); i != cl_qmap_end(m); i = cl_qmap_next(i)) { - sw = cl_item_obj(i, sw, mgrp_item); - sw->num_of_mcm = 0; - sw->is_mc_member = 0; - } - cl_qmap_remove_all(m); -} - -/********************************************************************** - Calculate the maximal "min hops" from the given switch to any - of the group HCAs - **********************************************************************/ -#ifdef OSM_VENDOR_INTF_ANAFA -static float mcast_mgr_compute_avg_hops(osm_sm_t * sm, cl_qmap_t * m, - const osm_switch_t * this_sw) -{ - float avg_hops = 0; - uint32_t hops = 0; - uint32_t num_ports = 0; - uint16_t lid; - uint32_t least_hops; - cl_map_item_t *i; - osm_switch_t *sw; - - OSM_LOG_ENTER(sm->p_log); - - for (i = cl_qmap_head(m); i != cl_qmap_end(m); i = cl_qmap_next(i)) { - sw = cl_item_obj(i, sw, mcast_item); - lid = cl_ntoh16(osm_node_get_base_lid(sw->p_node, 0)); - least_hops = osm_switch_get_least_hops(this_sw, lid); - /* for all host that are MC members and attached to the switch, - we should add the (least_hops + 1) * number_of_such_hosts. - If switch itself is in the MC, we should add the least_hops only */ - hops += (least_hops + 1) * sw->num_of_mcm + - least_hops * sw->is_mc_member; - num_ports += sw->num_of_mcm + sw->is_mc_member; - } - - /* We shouldn't be here if there aren't any ports in the group. */ - CL_ASSERT(num_ports); - - avg_hops = (float)(hops / num_ports); - - OSM_LOG_EXIT(sm->p_log); - return avg_hops; -} -#else -static float mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qmap_t * m, - const osm_switch_t * this_sw) -{ - uint32_t max_hops = 0, hops; - uint16_t lid; - cl_map_item_t *i; - osm_switch_t *sw=NULL; - - OSM_LOG_ENTER(sm->p_log); - - /* - For each member of the multicast group, compute the - number of hops to its base LID. - */ - for (i = cl_qmap_head(m); i != cl_qmap_end(m); i = cl_qmap_next(i)) { - sw = cl_item_obj(i, sw, mgrp_item); - lid = cl_ntoh16(osm_node_get_base_lid(sw->p_node, 0)); - hops = osm_switch_get_least_hops(this_sw, lid); - if (!sw->is_mc_member) - hops += 1; - if (hops > max_hops) - max_hops = hops; - } - - /* Note that at this point we might get (max_hops == 0), - which means that there's only one member in the mcast - group, and it's the current switch */ - - OSM_LOG_EXIT(sm->p_log); - return (float)max_hops; -} -#endif - -/********************************************************************** - This function attempts to locate the optimal switch for the - center of the spanning tree. The current algorithm chooses - a switch with the lowest average hop count to the members - of the multicast group. -**********************************************************************/ -static osm_switch_t *mcast_mgr_find_optimal_switch(osm_sm_t * sm, - cl_qlist_t * list) -{ - cl_qmap_t mgrp_sw_map; - cl_qmap_t *p_sw_tbl; - osm_switch_t *p_sw, *p_best_sw = NULL; - float hops = 0; - float best_hops = 10000; /* any big # will do */ - - OSM_LOG_ENTER(sm->p_log); - - p_sw_tbl = &sm->p_subn->sw_guid_tbl; - - create_mgrp_switch_map(&mgrp_sw_map, list); - for (p_sw = (osm_switch_t *) cl_qmap_head(p_sw_tbl); - p_sw != (osm_switch_t *) cl_qmap_end(p_sw_tbl); - p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item)) { - if (!osm_switch_supports_mcast(p_sw)) - continue; - -#ifdef OSM_VENDOR_INTF_ANAFA - hops = mcast_mgr_compute_avg_hops(sm, &mgrp_sw_map, p_sw); -#else - hops = mcast_mgr_compute_max_hops(sm, &mgrp_sw_map, p_sw); -#endif - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Switch 0x%016" PRIx64 ", hops = %f\n", - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node)), hops); - - if (hops < best_hops) { - p_best_sw = p_sw; - best_hops = hops; - } - } - - if (p_best_sw) - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Best switch is 0x%" PRIx64 " (%s), hops = %f\n", - cl_ntoh64(osm_node_get_node_guid(p_best_sw->p_node)), - p_best_sw->p_node->print_desc, best_hops); - else - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "No multicast capable switches detected\n"); - - destroy_mgrp_switch_map(&mgrp_sw_map); - OSM_LOG_EXIT(sm->p_log); - return p_best_sw; -} - -/********************************************************************** - This function returns the existing or optimal root switch for the tree. -**********************************************************************/ -static osm_switch_t *mcast_mgr_find_root_switch(osm_sm_t * sm, cl_qlist_t *list) -{ - osm_switch_t *p_sw = NULL; - - OSM_LOG_ENTER(sm->p_log); - - /* - We always look for the best multicast tree root switch. - Otherwise since we always start with a a single join - the root will be always on the first switch attached to it. - - Very bad ... - */ - p_sw = mcast_mgr_find_optimal_switch(sm, list); - - OSM_LOG_EXIT(sm->p_log); - return p_sw; -} - -static int mcast_mgr_set_mft_block(osm_sm_t * sm, IN osm_switch_t * p_sw, - uint32_t block_num, uint32_t position) -{ - osm_node_t *p_node; - osm_dr_path_t *p_path; - osm_madw_context_t context; - ib_api_status_t status; - uint32_t block_id_ho; - osm_mcast_tbl_t *p_tbl; - ib_net16_t block[IB_MCAST_BLOCK_SIZE]; - int ret = 0; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_sw); - - p_node = p_sw->p_node; - - CL_ASSERT(p_node); - - p_path = osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_node, 0)); - - /* - Send multicast forwarding table blocks to the switch - as long as the switch indicates it has blocks needing - configuration. - */ - - context.mft_context.node_guid = osm_node_get_node_guid(p_node); - context.mft_context.set_method = TRUE; - - p_tbl = osm_switch_get_mcast_tbl_ptr(p_sw); - - if (osm_mcast_tbl_get_block(p_tbl, (uint16_t) block_num, - (uint8_t) position, block)) { - block_id_ho = block_num + (position << 28); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Writing MFT block %u position %u to switch 0x%" PRIx64 - "\n", block_num, position, - cl_ntoh64(context.mft_context.node_guid)); - - status = osm_req_set(sm, p_path, (void *)block, sizeof(block), - IB_MAD_ATTR_MCAST_FWD_TBL, - cl_hton32(block_id_ho), CL_DISP_MSGID_NONE, - &context); - if (status != IB_SUCCESS) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A02: " - "Sending multicast fwd. tbl. block to %s failed (%s)\n", - p_node->print_desc, ib_get_err_str(status)); - ret = -1; - } - } - - OSM_LOG_EXIT(sm->p_log); - return ret; -} - -/********************************************************************** - This is part of the recursive function to compute the paths in the - spanning tree that emanate from this switch. On input, the p_list - contains the group members that must be routed from this switch. -**********************************************************************/ -static void mcast_mgr_subdivide(osm_sm_t * sm, uint16_t mlid_ho, - osm_switch_t * p_sw, cl_qlist_t * p_list, - cl_qlist_t * list_array, uint8_t array_size) -{ - uint8_t port_num; - boolean_t ignore_existing; - osm_mcast_work_obj_t *p_wobj; - - OSM_LOG_ENTER(sm->p_log); - - /* - For Multicast Groups, we don't want to count on previous - configurations - since we can easily generate a storm - by loops. - */ - ignore_existing = TRUE; - - /* - Subdivide the set of ports into non-overlapping subsets - that will be routed to other switches. - */ - while ((p_wobj = - (osm_mcast_work_obj_t *) cl_qlist_remove_head(p_list)) != - (osm_mcast_work_obj_t *) cl_qlist_end(p_list)) { - port_num = - osm_switch_recommend_mcast_path(p_sw, p_wobj->p_port, - mlid_ho, ignore_existing); - if (port_num == OSM_NO_PATH) { - /* - This typically occurs if the switch does not support - multicast and the multicast tree must branch at this - switch. - */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A03: " - "Error routing MLID 0x%X through switch 0x%" - PRIx64 " %s\n" - "\t\t\t\tNo multicast paths from this switch " - "for port with LID %u\n", mlid_ho, - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node)), - p_sw->p_node->print_desc, - cl_ntoh16(osm_port_get_base_lid - (p_wobj->p_port))); - mcast_work_obj_delete(p_wobj); - continue; - } - - if (port_num > array_size) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A04: " - "Error routing MLID 0x%X through switch 0x%" - PRIx64 " %s\n" - "\t\t\t\tNo multicast paths from this switch " - "to port with LID %u\n", mlid_ho, - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node)), - p_sw->p_node->print_desc, - cl_ntoh16(osm_port_get_base_lid - (p_wobj->p_port))); - mcast_work_obj_delete(p_wobj); - /* This is means OpenSM has a bug. */ - CL_ASSERT(FALSE); - continue; - } - - cl_qlist_insert_tail(&list_array[port_num], &p_wobj->list_item); - } - - OSM_LOG_EXIT(sm->p_log); -} - -static void mcast_mgr_purge_list(osm_sm_t * sm, cl_qlist_t * list) -{ - if (osm_log_is_active(sm->p_log, OSM_LOG_ERROR)) { - osm_mcast_work_obj_t *wobj=NULL; - cl_list_item_t *i; - for (i = cl_qlist_head(list); i != cl_qlist_end(list); - i = cl_qlist_next(i)) { - wobj = cl_item_obj(i, wobj, list_item); - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A06: " - "Unable to route for port 0x%" PRIx64 "\n", - osm_port_get_guid(wobj->p_port)); - } - } - drop_port_list(list); -} - -/********************************************************************** - This is the recursive function to compute the paths in the spanning - tree that emanate from this switch. On input, the p_list contains - the group members that must be routed from this switch. - - The function returns the newly created mtree node element. -**********************************************************************/ -static osm_mtree_node_t *mcast_mgr_branch(osm_sm_t * sm, uint16_t mlid_ho, - osm_switch_t * p_sw, - cl_qlist_t * p_list, uint8_t depth, - uint8_t upstream_port, - uint8_t * p_max_depth) -{ - uint8_t max_children; - osm_mtree_node_t *p_mtn = NULL; - cl_qlist_t *list_array = NULL; - uint8_t i; - ib_net64_t node_guid; - osm_mcast_work_obj_t *p_wobj; - cl_qlist_t *p_port_list; - size_t count; - osm_mcast_tbl_t *p_tbl; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_sw); - CL_ASSERT(p_list); - CL_ASSERT(p_max_depth); - - node_guid = osm_node_get_node_guid(p_sw->p_node); - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Routing MLID 0x%X through switch 0x%" PRIx64 - " %s, %u nodes at depth %u\n", - mlid_ho, cl_ntoh64(node_guid), p_sw->p_node->print_desc, - cl_qlist_count(p_list), depth); - - CL_ASSERT(cl_qlist_count(p_list) > 0); - - depth++; - - if (depth >= 64) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "Maximal hops number is reached for MLID 0x%x." - " Break processing.", mlid_ho); - mcast_mgr_purge_list(sm, p_list); - goto Exit; - } - - if (depth > *p_max_depth) { - CL_ASSERT(depth == *p_max_depth + 1); - *p_max_depth = depth; - } - - if (osm_switch_supports_mcast(p_sw) == FALSE) { - /* - This switch doesn't do multicast. Clean-up. - */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A14: " - "Switch 0x%" PRIx64 " %s does not support multicast\n", - cl_ntoh64(node_guid), p_sw->p_node->print_desc); - - /* - Deallocate all the work objects on this branch of the tree. - */ - mcast_mgr_purge_list(sm, p_list); - goto Exit; - } - - p_mtn = osm_mtree_node_new(p_sw); - if (p_mtn == NULL) { - /* - We are unable to continue routing down this - leg of the tree. Clean-up. - */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A15: " - "Insufficient memory to build multicast tree\n"); - - /* - Deallocate all the work objects on this branch of the tree. - */ - mcast_mgr_purge_list(sm, p_list); - goto Exit; - } - - max_children = osm_mtree_node_get_max_children(p_mtn); - - CL_ASSERT(max_children > 1); - - /* - Prepare an empty list for each port in the switch. - TO DO - this list array could probably be moved - inside the switch element to save on malloc thrashing. - */ - list_array = malloc(sizeof(cl_qlist_t) * max_children); - if (list_array == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A16: " - "Unable to allocate list array\n"); - mcast_mgr_purge_list(sm, p_list); - osm_mtree_destroy(p_mtn); - p_mtn = NULL; - goto Exit; - } - - memset(list_array, 0, sizeof(cl_qlist_t) * max_children); - - for (i = 0; i < max_children; i++) - cl_qlist_init(&list_array[i]); - - mcast_mgr_subdivide(sm, mlid_ho, p_sw, p_list, list_array, max_children); - - p_tbl = osm_switch_get_mcast_tbl_ptr(p_sw); - - /* - Add the upstream port to the forwarding table unless - we're at the root of the spanning tree. - */ - if (depth > 1) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Adding upstream port %u\n", upstream_port); - - CL_ASSERT(upstream_port); - osm_mcast_tbl_set(p_tbl, mlid_ho, upstream_port); - } - - /* - For each port that was allocated some routes, - recurse into this function to continue building the tree - if the node on the other end of that port is another switch. - Otherwise, the node is an endpoint, and we've found a leaf - of the tree. Mark leaves with our special pointer value. - */ - - for (i = 0; i < max_children; i++) { - const osm_physp_t *p_physp; - const osm_physp_t *p_remote_physp; - osm_node_t *p_node; - const osm_node_t *p_remote_node; - - p_port_list = &list_array[i]; - - count = cl_qlist_count(p_port_list); - - /* - There should be no children routed through the upstream port! - */ - CL_ASSERT(upstream_port == 0 || i != upstream_port || - (i == upstream_port && count == 0)); - - if (count == 0) - continue; /* No routes down this port. */ - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Routing %u destinations via switch port %u\n", - count, i); - - /* - This port routes frames for this mcast group. Therefore, - set the appropriate bit in the multicast forwarding - table for this switch. - */ - osm_mcast_tbl_set(p_tbl, mlid_ho, i); - if (i == 0) { - /* This means we are adding the switch to the MC group. - We do not need to continue looking at the remote - port, just needed to add the port to the table */ - CL_ASSERT(count == 1); - - p_wobj = (osm_mcast_work_obj_t *) - cl_qlist_remove_head(p_port_list); - mcast_work_obj_delete(p_wobj); - continue; - } - - p_node = p_sw->p_node; - p_remote_node = osm_node_get_remote_node(p_node, i, NULL); - if (!p_remote_node) - continue; - - if (osm_node_get_type(p_remote_node) == IB_NODE_TYPE_SWITCH) { - /* - Acquire a pointer to the remote switch then recurse. - */ - CL_ASSERT(p_remote_node->sw); - - p_physp = osm_node_get_physp_ptr(p_node, i); - CL_ASSERT(p_physp); - - p_remote_physp = osm_physp_get_remote(p_physp); - CL_ASSERT(p_remote_physp); - - p_mtn->child_array[i] = - mcast_mgr_branch(sm, mlid_ho, p_remote_node->sw, - p_port_list, depth, - osm_physp_get_port_num - (p_remote_physp), p_max_depth); - } else { - /* - The neighbor node is not a switch, so this - must be a leaf. - */ - CL_ASSERT(count == 1); - - p_mtn->child_array[i] = OSM_MTREE_LEAF; - p_wobj = (osm_mcast_work_obj_t *) - cl_qlist_remove_head(p_port_list); - - CL_ASSERT(cl_is_qlist_empty(p_port_list)); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Found leaf for port 0x%016" PRIx64 - " on switch port %u\n", - cl_ntoh64(osm_port_get_guid(p_wobj->p_port)), - i); - mcast_work_obj_delete(p_wobj); - } - } - - free(list_array); -Exit: - OSM_LOG_EXIT(sm->p_log); - return p_mtn; -} - -static ib_api_status_t mcast_mgr_build_spanning_tree(osm_sm_t * sm, - osm_mgrp_box_t * mbox) -{ - cl_qlist_t port_list; - uint32_t num_ports; - osm_switch_t *p_sw; - ib_api_status_t status = IB_SUCCESS; - uint8_t max_depth = 0; - - OSM_LOG_ENTER(sm->p_log); - - /* - TO DO - for now, just blow away the old tree. - In the future we'll need to construct the tree based - on multicast forwarding table information if the user wants to - preserve existing multicast routes. - */ - mcast_mgr_purge_tree(sm, mbox); - - /* build the first "subset" containing all member ports */ - if (make_port_list(&port_list, mbox)) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A10: " - "Insufficient memory to make port list\n"); - status = IB_ERROR; - goto Exit; - } - - num_ports = cl_qlist_count(&port_list); - if (num_ports == 0) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "MLID 0x%X has no members - nothing to do\n", - mbox->mlid); - goto Exit; - } - - /* - This function builds the single spanning tree recursively. - At each stage, the ports to be reached are divided into - non-overlapping subsets of member ports that can be reached through - a given switch port. Construction then moves down each - branch, and the process starts again with each branch computing - for its own subset of the member ports. - - The maximum recursion depth is at worst the maximum hop count in the - subnet, which is spec limited to 64. - */ - - /* - Locate the switch around which to create the spanning - tree for this multicast group. - */ - p_sw = mcast_mgr_find_root_switch(sm, &port_list); - if (p_sw == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A08: " - "Unable to locate a suitable switch for group 0x%X\n", - mbox->mlid); - drop_port_list(&port_list); - status = IB_ERROR; - goto Exit; - } - - mbox->root = mcast_mgr_branch(sm, mbox->mlid, p_sw, &port_list, 0, 0, - &max_depth); - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Configured MLID 0x%X for %u ports, max tree depth = %u\n", - mbox->mlid, num_ports, max_depth); -Exit: - OSM_LOG_EXIT(sm->p_log); - return status; -} - -#if 0 -/* unused */ -void osm_mcast_mgr_set_table(osm_sm_t * sm, IN const osm_mgrp_t * p_mgrp, - IN const osm_mtree_node_t * p_mtn) -{ - uint8_t i; - uint8_t max_children; - osm_mtree_node_t *p_child_mtn; - uint16_t mlid_ho; - osm_mcast_tbl_t *p_tbl; - osm_switch_t *p_sw; - - OSM_LOG_ENTER(sm->p_log); - - mlid_ho = cl_ntoh16(osm_mgrp_get_mlid(p_mgrp)); - p_sw = osm_mtree_node_get_switch_ptr(p_mtn); - - CL_ASSERT(p_sw); - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Configuring MLID 0x%X on switch 0x%" PRIx64 "\n", - mlid_ho, osm_node_get_node_guid(p_sw->p_node)); - - /* - For every child of this tree node, set the corresponding - bit in the switch's mcast table. - */ - p_tbl = osm_switch_get_mcast_tbl_ptr(p_sw); - max_children = osm_mtree_node_get_max_children(p_mtn); - - CL_ASSERT(max_children <= osm_switch_get_num_ports(p_sw)); - - osm_mcast_tbl_clear_mlid(p_tbl, mlid_ho); - - for (i = 0; i < max_children; i++) { - p_child_mtn = osm_mtree_node_get_child(p_mtn, i); - if (p_child_mtn == NULL) - continue; - - osm_mcast_tbl_set(p_tbl, mlid_ho, i); - } - - OSM_LOG_EXIT(sm->p_log); -} -#endif - -static void mcast_mgr_clear(osm_sm_t * sm, uint16_t mlid) -{ - osm_switch_t *p_sw; - cl_qmap_t *p_sw_tbl; - osm_mcast_tbl_t *p_mcast_tbl; - - OSM_LOG_ENTER(sm->p_log); - - /* Walk the switches and clear the routing entries for this MLID. */ - p_sw_tbl = &sm->p_subn->sw_guid_tbl; - p_sw = (osm_switch_t *) cl_qmap_head(p_sw_tbl); - while (p_sw != (osm_switch_t *) cl_qmap_end(p_sw_tbl)) { - p_mcast_tbl = osm_switch_get_mcast_tbl_ptr(p_sw); - osm_mcast_tbl_clear_mlid(p_mcast_tbl, mlid); - p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item); - } - - OSM_LOG_EXIT(sm->p_log); -} - -#if 0 -/* TO DO - make this real -- at least update spanning tree */ -/********************************************************************** - Lock must be held on entry. -**********************************************************************/ -ib_api_status_t osm_mcast_mgr_process_single(osm_sm_t * sm, - IN ib_net16_t const mlid, - IN ib_net64_t const port_guid, - IN uint8_t const join_state) -{ - uint8_t port_num; - uint16_t mlid_ho; - ib_net64_t sw_guid; - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_physp_t *p_remote_physp; - osm_node_t *p_remote_node; - osm_mcast_tbl_t *p_mcast_tbl; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(mlid); - CL_ASSERT(port_guid); - - mlid_ho = cl_ntoh16(mlid); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Attempting to add port 0x%" PRIx64 " to MLID 0x%X, " - "\n\t\t\t\tjoin state = 0x%X\n", - cl_ntoh64(port_guid), mlid_ho, join_state); - - /* - Acquire the Port object. - */ - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A01: " - "Unable to acquire port object for 0x%" PRIx64 "\n", - cl_ntoh64(port_guid)); - status = IB_ERROR; - goto Exit; - } - - p_physp = p_port->p_physp; - if (p_physp == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A05: " - "Unable to acquire phsyical port object for 0x%" PRIx64 - "\n", cl_ntoh64(port_guid)); - status = IB_ERROR; - goto Exit; - } - - p_remote_physp = osm_physp_get_remote(p_physp); - if (p_remote_physp == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A11: " - "Unable to acquire remote phsyical port object " - "for 0x%" PRIx64 "\n", cl_ntoh64(port_guid)); - status = IB_ERROR; - goto Exit; - } - - p_remote_node = osm_physp_get_node_ptr(p_remote_physp); - - CL_ASSERT(p_remote_node); - - sw_guid = osm_node_get_node_guid(p_remote_node); - - if (osm_node_get_type(p_remote_node) != IB_NODE_TYPE_SWITCH) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A22: " - "Remote node not a switch node 0x%" PRIx64 "\n", - cl_ntoh64(sw_guid)); - status = IB_ERROR; - goto Exit; - } - - if (!p_remote_node->sw) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A12: " - "No switch object 0x%" PRIx64 "\n", cl_ntoh64(sw_guid)); - status = IB_ERROR; - goto Exit; - } - - if (osm_switch_is_in_mcast_tree(p_remote_node->sw, mlid_ho)) { - /* - We're in luck. The switch attached to this port - is already in the multicast group, so we can just - add the specified port as a new leaf of the tree. - */ - if (join_state & (IB_JOIN_STATE_FULL | IB_JOIN_STATE_NON)) { - /* - This node wants to receive multicast frames. - Get the switch port number to which the new member port - is attached, then configure this single mcast table. - */ - port_num = osm_physp_get_port_num(p_remote_physp); - CL_ASSERT(port_num); - - p_mcast_tbl = - osm_switch_get_mcast_tbl_ptr(p_remote_node->sw); - osm_mcast_tbl_set(p_mcast_tbl, mlid_ho, port_num); - } else { - if (join_state & IB_JOIN_STATE_SEND_ONLY) - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Success. Nothing to do for send" - "only member\n"); - else { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A13: " - "Unknown join state 0x%X\n", - join_state); - status = IB_ERROR; - goto Exit; - } - } - } else - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Unable to add port\n"); - -Exit: - OSM_LOG_EXIT(sm->p_log); - return status; -} -#endif - -/********************************************************************** - Process the entire group. - NOTE : The lock should be held externally! - **********************************************************************/ -static ib_api_status_t mcast_mgr_process_mlid(osm_sm_t * sm, uint16_t mlid) -{ - ib_api_status_t status = IB_SUCCESS; - osm_mgrp_box_t *mbox; - - OSM_LOG_ENTER(sm->p_log); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Processing multicast group with lid 0x%X\n", mlid); - - /* Clear the multicast tables to start clean, then build - the spanning tree which sets the mcast table bits for each - port in the group. */ - mcast_mgr_clear(sm, mlid); - - mbox = osm_get_mbox_by_mlid(sm->p_subn, cl_hton16(mlid)); - if (mbox) { - status = mcast_mgr_build_spanning_tree(sm, mbox); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A17: " - "Unable to create spanning tree (%s) for mlid " - "0x%x\n", ib_get_err_str(status), mlid); - } - - OSM_LOG_EXIT(sm->p_log); - return status; -} - -static int mcast_mgr_set_mftables(osm_sm_t * sm) -{ - cl_qmap_t *p_sw_tbl = &sm->p_subn->sw_guid_tbl; - osm_switch_t *p_sw; - osm_mcast_tbl_t *p_tbl; - int block_notdone, ret = 0; - int16_t block_num, max_block = -1; - - p_sw = (osm_switch_t *) cl_qmap_head(p_sw_tbl); - while (p_sw != (osm_switch_t *) cl_qmap_end(p_sw_tbl)) { - p_sw->mft_block_num = 0; - p_sw->mft_position = 0; - p_tbl = osm_switch_get_mcast_tbl_ptr(p_sw); - if (osm_mcast_tbl_get_max_block_in_use(p_tbl) > max_block) - max_block = osm_mcast_tbl_get_max_block_in_use(p_tbl); - p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item); - } - - /* Stripe the MFT blocks across the switches */ - for (block_num = 0; block_num <= max_block; block_num++) { - block_notdone = 1; - while (block_notdone) { - block_notdone = 0; - p_sw = (osm_switch_t *) cl_qmap_head(p_sw_tbl); - while (p_sw != (osm_switch_t *) cl_qmap_end(p_sw_tbl)) { - if (p_sw->mft_block_num == block_num) { - block_notdone = 1; - if (mcast_mgr_set_mft_block(sm, p_sw, - p_sw->mft_block_num, - p_sw->mft_position)) - ret = -1; - p_tbl = osm_switch_get_mcast_tbl_ptr(p_sw); - if (++p_sw->mft_position > p_tbl->max_position) { - p_sw->mft_position = 0; - p_sw->mft_block_num++; - } - } - p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item); - } - } - } - - return ret; -} - -static int alloc_mfts(osm_sm_t * sm) -{ - int i; - cl_map_item_t *item; - osm_switch_t *p_sw; - - for (i = sm->p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO; i >= 0; - i--) - if (sm->p_subn->mboxes[i]) - break; - if (i < 0) - return 0; - - /* Now, walk switches and (re)allocate multicast tables */ - for (item = cl_qmap_head(&sm->p_subn->sw_guid_tbl); - item != cl_qmap_end(&sm->p_subn->sw_guid_tbl); - item = cl_qmap_next(item)) { - p_sw = (osm_switch_t *) item; - if (osm_mcast_tbl_realloc(&p_sw->mcast_tbl, i)) - return -1; - } - return 0; -} - -int osm_mcast_mgr_process(osm_sm_t * sm) -{ - int i, ret = 0; - - OSM_LOG_ENTER(sm->p_log); - - /* While holding the lock, iterate over all the established - multicast groups, servicing each in turn. - Then, download the multicast tables to the switches. */ - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - - /* If there are no switches in the subnet we have nothing to do. */ - if (cl_qmap_count(&sm->p_subn->sw_guid_tbl) == 0) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "No switches in subnet. Nothing to do\n"); - goto exit; - } - - if (alloc_mfts(sm)) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 0A07: alloc_mfts failed\n"); - ret = -1; - goto exit; - } - - for (i = 0; i <= sm->p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO; - i++) - if (sm->p_subn->mboxes[i] || sm->mlids_req[i]) - mcast_mgr_process_mlid(sm, i + IB_LID_MCAST_START_HO); - - memset(sm->mlids_req, 0, sm->mlids_req_max); - sm->mlids_req_max = 0; - - ret = mcast_mgr_set_mftables(sm); - -exit: - CL_PLOCK_RELEASE(sm->p_lock); - - OSM_LOG_EXIT(sm->p_log); - - return ret; -} - -/********************************************************************** - This is the function that is invoked during idle time to handle the - process request for mcast groups where join/leave/delete was required. - **********************************************************************/ -int osm_mcast_mgr_process_mgroups(osm_sm_t * sm) -{ - int ret = 0; - unsigned i; - - OSM_LOG_ENTER(sm->p_log); - - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - - /* If there are no switches in the subnet we have nothing to do. */ - if (cl_qmap_count(&sm->p_subn->sw_guid_tbl) == 0) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "No switches in subnet. Nothing to do\n"); - goto exit; - } - - if (alloc_mfts(sm)) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 0A09: alloc_mfts failed\n"); - ret = -1; - goto exit; - } - - for (i = 0; i <= sm->mlids_req_max; i++) { - if (!sm->mlids_req[i]) - continue; - sm->mlids_req[i] = 0; - mcast_mgr_process_mlid(sm, i + IB_LID_MCAST_START_HO); - } - - memset(sm->mlids_req, 0, sm->mlids_req_max); - sm->mlids_req_max = 0; - - ret = mcast_mgr_set_mftables(sm); - - osm_dump_mcast_routes(sm->p_subn->p_osm); - -exit: - CL_PLOCK_RELEASE(sm->p_lock); - OSM_LOG_EXIT(sm->p_log); - return ret; -} diff --git a/branches/opensm_3/user/opensm/osm_mcast_tbl.c b/branches/opensm_3/user/opensm/osm_mcast_tbl.c deleted file mode 100644 index 0121c58b..00000000 --- a/branches/opensm_3/user/opensm/osm_mcast_tbl.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_mcast_tbl_t. - * This object represents a multicast forwarding table. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include - -void osm_mcast_tbl_init(IN osm_mcast_tbl_t * p_tbl, IN uint8_t num_ports, - IN uint16_t capacity) -{ - CL_ASSERT(p_tbl); - CL_ASSERT(num_ports); - - memset(p_tbl, 0, sizeof(*p_tbl)); - - p_tbl->max_block_in_use = -1; - - if (capacity == 0) { - /* - This switch apparently doesn't support multicast. - Everything is initialized to zero already, so return. - */ - return; - } - - p_tbl->num_entries = capacity; - p_tbl->num_ports = num_ports; - p_tbl->max_position = - (uint8_t) ((ROUNDUP(num_ports, IB_MCAST_MASK_SIZE) / - IB_MCAST_MASK_SIZE) - 1); - - p_tbl->max_block = (uint16_t) ((ROUNDUP(p_tbl->num_entries, - IB_MCAST_BLOCK_SIZE) / - IB_MCAST_BLOCK_SIZE) - 1); -} - -void osm_mcast_tbl_destroy(IN osm_mcast_tbl_t * p_tbl) -{ - free(p_tbl->p_mask_tbl); -} - -void osm_mcast_tbl_set(IN osm_mcast_tbl_t * p_tbl, IN uint16_t mlid_ho, - IN uint8_t port) -{ - unsigned mlid_offset, mask_offset, bit_mask; - int16_t block_num; - - CL_ASSERT(p_tbl && p_tbl->p_mask_tbl); - CL_ASSERT(mlid_ho >= IB_LID_MCAST_START_HO); - CL_ASSERT(mlid_ho <= p_tbl->max_mlid_ho); - - mlid_offset = mlid_ho - IB_LID_MCAST_START_HO; - mask_offset = port / IB_MCAST_MASK_SIZE; - bit_mask = cl_ntoh16((uint16_t) (1 << (port % IB_MCAST_MASK_SIZE))); - (*p_tbl->p_mask_tbl)[mlid_offset][mask_offset] |= bit_mask; - - block_num = (int16_t) (mlid_offset / IB_MCAST_BLOCK_SIZE); - - if (block_num > p_tbl->max_block_in_use) - p_tbl->max_block_in_use = (uint16_t) block_num; -} - -int osm_mcast_tbl_realloc(IN osm_mcast_tbl_t * p_tbl, IN unsigned mlid_offset) -{ - size_t mft_depth, size; - uint16_t (*p_mask_tbl)[][IB_MCAST_POSITION_MAX + 1]; - - if (mlid_offset < p_tbl->mft_depth) - goto done; - - /* - The number of bytes needed in the mask table is: - The (maximum bit mask 'position' + 1) times the - number of bytes in each bit mask times the - number of MLIDs supported by the table. - - We must always allocate the array with the maximum position - since it is (and must be) defined that way the table structure - in order to create a pointer to a two dimensional array. - */ - mft_depth = (mlid_offset / IB_MCAST_BLOCK_SIZE + 1) * IB_MCAST_BLOCK_SIZE; - size = mft_depth * (IB_MCAST_POSITION_MAX + 1) * IB_MCAST_MASK_SIZE / 8; - p_mask_tbl = realloc(p_tbl->p_mask_tbl, size); - if (!p_mask_tbl) - return -1; - memset((uint8_t *)p_mask_tbl + p_tbl->mft_depth * (IB_MCAST_POSITION_MAX + 1) * IB_MCAST_MASK_SIZE / 8, - 0, - size - p_tbl->mft_depth * (IB_MCAST_POSITION_MAX + 1) * IB_MCAST_MASK_SIZE / 8); - p_tbl->p_mask_tbl = p_mask_tbl; - p_tbl->mft_depth = mft_depth; -done: - p_tbl->max_mlid_ho = mlid_offset + IB_LID_MCAST_START_HO; - return 0; -} - -boolean_t osm_mcast_tbl_is_port(IN const osm_mcast_tbl_t * p_tbl, - IN uint16_t mlid_ho, IN uint8_t port_num) -{ - unsigned mlid_offset, mask_offset, bit_mask; - - CL_ASSERT(p_tbl); - - if (p_tbl->p_mask_tbl) { - CL_ASSERT(port_num <= - (p_tbl->max_position + 1) * IB_MCAST_MASK_SIZE); - CL_ASSERT(mlid_ho >= IB_LID_MCAST_START_HO); - CL_ASSERT(mlid_ho <= p_tbl->max_mlid_ho); - - mlid_offset = mlid_ho - IB_LID_MCAST_START_HO; - mask_offset = port_num / IB_MCAST_MASK_SIZE; - bit_mask = cl_ntoh16((uint16_t) - (1 << (port_num % IB_MCAST_MASK_SIZE))); - return (((*p_tbl-> - p_mask_tbl)[mlid_offset][mask_offset] & bit_mask) == - bit_mask); - } - - return FALSE; -} - -boolean_t osm_mcast_tbl_is_any_port(IN const osm_mcast_tbl_t * p_tbl, - IN uint16_t mlid_ho) -{ - unsigned mlid_offset; - uint8_t position; - uint16_t result = 0; - - CL_ASSERT(p_tbl); - - if (p_tbl->p_mask_tbl) { - CL_ASSERT(mlid_ho >= IB_LID_MCAST_START_HO); - CL_ASSERT(mlid_ho <= p_tbl->max_mlid_ho); - - mlid_offset = mlid_ho - IB_LID_MCAST_START_HO; - - for (position = 0; position <= p_tbl->max_position; position++) - result |= (*p_tbl->p_mask_tbl)[mlid_offset][position]; - } - - return (result != 0); -} - -ib_api_status_t osm_mcast_tbl_set_block(IN osm_mcast_tbl_t * p_tbl, - IN const ib_net16_t * p_block, - IN int16_t block_num, - IN uint8_t position) -{ - uint32_t i; - uint16_t mlid_start_ho; - - CL_ASSERT(p_tbl); - CL_ASSERT(p_block); - - if (block_num > p_tbl->max_block) - return IB_INVALID_PARAMETER; - - if (position > p_tbl->max_position) - return IB_INVALID_PARAMETER; - - mlid_start_ho = (uint16_t) (block_num * IB_MCAST_BLOCK_SIZE); - - if (mlid_start_ho + IB_MCAST_BLOCK_SIZE - 1 > p_tbl->mft_depth) - return IB_INVALID_PARAMETER; - - for (i = 0; i < IB_MCAST_BLOCK_SIZE; i++) - (*p_tbl->p_mask_tbl)[mlid_start_ho + i][position] = p_block[i]; - - if (block_num > p_tbl->max_block_in_use) - p_tbl->max_block_in_use = (uint16_t) block_num; - - return IB_SUCCESS; -} - -void osm_mcast_tbl_clear_mlid(IN osm_mcast_tbl_t * p_tbl, IN uint16_t mlid_ho) -{ - unsigned mlid_offset; - - CL_ASSERT(p_tbl); - CL_ASSERT(mlid_ho >= IB_LID_MCAST_START_HO); - - mlid_offset = mlid_ho - IB_LID_MCAST_START_HO; - if (p_tbl->p_mask_tbl && mlid_offset < p_tbl->mft_depth) - memset((uint8_t *)p_tbl->p_mask_tbl + mlid_offset * (IB_MCAST_POSITION_MAX + 1) * IB_MCAST_MASK_SIZE / 8, - 0, - (IB_MCAST_POSITION_MAX + 1) * IB_MCAST_MASK_SIZE / 8); -} - -boolean_t osm_mcast_tbl_get_block(IN osm_mcast_tbl_t * p_tbl, - IN int16_t block_num, IN uint8_t position, - OUT ib_net16_t * p_block) -{ - uint32_t i; - uint16_t mlid_start_ho; - - CL_ASSERT(p_tbl); - CL_ASSERT(p_block); - CL_ASSERT(block_num * IB_MCAST_BLOCK_SIZE <= p_tbl->mft_depth); - - if (block_num > p_tbl->max_block_in_use) - return FALSE; - - if (position > p_tbl->max_position) { - /* - Caller shouldn't do this for efficiency's sake... - */ - memset(p_block, 0, IB_SMP_DATA_SIZE); - return TRUE; - } - - mlid_start_ho = (uint16_t) (block_num * IB_MCAST_BLOCK_SIZE); - - for (i = 0; i < IB_MCAST_BLOCK_SIZE; i++) - p_block[i] = (*p_tbl->p_mask_tbl)[mlid_start_ho + i][position]; - - return TRUE; -} diff --git a/branches/opensm_3/user/opensm/osm_mcm_port.c b/branches/opensm_3/user/opensm/osm_mcm_port.c deleted file mode 100644 index 17a6117d..00000000 --- a/branches/opensm_3/user/opensm/osm_mcm_port.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_mcm_port_t. - * This object represents the membership of a port in a multicast group. - * This object is part of the OpenSM family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include - -osm_mcm_port_t *osm_mcm_port_new(IN osm_port_t *port, IN osm_mgrp_t *mgrp, - IN ib_member_rec_t *mcmr, IN boolean_t proxy) -{ - osm_mcm_port_t *p_mcm; - - p_mcm = malloc(sizeof(*p_mcm)); - if (p_mcm) { - memset(p_mcm, 0, sizeof(*p_mcm)); - p_mcm->port = port; - p_mcm->mgrp = mgrp; - p_mcm->port_gid = mcmr->port_gid; - p_mcm->scope_state = mcmr->scope_state; - p_mcm->proxy_join = proxy; - } - - return p_mcm; -} - -void osm_mcm_port_delete(IN osm_mcm_port_t * p_mcm) -{ - CL_ASSERT(p_mcm); - free(p_mcm); -} diff --git a/branches/opensm_3/user/opensm/osm_mesh.c b/branches/opensm_3/user/opensm/osm_mesh.c deleted file mode 100644 index 662c6090..00000000 --- a/branches/opensm_3/user/opensm/osm_mesh.c +++ /dev/null @@ -1,1735 +0,0 @@ -/* - * Copyright (c) 2008-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2008,2009 System Fabric Works, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * routines to analyze certain meshes - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include - -#define MAX_DEGREE (8) -#define MAX_DIMENSION (8) -#define LARGE (0x7fffffff) - -/* - * characteristic polynomials for selected 1d through 8d tori - */ -static const struct mesh_info { - int dimension; /* dimension of the torus */ - int size[MAX_DIMENSION]; /* size of the torus */ - unsigned int degree; /* degree of polynomial */ - int poly[MAX_DEGREE+1]; /* polynomial */ -} mesh_info[] = { - {0, {0}, 0, {0}, }, - - {1, {2}, 1, {0, -1}, }, - {1, {3}, 2, {-1, 0, 1}, }, - {1, {5}, 2, {-9, 0, 1}, }, - {1, {6}, 2, {-36, 0, 1}, }, - - {2, {2, 2}, 2, {-4, 0, 1}, }, - {2, {3, 2}, 3, {8, 9, 0, -1}, }, - {2, {5, 2}, 3, {24, 17, 0, -1}, }, - {2, {6, 2}, 3, {32, 24, 0, -1}, }, - {2, {3, 3}, 4, {-15, -32, -18, 0, 1}, }, - {2, {5, 3}, 4, {-39, -64, -26, 0, 1}, }, - {2, {6, 3}, 4, {-48, -80, -33, 0, 1}, }, - {2, {5, 5}, 4, {-63, -96, -34, 0, 1}, }, - {2, {6, 5}, 4, {-48, -112, -41, 0, 1}, }, - {2, {6, 6}, 4, {0, -128, -48, 0, 1}, }, - - {3, {2, 2, 2}, 3, {16, 12, 0, -1}, }, - {3, {3, 2, 2}, 4, {-28, -48, -21, 0, 1}, }, - {3, {5, 2, 2}, 4, {-60, -80, -29, 0, 1}, }, - {3, {6, 2, 2}, 4, {-64, -96, -36, 0, 1}, }, - {3, {3, 3, 2}, 5, {48, 127, 112, 34, 0, -1}, }, - {3, {5, 3, 2}, 5, {96, 215, 160, 42, 0, -1}, }, - {3, {6, 3, 2}, 5, {96, 232, 184, 49, 0, -1}, }, - {3, {5, 5, 2}, 5, {144, 303, 208, 50, 0, -1}, }, - {3, {6, 5, 2}, 5, {96, 296, 232, 57, 0, -1}, }, - {3, {6, 6, 2}, 5, {0, 256, 256, 64, 0, -1}, }, - {3, {3, 3, 3}, 6, {-81, -288, -381, -224, -51, 0, 1}, }, - {3, {5, 3, 3}, 6, {-153, -480, -557, -288, -59, 0, 1}, }, - {3, {6, 3, 3}, 6, {-144, -480, -591, -320, -66, 0, 1}, }, - {3, {5, 5, 3}, 6, {-225, -672, -733, -352, -67, 0, 1}, }, - {3, {6, 5, 3}, 6, {-144, -576, -743, -384, -74, 0, 1}, }, - {3, {6, 6, 3}, 6, {0, -384, -720, -416, -81, 0, 1}, }, - {3, {5, 5, 5}, 6, {-297, -864, -909, -416, -75, 0, 1}, }, - {3, {6, 5, 5}, 6, {-144, -672, -895, -448, -82, 0, 1}, }, - {3, {6, 6, 5}, 6, {0, -384, -848, -480, -89, 0, 1}, }, - {3, {6, 6, 6}, 6, {0, 0, -768, -512, -96, 0, 1}, }, - - {4, {2, 2, 2, 2}, 4, {-48, -64, -24, 0, 1}, }, - {4, {3, 2, 2, 2}, 5, {80, 180, 136, 37, 0, -1}, }, - {4, {5, 2, 2, 2}, 5, {144, 276, 184, 45, 0, -1}, }, - {4, {6, 2, 2, 2}, 5, {128, 288, 208, 52, 0, -1}, }, - {4, {3, 3, 2, 2}, 6, {-132, -416, -487, -256, -54, 0, 1}, }, - {4, {5, 3, 2, 2}, 6, {-228, -640, -671, -320, -62, 0, 1}, }, - {4, {6, 3, 2, 2}, 6, {-192, -608, -700, -352, -69, 0, 1}, }, - {4, {5, 5, 2, 2}, 6, {-324, -864, -855, -384, -70, 0, 1}, }, - {4, {6, 5, 2, 2}, 6, {-192, -736, -860, -416, -77, 0, 1}, }, - {4, {6, 6, 2, 2}, 6, {0, -512, -832, -448, -84, 0, 1}, }, - {4, {3, 3, 3, 2}, 7, {216, 873, 1392, 1101, 440, 75, 0, -1}, }, - {4, {5, 3, 3, 2}, 7, {360, 1329, 1936, 1405, 520, 83, 0, -1}, }, - {4, {6, 3, 3, 2}, 7, {288, 1176, 1872, 1455, 560, 90, 0, -1}, }, - {4, {5, 5, 3, 2}, 7, {504, 1785, 2480, 1709, 600, 91, 0, -1}, }, - {4, {6, 5, 3, 2}, 7, {288, 1368, 2272, 1735, 640, 98, 0, -1}, }, - {4, {6, 6, 3, 2}, 7, {0, 768, 1920, 1728, 680, 105, 0, -1}, }, - {4, {5, 5, 5, 2}, 7, {648, 2241, 3024, 2013, 680, 99, 0, -1}, }, - {4, {6, 5, 5, 2}, 7, {288, 1560, 2672, 2015, 720, 106, 0, -1}, }, - {4, {6, 6, 5, 2}, 7, {0, 768, 2176, 1984, 760, 113, 0, -1}, }, - {4, {6, 6, 6, 2}, 7, {0, 0, 1536, 1920, 800, 120, 0, -1}, }, - {4, {3, 3, 3, 3}, 8, {-351, -1728, -3492, -3712, -2202, -704, -100, 0, 1}, }, - {4, {5, 3, 3, 3}, 8, {-567, -2592, -4860, -4800, -2658, -800, -108, 0, 1}, }, - {4, {6, 3, 3, 3}, 8, {-432, -2160, -4401, -4672, -2733, -848, -115, 0, 1}, }, - {4, {5, 5, 3, 3}, 8, {-783, -3456, -6228, -5888, -3114, -896, -116, 0, 1}, }, - {4, {6, 5, 3, 3}, 8, {-432, -2448, -5241, -5568, -3165, -944, -123, 0, 1}, }, - {4, {6, 6, 3, 3}, 8, {0, -1152, -3888, -5056, -3183, -992, -130, 0, 1}, }, - {4, {5, 5, 5, 3}, 8, {-999, -4320, -7596, -6976, -3570, -992, -124, 0, 1}, }, - {4, {6, 5, 5, 3}, 8, {-432, -2736, -6081, -6464, -3597, -1040, -131, 0, 1}, }, - {4, {6, 6, 5, 3}, 8, {0, -1152, -4272, -5760, -3591, -1088, -138, 0, 1}, }, - {4, {6, 6, 6, 3}, 8, {0, 0, -2304, -4864, -3552, -1136, -145, 0, 1}, }, - - {5, {2, 2, 2, 2, 2}, 5, {128, 240, 160, 40, 0, -1}, }, - {5, {3, 2, 2, 2, 2}, 6, {-208, -576, -600, -288, -57, 0, 1}, }, - {5, {5, 2, 2, 2, 2}, 6, {-336, -832, -792, -352, -65, 0, 1}, }, - {5, {6, 2, 2, 2, 2}, 6, {-256, -768, -816, -384, -72, 0, 1}, }, - {5, {3, 3, 2, 2, 2}, 7, {336, 1228, 1776, 1287, 480, 78, 0, -1}, }, - {5, {5, 3, 2, 2, 2}, 7, {528, 1772, 2368, 1599, 560, 86, 0, -1}, }, - {5, {6, 3, 2, 2, 2}, 7, {384, 1504, 2256, 1644, 600, 93, 0, -1}, }, - {5, {5, 5, 2, 2, 2}, 7, {720, 2316, 2960, 1911, 640, 94, 0, -1}, }, - {5, {6, 5, 2, 2, 2}, 7, {384, 1760, 2704, 1932, 680, 101, 0, -1}, }, - {5, {6, 6, 2, 2, 2}, 7, {0, 1024, 2304, 1920, 720, 108, 0, -1}, }, - {5, {3, 3, 3, 2, 2}, 8, {-540, -2448, -4557, -4480, -2481, -752, -103, 0, 1}, }, - {5, {5, 3, 3, 2, 2}, 8, {-828, -3504, -6101, -5632, -2945, -848, -111, 0, 1}, }, - {5, {6, 3, 3, 2, 2}, 8, {-576, -2784, -5412, -5440, -3015, -896, -118, 0, 1}, }, - {5, {5, 5, 3, 2, 2}, 8, {-1116, -4560, -7645, -6784, -3409, -944, -119, 0, 1}, }, - {5, {6, 5, 3, 2, 2}, 8, {-576, -3168, -6404, -6400, -3455, -992, -126, 0, 1}, }, - {5, {6, 6, 3, 2, 2}, 8, {0, -1536, -4800, -5824, -3468, -1040, -133, 0, 1}, }, - {5, {5, 5, 5, 2, 2}, 8, {-1404, -5616, -9189, -7936, -3873, -1040, -127, 0, 1}, }, - {5, {6, 5, 5, 2, 2}, 8, {-576, -3552, -7396, -7360, -3895, -1088, -134, 0, 1}, }, - {5, {6, 6, 5, 2, 2}, 8, {0, -1536, -5312, -6592, -3884, -1136, -141, 0, 1}, }, - {5, {6, 6, 6, 2, 2}, 8, {0, 0, -3072, -5632, -3840, -1184, -148, 0, 1}, }, - - {6, {2, 2, 2, 2, 2, 2}, 6, {-320, -768, -720, -320, -60, 0, 1}, }, - {6, {3, 2, 2, 2, 2, 2}, 7, {512, 1680, 2208, 1480, 520, 81, 0, -1}, }, - {6, {5, 2, 2, 2, 2, 2}, 7, {768, 2320, 2848, 1800, 600, 89, 0, -1}, }, - {6, {6, 2, 2, 2, 2, 2}, 7, {512, 1920, 2688, 1840, 640, 96, 0, -1}, }, - {6, {3, 3, 2, 2, 2, 2}, 8, {-816, -3392, -5816, -5312, -2767, -800, -106, 0, 1}, }, - {6, {5, 3, 2, 2, 2, 2}, 8, {-1200, -4672, -7544, -6528, -3239, -896, -114, 0, 1}, }, - {6, {6, 3, 2, 2, 2, 2}, 8, {-768, -3584, -6608, -6272, -3304, -944, -121, 0, 1}, }, - {6, {5, 5, 2, 2, 2, 2}, 8, {-1584, -5952, -9272, -7744, -3711, -992, -122, 0, 1}, }, - {6, {6, 5, 2, 2, 2, 2}, 8, {-768, -4096, -7760, -7296, -3752, -1040, -129, 0, 1}, }, - {6, {6, 6, 2, 2, 2, 2}, 8, {0, -2048, -5888, -6656, -3760, -1088, -136, 0, 1}, }, - - {7, {2, 2, 2, 2, 2, 2, 2}, 7, {768, 2240, 2688, 1680, 560, 84, 0, -1}, }, - {7, {3, 2, 2, 2, 2, 2, 2}, 8, {-1216, -4608, -7280, -6208, -3060, -848, -109, 0, 1}, }, - {7, {5, 2, 2, 2, 2, 2, 2}, 8, {-1728, -6144, -9200, -7488, -3540, -944, -117, 0, 1}, }, - {7, {6, 2, 2, 2, 2, 2, 2}, 8, {-1024, -4608, -8000, -7168, -3600, -992, -124, 0, 1}, }, - - {8, {2, 2, 2, 2, 2, 2, 2, 2}, 8, {-1792, -6144, -8960, -7168, -3360, -896, -112, 0, 1}, }, - - /* - * mesh errors - */ - {2, {6, 6}, 4, {-192, -256, -80, 0, 1}, }, - - {-1, {0,}, 0, {0, }, }, -}; - -/* - * per fabric mesh info - */ -typedef struct _mesh { - int num_class; /* number of switch classes */ - int *class_type; /* index of first switch found for each class */ - int *class_count; /* population of each class */ - int dimension; /* mesh dimension */ - int *size; /* an array to hold size of mesh */ - int dim_order[MAX_DIMENSION]; -} mesh_t; - -typedef struct sort_ctx { - lash_t *p_lash; - mesh_t *mesh; -} sort_ctx_t; - -typedef struct comp { - int index; - sort_ctx_t ctx; -} comp_t; - -/* - * poly_alloc - * - * allocate a polynomial of degree n - */ -static int *poly_alloc(lash_t *p_lash, int n) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int *p; - - if (!(p = calloc(n+1, sizeof(int)))) - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed allocating poly - out of memory\n"); - - return p; -} - -/* - * print a polynomial - */ -static char *poly_print(int n, int *coeff) -{ - static char str[(MAX_DEGREE+1)*20]; - char *p = str; - int i; - int first = 1; - int t; - int sign; - - str[0] = 0; - - for (i = 0; i <= n; i++) { - if (!coeff[i]) - continue; - - if (coeff[i] < 0) { - sign = 1; - t = -coeff[i]; - } else { - sign = 0; - t = coeff[i]; - } - - p += sprintf(p, "%s", sign? "-" : (first? "" : "+")); - first = 0; - - if (t != 1 || i == 0) - p += sprintf(p, "%d", t); - - if (i) - p += sprintf(p, "x"); - if (i > 1) - p += sprintf(p, "^%d", i); - } - - return str; -} - -/* - * poly_diff - * - * return a nonzero value if polynomials differ else 0 - */ -static int poly_diff(unsigned int n, const int *p, switch_t *s) -{ - if (s->node->num_links != n) - return 1; - - return memcmp(p, s->node->poly, n*sizeof(int)); -} - -/* - * m_free - * - * free a square matrix of rank l - */ -static void m_free(int **m, int l) -{ - int i; - - if (m) { - for (i = 0; i < l; i++) { - if (m[i]) - free(m[i]); - } - free(m); - } -} - -/* - * m_alloc - * - * allocate a square matrix of rank l - */ -static int **m_alloc(lash_t *p_lash, int l) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int i; - int **m = NULL; - - do { - if (!(m = calloc(l, sizeof(int *)))) - break; - - for (i = 0; i < l; i++) { - if (!(m[i] = calloc(l, sizeof(int)))) - break; - } - if (i != l) - break; - - return m; - } while (0); - - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed allocating matrix - out of memory\n"); - - m_free(m, l); - return NULL; -} - -/* - * pm_free - * - * free a square matrix of rank l of polynomials - */ -static void pm_free(int ***m, int l) -{ - int i, j; - - if (m) { - for (i = 0; i < l; i++) { - if (m[i]) { - for (j = 0; j < l; j++) { - if (m[i][j]) - free(m[i][j]); - } - free(m[i]); - } - } - free(m); - } -} - -/* - * pm_alloc - * - * allocate a square matrix of rank l of polynomials of degree n - */ -static int ***pm_alloc(lash_t *p_lash, int l, int n) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int i, j; - int ***m = NULL; - - do { - if (!(m = calloc(l, sizeof(int **)))) - break; - - for (i = 0; i < l; i++) { - if (!(m[i] = calloc(l, sizeof(int *)))) - break; - - for (j = 0; j < l; j++) { - if (!(m[i][j] = calloc(n+1, sizeof(int)))) - break; - } - if (j != l) - break; - } - if (i != l) - break; - - return m; - } while (0); - - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed allocating matrix - out of memory\n"); - - pm_free(m, l); - return NULL; -} - -static int determinant(lash_t *p_lash, int n, int rank, int ***m, int *p); - -/* - * sub_determinant - * - * compute the determinant of a submatrix of matrix of rank l of polynomials of degree n - * with row and col removed in poly. caller must free poly - */ -static int sub_determinant(lash_t *p_lash, int n, int l, int row, int col, - int ***matrix, int **poly) -{ - int ret = -1; - int ***m = NULL; - int *p = NULL; - int i, j, k, x, y; - int rank = l - 1; - - do { - if (!(p = poly_alloc(p_lash, n))) { - break; - } - - if (rank <= 0) { - p[0] = 1; - ret = 0; - break; - } - - if (!(m = pm_alloc(p_lash, rank, n))) { - free(p); - p = NULL; - break; - } - - x = 0; - for (i = 0; i < l; i++) { - if (i == row) - continue; - - y = 0; - for (j = 0; j < l; j++) { - if (j == col) - continue; - - for (k = 0; k <= n; k++) - m[x][y][k] = matrix[i][j][k]; - - y++; - } - x++; - } - - if (determinant(p_lash, n, rank, m, p)) { - free(p); - p = NULL; - break; - } - - ret = 0; - } while (0); - - pm_free(m, rank); - *poly = p; - return ret; -} - -/* - * determinant - * - * compute the determinant of matrix m of rank of polynomials of degree deg - * and add the result to polynomial p allocated by caller - */ -static int determinant(lash_t *p_lash, int deg, int rank, int ***m, int *p) -{ - int i, j, k; - int *q; - int sign = 1; - - /* - * handle simple case of 1x1 matrix - */ - if (rank == 1) { - for (i = 0; i <= deg; i++) - p[i] += m[0][0][i]; - } - - /* - * handle simple case of 2x2 matrix - */ - else if (rank == 2) { - for (i = 0; i <= deg; i++) { - if (m[0][0][i] == 0) - continue; - - for (j = 0; j <= deg; j++) { - if (m[1][1][j] == 0) - continue; - - p[i+j] += m[0][0][i]*m[1][1][j]; - } - } - - for (i = 0; i <= deg; i++) { - if (m[0][1][i] == 0) - continue; - - for (j = 0; j <= deg; j++) { - if (m[1][0][j] == 0) - continue; - - p[i+j] -= m[0][1][i]*m[1][0][j]; - } - } - } - - /* - * handle the general case - */ - else { - for (i = 0; i < rank; i++) { - if (sub_determinant(p_lash, deg, rank, 0, i, m, &q)) - return -1; - - for (j = 0; j <= deg; j++) { - if (m[0][i][j] == 0) - continue; - - for (k = 0; k <= deg; k++) { - if (q[k] == 0) - continue; - - p[j+k] += sign*m[0][i][j]*q[k]; - } - } - - free(q); - sign = -sign; - } - } - - return 0; -} - -/* - * char_poly - * - * compute the characteristic polynomial of matrix of rank - * by computing the determinant of m-x*I and return in poly - * as an array. caller must free poly - */ -static int char_poly(lash_t *p_lash, int rank, int **matrix, int **poly) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int ret = -1; - int i, j; - int ***m = NULL; - int *p = NULL; - int deg = rank; - - OSM_LOG_ENTER(p_log); - - do { - if (!matrix) - break; - - if (!(p = poly_alloc(p_lash, deg))) - break; - - if (!(m = pm_alloc(p_lash, rank, deg))) { - free(p); - p = NULL; - break; - } - - for (i = 0; i < rank; i++) { - for (j = 0; j < rank; j++) { - m[i][j][0] = matrix[i][j]; - } - m[i][i][1] = -1; - } - - if (determinant(p_lash, deg, rank, m, p)) { - free(p); - p = NULL; - break; - } - - ret = 0; - } while (0); - - pm_free(m, rank); - *poly = p; - - OSM_LOG_EXIT(p_log); - return ret; -} - -/* - * get_switch_metric - * - * compute the matrix of minimum distances between each of - * the adjacent switch nodes to sw along paths - * that do not go through sw. do calculation by - * relaxation method - * allocate space for the matrix and save in node_t structure - */ -static int get_switch_metric(lash_t *p_lash, int sw) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int ret = -1; - unsigned int i, j, change; - int sw1, sw2, sw3; - switch_t *s = p_lash->switches[sw]; - switch_t *s1, *s2, *s3; - int **m; - mesh_node_t *node = s->node; - unsigned int num_links = node->num_links; - - OSM_LOG_ENTER(p_log); - - do { - if (!(m = m_alloc(p_lash, num_links))) - break; - - for (i = 0; i < num_links; i++) { - sw1 = node->links[i]->switch_id; - s1 = p_lash->switches[sw1]; - - /* make all distances big except s1 to itself */ - for (sw2 = 0; sw2 < p_lash->num_switches; sw2++) - p_lash->switches[sw2]->node->temp = LARGE; - - s1->node->temp = 0; - - do { - change = 0; - - for (sw2 = 0; sw2 < p_lash->num_switches; sw2++) { - s2 = p_lash->switches[sw2]; - if (s2->node->temp == LARGE) - continue; - for (j = 0; j < s2->node->num_links; j++) { - sw3 = s2->node->links[j]->switch_id; - s3 = p_lash->switches[sw3]; - - if (sw3 == sw) - continue; - - if ((s2->node->temp + 1) < s3->node->temp) { - s3->node->temp = s2->node->temp + 1; - change++; - } - } - } - } while (change); - - for (j = 0; j < num_links; j++) { - sw2 = node->links[j]->switch_id; - s2 = p_lash->switches[sw2]; - m[i][j] = s2->node->temp; - } - } - - if (char_poly(p_lash, num_links, m, &node->poly)) { - m_free(m, num_links); - m = NULL; - break; - } - - ret = 0; - } while (0); - - node->matrix = m; - - OSM_LOG_EXIT(p_log); - return ret; -} - -/* - * classify_switch - * - * add switch to histogram of switch types - * we keep a reference to the first switch - * found of each type as an exemplar - */ -static void classify_switch(lash_t *p_lash, mesh_t *mesh, int sw) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int i; - switch_t *s = p_lash->switches[sw]; - switch_t *s1; - - OSM_LOG_ENTER(p_log); - - if (!s->node->poly) - goto done; - - for (i = 0; i < mesh->num_class; i++) { - s1 = p_lash->switches[mesh->class_type[i]]; - - if (poly_diff(s->node->num_links, s->node->poly, s1)) - continue; - - mesh->class_count[i]++; - goto done; - } - - mesh->class_type[mesh->num_class] = sw; - mesh->class_count[mesh->num_class] = 1; - mesh->num_class++; - -done: - OSM_LOG_EXIT(p_log); -} - -/* - * classify_mesh_type - * - * try to look up node polynomial in table - */ -static void classify_mesh_type(lash_t *p_lash, int sw) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int i; - switch_t *s = p_lash->switches[sw]; - const struct mesh_info *t; - - OSM_LOG_ENTER(p_log); - - if (!s->node->poly) - goto done; - - for (i = 1; (t = &mesh_info[i])->dimension != -1; i++) { - if (poly_diff(t->degree, t->poly, s)) - continue; - - s->node->type = i; - s->node->dimension = t->dimension; - OSM_LOG_EXIT(p_log); - return; - } - -done: - s->node->type = 0; - OSM_LOG_EXIT(p_log); - return; -} - -/* - * remove_edges - * - * remove type from nodes that have fewer links - * than adjacent nodes - */ -static void remove_edges(lash_t *p_lash) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int sw; - mesh_node_t *n, *nn; - unsigned i; - - OSM_LOG_ENTER(p_log); - - for (sw = 0; sw < p_lash->num_switches; sw++) { - n = p_lash->switches[sw]->node; - if (!n->type) - continue; - - for (i = 0; i < n->num_links; i++) { - nn = p_lash->switches[n->links[i]->switch_id]->node; - - if (nn->num_links > n->num_links) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "removed edge switch %s\n", - p_lash->switches[sw]->p_sw->p_node->print_desc); - n->type = -1; - break; - } - } - } - - OSM_LOG_EXIT(p_log); -} - -/* - * get_local_geometry - * - * analyze the local geometry around each switch - */ -static int get_local_geometry(lash_t *p_lash, mesh_t *mesh) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int sw; - int status = 0; - - OSM_LOG_ENTER(p_log); - - for (sw = 0; sw < p_lash->num_switches; sw++) { - /* - * skip switches with more links than MAX_DEGREE - * since they will never match a known case - */ - if (p_lash->switches[sw]->node->num_links > MAX_DEGREE) - continue; - - if (get_switch_metric(p_lash, sw)) { - status = -1; - goto Exit; - } - classify_mesh_type(p_lash, sw); - } - - remove_edges(p_lash); - - for (sw = 0; sw < p_lash->num_switches; sw++) { - if (p_lash->switches[sw]->node->type < 0) - continue; - classify_switch(p_lash, mesh, sw); - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -static void print_axis(lash_t *p_lash, char *p, int sw, int port) -{ - mesh_node_t *node = p_lash->switches[sw]->node; - char *name = p_lash->switches[sw]->p_sw->p_node->print_desc; - int c = node->axes[port]; - - p += sprintf(p, "%s[%d] = ", name, port); - if (c) - p += sprintf(p, "%s%c -> ", ((c - 1) & 1) ? "-" : "+", 'X' + (c - 1)/2); - else - p += sprintf(p, "N/A -> "); - p += sprintf(p, "%s\n", - p_lash->switches[node->links[port]->switch_id]->p_sw->p_node->print_desc); -} - -/* - * seed_axes - * - * assign axes to the links of the seed switch - * assumes switch is of type cartesian mesh - * axes are numbered 1 to n i.e. +x => 1 -x => 2 etc. - * this assumes that if all distances are 2 that - * an axis has only 2 nodes so +A and -A collapse to +A - */ -static void seed_axes(lash_t *p_lash, int sw) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - mesh_node_t *node = p_lash->switches[sw]->node; - int n = node->num_links; - int i, j, c; - - OSM_LOG_ENTER(p_log); - - if (!node->matrix || !node->dimension) - goto done; - - for (c = 1; c <= 2*node->dimension; c++) { - /* - * find the next unassigned axis - */ - for (i = 0; i < n; i++) { - if (!node->axes[i]) - break; - } - - node->axes[i] = c++; - - /* - * find the matching opposite direction - */ - for (j = 0; j < n; j++) { - if (node->axes[j] || j == i) - continue; - - if (node->matrix[i][j] != 2) - break; - } - - if (j != n) { - node->axes[j] = c; - } - } - - if (osm_log_is_active(p_log, OSM_LOG_DEBUG)) { - char buf[256], *p; - - for (i = 0; i < n; i++) { - p = buf; - print_axis(p_lash, p, sw, i); - OSM_LOG(p_log, OSM_LOG_DEBUG, "%s", buf); - } - } - -done: - OSM_LOG_EXIT(p_log); -} - -/* - * opposite - * - * compute the opposite of axis for switch - */ -static inline int opposite(switch_t *s, int axis) -{ - unsigned i, j; - int negaxis = 1 + (1 ^ (axis - 1)); - - if (!s->node->matrix) - return 0; - - for (i = 0; i < s->node->num_links; i++) { - if (s->node->axes[i] == axis) { - for (j = 0; j < s->node->num_links; j++) { - if (j == i) - continue; - if (s->node->matrix[i][j] != 2) - return negaxis; - } - - return axis; - } - } - - return 0; -} - -/* - * make_geometry - * - * induce a geometry on the switches - */ -static void make_geometry(lash_t *p_lash, int sw) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int num_switches = p_lash->num_switches; - int sw1, sw2; - switch_t *s, *s1, *s2, *seed; - unsigned int i, j, k, l, n, m; - unsigned int change; - - OSM_LOG_ENTER(p_log); - - s = p_lash->switches[sw]; - - if (!s->node->matrix) - goto done; - - /* - * assign axes to seed switch - */ - seed_axes(p_lash, sw); - seed = p_lash->switches[sw]; - - /* - * induce axes in other switches until - * there is no more change - */ - do { - change = 0; - - /* phase 1 opposites */ - for (sw1 = 0; sw1 < num_switches; sw1++) { - s1 = p_lash->switches[sw1]; - n = s1->node->num_links; - - /* - * ignore chain fragments - */ - if (n < seed->node->num_links && n <= 2) - continue; - - /* - * only process 'mesh' switches - */ - if (!s1->node->matrix) - continue; - - for (i = 0; i < n; i++) { - if (!s1->node->axes[i]) - continue; - - /* - * can't tell across if more than one - * likely looking link - */ - m = 0; - for (j = 0; j < n; j++) { - if (j == i) - continue; - - if (s1->node->matrix[i][j] != 2) - m++; - } - - if (m != 1) { - continue; - } - - for (j = 0; j < n; j++) { - if (j == i) - continue; - - /* Rule out opposite nodes when distance greater than 4 */ - if (s1->node->matrix[i][j] != 2 && - s1->node->matrix[i][j] <= 4) { - if (s1->node->axes[j]) { - if (s1->node->axes[j] != opposite(seed, s1->node->axes[i])) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "phase 1 mismatch\n"); - } - } else { - s1->node->axes[j] = opposite(seed, s1->node->axes[i]); - change++; - } - } - } - } - } - - /* phase 2 switch to switch */ - for (sw1 = 0; sw1 < num_switches; sw1++) { - s1 = p_lash->switches[sw1]; - n = s1->node->num_links; - - if (!s1->node->matrix) - continue; - - for (i = 0; i < n; i++) { - int l2 = s1->node->links[i]->link_id; - - if (!s1->node->axes[i]) - continue; - - if (l2 == -1) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "no reverse link\n"); - continue; - } - - sw2 = s1->node->links[i]->switch_id; - s2 = p_lash->switches[sw2]; - - if (!s2->node->matrix) - continue; - - if (!s2->node->axes[l2]) { - /* - * set axis to opposite of s1->axes[i] - */ - s2->node->axes[l2] = opposite(seed, s1->node->axes[i]); - change++; - } else { - if (s2->node->axes[l2] != opposite(seed, s1->node->axes[i])) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "phase 2 mismatch\n"); - } - } - } - } - - /* Phase 3 corners */ - for (sw1 = 0; sw1 < num_switches; sw1++) { - s = p_lash->switches[sw1]; - n = s->node->num_links; - - if (!s->node->matrix) - continue; - - for (i = 0; i < n; i++) { - if (!s->node->axes[i]) - continue; - - for (j = 0; j < n; j++) { - if (i == j || !s->node->axes[j] || s->node->matrix[i][j] != 2) - continue; - - s1 = p_lash->switches[s->node->links[i]->switch_id]; - s2 = p_lash->switches[s->node->links[j]->switch_id]; - - /* - * find switch (other than s1) that neighbors i and j - * have in common - */ - for (k = 0; k < s1->node->num_links; k++) { - if (s1->node->links[k]->switch_id == sw1) - continue; - - for (l = 0; l < s2->node->num_links; l++) { - if (s2->node->links[l]->switch_id == sw1) - continue; - - if (s1->node->links[k]->switch_id == s2->node->links[l]->switch_id) { - if (s1->node->axes[k]) { - if (s1->node->axes[k] != s->node->axes[j]) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "phase 3 mismatch\n"); - } - } else { - s1->node->axes[k] = s->node->axes[j]; - change++; - } - - if (s2->node->axes[l]) { - if (s2->node->axes[l] != s->node->axes[i]) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "phase 3 mismatch\n"); - } - } else { - s2->node->axes[l] = s->node->axes[i]; - change++; - } - goto next_j; - } - } - } -next_j: - ; - } - } - } - } while (change); - -done: - OSM_LOG_EXIT(p_log); -} - -/* - * return |a| < |b| - */ -static inline int ltmag(int a, int b) -{ - int a1 = (a >= 0)? a : -a; - int b1 = (b >= 0)? b : -b; - - return (a1 < b1) || (a1 == b1 && a > b); -} - -/* - * reorder_node_links - * - * reorder the links out of a switch in sign/dimension order - */ -static int reorder_node_links(lash_t *p_lash, mesh_t *mesh, int sw) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - switch_t *s = p_lash->switches[sw]; - mesh_node_t *node = s->node; - int n = node->num_links; - link_t **links; - int *axes; - int i, j, k, l; - int c; - int next = 0; - int dimension = mesh->dimension; - - if (!(links = calloc(n, sizeof(link_t *)))) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed allocating links array - out of memory\n"); - return -1; - } - - if (!(axes = calloc(n, sizeof(int)))) { - free(links); - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed allocating axes array - out of memory\n"); - return -1; - } - - /* - * find the links with axes - */ - for (i = 0; i < dimension; i++) { - j = mesh->dim_order[i]; - for (k = 1; k <= 2; k++) { - c = 2*j + k; - - if (node->coord[j] > 0) - c = opposite(s, c); - - for (l = 0; l < n; l++) { - if (!node->links[l]) - continue; - if (node->axes[l] == c) { - links[next] = node->links[l]; - axes[next] = node->axes[l]; - node->links[l] = NULL; - next++; - } - } - } - } - - /* - * get the rest - */ - for (i = 0; i < n; i++) { - if (!node->links[i]) - continue; - - links[next] = node->links[i]; - axes[next] = node->axes[i]; - node->links[i] = NULL; - next++; - } - - for (i = 0; i < n; i++) { - node->links[i] = links[i]; - node->axes[i] = axes[i]; - } - - free(links); - free(axes); - - return 0; -} - -/* - * make_coord - */ -static int make_coord(lash_t *p_lash, mesh_t *mesh, int seed) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - unsigned int i, j, k; - int sw; - switch_t *s, *s1; - unsigned int change; - unsigned int dimension = mesh->dimension; - int num_switches = p_lash->num_switches; - int assigned_axes = 0, unassigned_axes = 0; - - OSM_LOG_ENTER(p_log); - - for (sw = 0; sw < num_switches; sw++) { - s = p_lash->switches[sw]; - - s->node->coord = calloc(dimension, sizeof(int)); - if (!s->node->coord) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed allocating coord - out of memory\n"); - OSM_LOG_EXIT(p_log); - return -1; - } - - for (i = 0; i < dimension; i++) - s->node->coord[i] = (sw == seed) ? 0 : LARGE; - - for (i = 0; i < s->node->num_links; i++) - if (s->node->axes[i] == 0) - unassigned_axes++; - else - assigned_axes++; - } - - OSM_LOG(p_log, OSM_LOG_DEBUG, "%d/%d unassigned/assigned axes\n", - unassigned_axes, assigned_axes); - - do { - change = 0; - - for (sw = 0; sw < num_switches; sw++) { - s = p_lash->switches[sw]; - - if (s->node->coord[0] == LARGE) - continue; - - for (j = 0; j < s->node->num_links; j++) { - if (!s->node->axes[j]) - continue; - - s1 = p_lash->switches[s->node->links[j]->switch_id]; - - for (k = 0; k < dimension; k++) { - int coord = s->node->coord[k]; - unsigned axis = s->node->axes[j] - 1; - - if (k == axis/2) - coord += (axis & 1)? -1 : +1; - - if (ltmag(coord, s1->node->coord[k])) { - s1->node->coord[k] = coord; - change++; - } - } - } - } - } while (change); - - OSM_LOG_EXIT(p_log); - return 0; -} - -/* - * measure geometry - */ -static int measure_geometry(lash_t *p_lash, mesh_t *mesh) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int i, j; - int sw; - switch_t *s; - int dimension = mesh->dimension; - int num_switches = p_lash->num_switches; - int max[MAX_DIMENSION]; - int min[MAX_DIMENSION]; - int size[MAX_DIMENSION]; - int max_size; - int max_index; - - OSM_LOG_ENTER(p_log); - - mesh->size = calloc(dimension, sizeof(int)); - if (!mesh->size) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed allocating size - out of memory\n"); - OSM_LOG_EXIT(p_log); - return -1; - } - - for (i = 0; i < dimension; i++) { - max[i] = -LARGE; - min[i] = LARGE; - } - - for (sw = 0; sw < num_switches; sw++) { - s = p_lash->switches[sw]; - - for (i = 0; i < dimension; i++) { - if (s->node->coord[i] == LARGE) - continue; - if (s->node->coord[i] > max[i]) - max[i] = s->node->coord[i]; - if (s->node->coord[i] < min[i]) - min[i] = s->node->coord[i]; - } - } - - for (i = 0; i < dimension; i++) - mesh->size[i] = size[i] = max[i] - min[i] + 1; - - /* - * find an order of dimensions that places largest - * sizes first since this seems to work best with LASH - */ - for (j = 0; j < dimension; j++) { - max_size = -1; - max_index = -1; - - for (i = 0; i < dimension; i++) { - if (size[i] > max_size) { - max_size = size[i]; - max_index = i; - } - } - - mesh->dim_order[j] = max_index; - size[max_index] = -1; - } - - OSM_LOG_EXIT(p_log); - return 0; -} - -/* - * reorder links - */ -static int reorder_links(lash_t *p_lash, mesh_t *mesh) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int sw; - int num_switches = p_lash->num_switches; - - OSM_LOG_ENTER(p_log); - - for (sw = 0; sw < num_switches; sw++) { - if (reorder_node_links(p_lash, mesh, sw)) { - OSM_LOG_EXIT(p_log); - return -1; - } - } - - OSM_LOG_EXIT(p_log); - return 0; -} - -/* - * compare two switches in a sort - */ -static int OSM_CDECL compare_switches(const void *p1, const void *p2) -{ - const comp_t *cp1 = p1, *cp2 = p2; - const sort_ctx_t *ctx = &cp1->ctx; - switch_t *s1 = ctx->p_lash->switches[cp1->index]; - switch_t *s2 = ctx->p_lash->switches[cp2->index]; - int i, j; - int ret; - - for (i = 0; i < ctx->mesh->dimension; i++) { - j = ctx->mesh->dim_order[i]; - if ((ret = s1->node->coord[j] - s2->node->coord[j])); - return ret; - } - - return 0; -} - -/* - * sort_switches - reorder switch array - */ -static void sort_switches(lash_t *p_lash, mesh_t *mesh) -{ - unsigned int i, j; - unsigned int num_switches = p_lash->num_switches; - comp_t *comp; - int *reverse; - switch_t *s; - switch_t **switches; - - comp = malloc(num_switches * sizeof(comp_t)); - reverse = malloc(num_switches * sizeof(int)); - switches = malloc(num_switches * sizeof(switch_t *)); - if (!comp || !reverse || !switches) { - OSM_LOG(&p_lash->p_osm->log, OSM_LOG_ERROR, - "Failed memory allocation - switches not sorted!\n"); - goto Exit; - } - - for (i = 0; i < num_switches; i++) { - comp[i].index = i; - comp[i].ctx.mesh = mesh; - comp[i].ctx.p_lash = p_lash; - } - - qsort(comp, num_switches, sizeof(comp_t), compare_switches); - - for (i = 0; i < num_switches; i++) - reverse[comp[i].index] = i; - - for (i = 0; i < num_switches; i++) { - s = p_lash->switches[comp[i].index]; - switches[i] = s; - s->id = i; - for (j = 0; j < s->node->num_links; j++) - s->node->links[j]->switch_id = - reverse[s->node->links[j]->switch_id]; - } - - for (i = 0; i < num_switches; i++) - p_lash->switches[i] = switches[i]; - -Exit: - if (switches) - free(switches); - if (comp) - free(comp); - if (reverse) - free(reverse); -} - -/* - * osm_mesh_delete - free per mesh resources - */ -static void mesh_delete(mesh_t *mesh) -{ - if (mesh) { - if (mesh->class_type) - free(mesh->class_type); - - if (mesh->class_count) - free(mesh->class_count); - - if (mesh->size) - free(mesh->size); - - free(mesh); - } -} - -/* - * osm_mesh_create - allocate per mesh resources - */ -static mesh_t *mesh_create(lash_t *p_lash) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - mesh_t *mesh; - - if(!(mesh = calloc(1, sizeof(mesh_t)))) - goto err; - - if (!(mesh->class_type = calloc(p_lash->num_switches, sizeof(int)))) - goto err; - - if (!(mesh->class_count = calloc(p_lash->num_switches, sizeof(int)))) - goto err; - - return mesh; - -err: - mesh_delete(mesh); - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed allocating mesh - out of memory\n"); - return NULL; -} - -/* - * osm_mesh_node_delete - cleanup per switch resources - */ -void osm_mesh_node_delete(lash_t *p_lash, switch_t *sw) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - unsigned i; - mesh_node_t *node = sw->node; - unsigned num_ports = sw->p_sw->num_ports; - - OSM_LOG_ENTER(p_log); - - if (node) { - for (i = 0; i < num_ports; i++) - if (node->links[i]) - free(node->links[i]); - - if (node->poly) - free(node->poly); - - if (node->matrix) { - for (i = 0; i < node->num_links; i++) { - if (node->matrix[i]) - free(node->matrix[i]); - } - free(node->matrix); - } - - if (node->axes) - free(node->axes); - - if (node->coord) - free(node->coord); - - free(node); - - sw->node = NULL; - } - - OSM_LOG_EXIT(p_log); -} - -/* - * osm_mesh_node_create - allocate per switch resources - */ -int osm_mesh_node_create(lash_t *p_lash, switch_t *sw) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - unsigned i; - mesh_node_t *node; - unsigned num_ports = sw->p_sw->num_ports; - - OSM_LOG_ENTER(p_log); - - if (!(node = sw->node = calloc(1, sizeof(mesh_node_t) + num_ports * sizeof(link_t *)))) - goto err; - - for (i = 0; i < num_ports; i++) - if (!(node->links[i] = calloc(1, sizeof(link_t) + num_ports * sizeof(int)))) - goto err; - - if (!(node->axes = calloc(num_ports, sizeof(int)))) - goto err; - - for (i = 0; i < num_ports; i++) { - node->links[i]->switch_id = NONE; - } - - OSM_LOG_EXIT(p_log); - return 0; - -err: - osm_mesh_node_delete(p_lash, sw); - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed allocating mesh node - out of memory\n"); - OSM_LOG_EXIT(p_log); - return -1; -} - -static void dump_mesh(lash_t *p_lash) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int sw; - int num_switches = p_lash->num_switches; - int dimension; - int i, j, k, n; - switch_t *s, *s2; - char buf[256]; - - OSM_LOG_ENTER(p_log); - - for (sw = 0; sw < num_switches; sw++) { - s = p_lash->switches[sw]; - dimension = s->node->dimension; - n = sprintf(buf, "["); - for (i = 0; i < dimension; i++) { - n += snprintf(buf + n, sizeof(buf) - n, - "%2d", s->node->coord[i]); - if (n > sizeof(buf)) - n = sizeof(buf); - if (i != dimension - 1) { - n += snprintf(buf + n, sizeof(buf) - n, "%s", ","); - if (n > sizeof(buf)) - n = sizeof(buf); - } - } - n += snprintf(buf + n, sizeof(buf) - n, "]"); - if (n > sizeof(buf)) - n = sizeof(buf); - for (j = 0; j < s->node->num_links; j++) { - s2 = p_lash->switches[s->node->links[j]->switch_id]; - n += snprintf(buf + n, sizeof(buf) - n, " [%d]->[", j); - if (n > sizeof(buf)) - n = sizeof(buf); - for (k = 0; k < dimension; k++) { - n += snprintf(buf + n, sizeof(buf) - n, "%2d", - s2->node->coord[k]); - if (n > sizeof(buf)) - n = sizeof(buf); - if (k != dimension - 1) { - n += snprintf(buf + n, sizeof(buf) - n, - ","); - if (n > sizeof(buf)) - n = sizeof(buf); - } - } - n += snprintf(buf + n, sizeof(buf) - n, "]"); - if (n > sizeof(buf)) - n = sizeof(buf); - } - OSM_LOG(p_log, OSM_LOG_DEBUG, "%s\n", buf); - } - - OSM_LOG_EXIT(p_log); -} - -/* - * osm_do_mesh_analysis - */ -int osm_do_mesh_analysis(lash_t *p_lash) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - mesh_t *mesh; - int max_class = -1; - int max_class_num = 0; - int max_class_type = -1; - int i; - switch_t *s; - char buf[256], *p; - - OSM_LOG_ENTER(p_log); - - mesh = mesh_create(p_lash); - if (!mesh) - goto err; - - if (get_local_geometry(p_lash, mesh)) - goto err; - - if (mesh->num_class == 0) { - OSM_LOG(p_log, OSM_LOG_INFO, - "found no likely mesh nodes - done\n"); - goto done; - } - - /* - * find dominant switch class - */ - OSM_LOG(p_log, OSM_LOG_INFO, "found %d node class%s\n", - mesh->num_class, (mesh->num_class == 1)? "" : "es"); - for (i = 0; i < mesh->num_class; i++) { - OSM_LOG(p_log, OSM_LOG_INFO, - "class[%d] has %d members with type = %d\n", - i, mesh->class_count[i], - p_lash->switches[mesh->class_type[i]]->node->type); - if (mesh->class_count[i] > max_class_num) { - max_class = i; - max_class_num = mesh->class_count[i]; - max_class_type = mesh->class_type[i]; - } - } - - s = p_lash->switches[max_class_type]; - - p = buf; - p += sprintf(p, "%snode shape is ", - (mesh->num_class == 1) ? "" : "most common "); - - if (s->node->type) { - const struct mesh_info *t = &mesh_info[s->node->type]; - - for (i = 0; i < t->dimension; i++) { - p += sprintf(p, "%s%d%s", i? " x " : "", t->size[i], - (t->size[i] == 6)? "+" : ""); - } - p += sprintf(p, " mesh\n"); - - mesh->dimension = t->dimension; - } else { - p += sprintf(p, "unknown geometry\n"); - } - - OSM_LOG(p_log, OSM_LOG_INFO, "%s", buf); - - OSM_LOG(p_log, OSM_LOG_INFO, "poly = %s\n", - poly_print(s->node->num_links, s->node->poly)); - - if (s->node->type) { - make_geometry(p_lash, max_class_type); - - if (make_coord(p_lash, mesh, max_class_type)) - goto err; - - if (measure_geometry(p_lash, mesh)) - goto err; - - if (reorder_links(p_lash, mesh)) - goto err; - - sort_switches(p_lash, mesh); - - p = buf; - p += sprintf(p, "found "); - for (i = 0; i < mesh->dimension; i++) - p += sprintf(p, "%s%d", i? " x " : "", mesh->size[i]); - p += sprintf(p, " mesh\n"); - - OSM_LOG(p_log, OSM_LOG_INFO, "%s", buf); - } - - if (osm_log_is_active(p_log, OSM_LOG_DEBUG)) - dump_mesh(p_lash); - -done: - mesh_delete(mesh); - OSM_LOG_EXIT(p_log); - return 0; - -err: - mesh_delete(mesh); - OSM_LOG_EXIT(p_log); - return -1; -} diff --git a/branches/opensm_3/user/opensm/osm_mtree.c b/branches/opensm_3/user/opensm/osm_mtree.c deleted file mode 100644 index f36993c9..00000000 --- a/branches/opensm_3/user/opensm/osm_mtree.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_mtree_node_t. - * This file implements the Multicast Tree object. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include - -osm_mtree_node_t *osm_mtree_node_new(IN const osm_switch_t * p_sw) -{ - osm_mtree_node_t *p_mtn; - uint32_t i; - - p_mtn = malloc(sizeof(osm_mtree_node_t) + - sizeof(void *) * (p_sw->num_ports - 1)); - if (!p_mtn) - return NULL; - - memset(p_mtn, 0, sizeof(*p_mtn)); - p_mtn->p_sw = p_sw; - p_mtn->max_children = p_sw->num_ports; - for (i = 0; i < p_mtn->max_children; i++) - p_mtn->child_array[i] = NULL; - - return p_mtn; -} - -void osm_mtree_destroy(IN osm_mtree_node_t * p_mtn) -{ - uint32_t i; - - if (p_mtn == NULL) - return; - - if (p_mtn->child_array != NULL) - for (i = 0; i < p_mtn->max_children; i++) - if ((p_mtn->child_array[i] != NULL) && - (p_mtn->child_array[i] != OSM_MTREE_LEAF)) - osm_mtree_destroy(p_mtn->child_array[i]); - - free(p_mtn); -} - -#if 0 -static void mtree_dump(IN osm_mtree_node_t * p_mtn) -{ - uint32_t i; - - if (p_mtn == NULL) - return; - - printf("GUID:0x%016" PRIx64 " max_children:%u\n", - cl_ntoh64(p_mtn->p_sw->p_node->node_info.node_guid), - p_mtn->max_children); - if (p_mtn->child_array != NULL) { - for (i = 0; i < p_mtn->max_children; i++) { - printf("i=%d\n", i); - if ((p_mtn->child_array[i] != NULL) - && (p_mtn->child_array[i] != OSM_MTREE_LEAF)) - mtree_dump(p_mtn->child_array[i]); - } - } -} -#endif diff --git a/branches/opensm_3/user/opensm/osm_multicast.c b/branches/opensm_3/user/opensm/osm_multicast.c deleted file mode 100644 index 1dab4302..00000000 --- a/branches/opensm_3/user/opensm/osm_multicast.c +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006,2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of multicast functions. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include - -static osm_mgrp_box_t *mgrp_box_new(uint16_t mlid) -{ - osm_mgrp_box_t *mbox = malloc(sizeof(*mbox)); - if (!mbox) - return NULL; - - memset(mbox, 0, sizeof(*mbox)); - mbox->mlid = mlid; - cl_qlist_init(&mbox->mgrp_list); - - return mbox; -} - -void mgrp_box_delete(osm_mgrp_box_t *mbox) -{ - osm_mtree_destroy(mbox->root); - free(mbox); -} - -void mgrp_delete(IN osm_mgrp_t * p_mgrp) -{ - osm_mcm_port_t *p_mcm_port; - osm_mcm_port_t *p_next_mcm_port; - - CL_ASSERT(p_mgrp); - - p_next_mcm_port = - (osm_mcm_port_t *) cl_qmap_head(&p_mgrp->mcm_port_tbl); - while (p_next_mcm_port != - (osm_mcm_port_t *) cl_qmap_end(&p_mgrp->mcm_port_tbl)) { - p_mcm_port = p_next_mcm_port; - p_next_mcm_port = - (osm_mcm_port_t *) cl_qmap_next(&p_mcm_port->map_item); - osm_mcm_port_delete(p_mcm_port); - } - - free(p_mgrp); -} - -void osm_mgrp_box_delete(osm_mgrp_box_t *mbox) -{ - osm_mgrp_t *mgrp=NULL; - while(cl_qlist_count(&mbox->mgrp_list)) { - mgrp = cl_item_obj(cl_qlist_remove_head(&mbox->mgrp_list), - mgrp, list_item); - mgrp_delete(mgrp); - } - mgrp_box_delete(mbox); -} - -osm_mgrp_t *osm_mgrp_new(IN osm_subn_t * subn, IN ib_net16_t mlid, - IN ib_member_rec_t * mcmr) -{ - osm_mgrp_t *p_mgrp; - osm_mgrp_box_t *mbox; - - p_mgrp = (osm_mgrp_t *) malloc(sizeof(*p_mgrp)); - if (!p_mgrp) - return NULL; - - memset(p_mgrp, 0, sizeof(*p_mgrp)); - cl_qmap_init(&p_mgrp->mcm_port_tbl); - p_mgrp->mlid = mlid; - p_mgrp->mcmember_rec = *mcmr; - - mbox = osm_get_mbox_by_mlid(subn, p_mgrp->mlid); - if (!mbox && !(mbox = mgrp_box_new(cl_ntoh16(p_mgrp->mlid)))) { - free(p_mgrp); - return NULL; - } - - cl_qlist_insert_tail(&mbox->mgrp_list, &p_mgrp->list_item); - subn->mboxes[mbox->mlid - IB_LID_MCAST_START_HO] = mbox; - - cl_fmap_insert(&subn->mgrp_mgid_tbl, &p_mgrp->mcmember_rec.mgid, - &p_mgrp->map_item); - - return p_mgrp; -} - -void osm_mgrp_cleanup(osm_subn_t * subn, osm_mgrp_t * mgrp) -{ - osm_mgrp_box_t *mbox; - osm_mcm_port_t *mcm_port; - - if (mgrp->full_members) - return; - - while (cl_qmap_count(&mgrp->mcm_port_tbl)) { - mcm_port = (osm_mcm_port_t *)cl_qmap_head(&mgrp->mcm_port_tbl); - cl_qmap_remove_item(&mgrp->mcm_port_tbl, &mcm_port->map_item); - cl_qlist_remove_item(&mcm_port->port->mcm_list, - &mcm_port->list_item); - osm_mcm_port_delete(mcm_port); - } - - if (mgrp->well_known) - return; - - cl_fmap_remove_item(&subn->mgrp_mgid_tbl, &mgrp->map_item); - - mbox = osm_get_mbox_by_mlid(subn, mgrp->mlid); - cl_qlist_remove_item(&mbox->mgrp_list, &mgrp->list_item); - if (cl_is_qlist_empty(&mbox->mgrp_list)) { - subn->mboxes[cl_ntoh16(mgrp->mlid) - IB_LID_MCAST_START_HO] = NULL; - mgrp_box_delete(mbox); - } - free(mgrp); -} - -static void mgrp_send_notice(osm_subn_t * subn, osm_log_t * log, - osm_mgrp_t * mgrp, unsigned num) -{ - ib_mad_notice_attr_t notice; - ib_api_status_t status; - - notice.generic_type = 0x83; /* generic SubnMgt type */ - ib_notice_set_prod_type_ho(¬ice, 4); /* A Class Manager generator */ - notice.g_or_v.generic.trap_num = CL_HTON16(num); - /* The sm_base_lid is saved in network order already. */ - notice.issuer_lid = subn->sm_base_lid; - /* following o14-12.1.11 and table 120 p726 */ - /* we need to provide the MGID */ - memcpy(¬ice.data_details.ntc_64_67.gid, - &mgrp->mcmember_rec.mgid, sizeof(ib_gid_t)); - - /* According to page 653 - the issuer gid in this case of trap - is the SM gid, since the SM is the initiator of this trap. */ - notice.issuer_gid.unicast.prefix = subn->opt.subnet_prefix; - notice.issuer_gid.unicast.interface_id = subn->sm_port_guid; - - if ((status = osm_report_notice(log, subn, ¬ice))) - OSM_LOG(log, OSM_LOG_ERROR, "ERR 7601: " - "Error sending trap reports (%s)\n", - ib_get_err_str(status)); -} - -osm_mcm_port_t *osm_mgrp_add_port(IN osm_subn_t * subn, osm_log_t * log, - IN osm_mgrp_t * mgrp, osm_port_t *port, - IN ib_member_rec_t *mcmr, IN boolean_t proxy) -{ - osm_mcm_port_t *mcm_port; - cl_map_item_t *prev_item; - uint8_t prev_join_state = 0, join_state = mcmr->scope_state; - uint8_t prev_scope; - - if (osm_log_is_active(log, OSM_LOG_VERBOSE)) { - char gid_str[INET6_ADDRSTRLEN]; - OSM_LOG(log, OSM_LOG_VERBOSE, "Port 0x%016" PRIx64 " joining " - "MC group %s (mlid 0x%x)\n", cl_ntoh64(port->guid), - inet_ntop(AF_INET6, mgrp->mcmember_rec.mgid.raw, - gid_str, sizeof(gid_str)), - cl_ntoh16(mgrp->mlid)); - } - - mcm_port = osm_mcm_port_new(port, mgrp, mcmr, proxy); - if (!mcm_port) - return NULL; - - /* - prev_item = cl_qmap_insert(...) - Pointer to the item in the map with the specified key. If insertion - was successful, this is the pointer to the item. If an item with the - specified key already exists in the map, the pointer to that item is - returned. - */ - prev_item = cl_qmap_insert(&mgrp->mcm_port_tbl, port->guid, - &mcm_port->map_item); - - /* if already exists - revert the insertion and only update join state */ - if (prev_item != &mcm_port->map_item) { - osm_mcm_port_delete(mcm_port); - mcm_port = (osm_mcm_port_t *) prev_item; - - ib_member_get_scope_state(mcm_port->scope_state, &prev_scope, - &prev_join_state); - mcm_port->scope_state = - ib_member_set_scope_state(prev_scope, - prev_join_state | join_state); - } else { - cl_qlist_insert_tail(&port->mcm_list, &mcm_port->list_item); - osm_sm_reroute_mlid(&subn->p_osm->sm, mgrp->mlid); - } - - /* o15.0.1.11: copy the join state */ - mcmr->scope_state = mcm_port->scope_state; - - if ((join_state & IB_JOIN_STATE_FULL) && - !(prev_join_state & IB_JOIN_STATE_FULL) && - ++mgrp->full_members == 1) - mgrp_send_notice(subn, log, mgrp, 66); - - subn->p_osm->sa.dirty = TRUE; - return mcm_port; -} - -void osm_mgrp_remove_port(osm_subn_t * subn, osm_log_t * log, osm_mgrp_t * mgrp, - osm_mcm_port_t * mcm_port, ib_member_rec_t *mcmr) -{ - uint8_t join_state = mcmr->scope_state & 0xf; - uint8_t port_join_state, new_join_state; - - /* - * according to the same o15-0.1.14 we get the stored - * JoinState and the request JoinState and they must be - * opposite to leave - otherwise just update it - */ - port_join_state = mcm_port->scope_state & 0x0F; - new_join_state = port_join_state & ~join_state; - - if (osm_log_is_active(log, OSM_LOG_VERBOSE)) { - char gid_str[INET6_ADDRSTRLEN]; - OSM_LOG(log, OSM_LOG_VERBOSE, - "Port 0x%" PRIx64 " leaving MC group %s (mlid 0x%x)\n", - cl_ntoh64(mcm_port->port->guid), - inet_ntop(AF_INET6, mgrp->mcmember_rec.mgid.raw, - gid_str, sizeof(gid_str)), - cl_ntoh16(mgrp->mlid)); - } - - if (new_join_state) { - mcm_port->scope_state = - new_join_state | (mcm_port->scope_state & 0xf0); - OSM_LOG(log, OSM_LOG_DEBUG, - "updating port 0x%" PRIx64 " JoinState 0x%x -> 0x%x\n", - cl_ntoh64(mcm_port->port->guid), - port_join_state, new_join_state); - mcmr->scope_state = mcm_port->scope_state; - } else { - mcmr->scope_state = mcm_port->scope_state; - OSM_LOG(log, OSM_LOG_DEBUG, "removing port 0x%" PRIx64 "\n", - cl_ntoh64(mcm_port->port->guid)); - cl_qmap_remove_item(&mgrp->mcm_port_tbl, &mcm_port->map_item); - cl_qlist_remove_item(&mcm_port->port->mcm_list, - &mcm_port->list_item); - osm_mcm_port_delete(mcm_port); - osm_sm_reroute_mlid(&subn->p_osm->sm, mgrp->mlid); - } - - /* no more full members so the group will be deleted after re-route - but only if it is not a well known group */ - if ((port_join_state & IB_JOIN_STATE_FULL) && - !(new_join_state & IB_JOIN_STATE_FULL) && - --mgrp->full_members == 0) { - mgrp_send_notice(subn, log, mgrp, 67); - osm_mgrp_cleanup(subn, mgrp); - } - - subn->p_osm->sa.dirty = TRUE; -} - -void osm_mgrp_delete_port(osm_subn_t * subn, osm_log_t * log, osm_mgrp_t * mgrp, - ib_net64_t port_guid) -{ - ib_member_rec_t mcmrec; - cl_map_item_t *item = cl_qmap_get(&mgrp->mcm_port_tbl, port_guid); - - if (item != cl_qmap_end(&mgrp->mcm_port_tbl)) { - mcmrec.scope_state = 0xf; - osm_mgrp_remove_port(subn, log, mgrp, (osm_mcm_port_t *) item, - &mcmrec); - } -} - -osm_mcm_port_t *osm_mgrp_get_mcm_port(IN const osm_mgrp_t * p_mgrp, - IN ib_net64_t port_guid) -{ - cl_map_item_t *item = cl_qmap_get(&p_mgrp->mcm_port_tbl, port_guid); - if (item != cl_qmap_end(&p_mgrp->mcm_port_tbl)) - return (osm_mcm_port_t *)item; - return NULL; -} diff --git a/branches/opensm_3/user/opensm/osm_node.c b/branches/opensm_3/user/opensm/osm_node.c deleted file mode 100644 index e6d7ccd3..00000000 --- a/branches/opensm_3/user/opensm/osm_node.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_node_t. - * This object represents an Infiniband Node. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include - -void osm_node_init_physp(IN osm_node_t * p_node, uint8_t port_num, - IN const osm_madw_t * p_madw) -{ - ib_net64_t port_guid; - ib_smp_t *p_smp; - ib_node_info_t *p_ni; - - p_smp = osm_madw_get_smp_ptr(p_madw); - - p_ni = ib_smp_get_payload_ptr(p_smp); - port_guid = p_ni->port_guid; - - CL_ASSERT(port_num < p_node->physp_tbl_size); - - osm_physp_init(&p_node->physp_table[port_num], - port_guid, port_num, p_node, - osm_madw_get_bind_handle(p_madw), - p_smp->hop_count, p_smp->initial_path); -} - -osm_node_t *osm_node_new(IN const osm_madw_t * p_madw) -{ - osm_node_t *p_node; - ib_smp_t *p_smp; - ib_node_info_t *p_ni; - uint8_t i; - uint32_t size; - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_ni = ib_smp_get_payload_ptr(p_smp); - - /* - The node object already contains one physical port object. - Therefore, subtract 1 from the number of physical ports - used by the switch. This is not done for CA's since they - need to occupy 1 more physp than they physically have since - we still reserve room for a "port 0". - */ - size = p_ni->num_ports; - - p_node = malloc(sizeof(*p_node) + sizeof(osm_physp_t) * size); - if (!p_node) - return NULL; - - memset(p_node, 0, sizeof(*p_node) + sizeof(osm_physp_t) * size); - p_node->node_info = *p_ni; - p_node->physp_tbl_size = size + 1; - - /* - Construct Physical Port objects owned by this Node. - Then, initialize the Physical Port through with we - discovered this port. - For switches, all ports have the same GUID. - For CAs and routers, each port has a different GUID, so we only - know the GUID for the port that responded to our - Get(NodeInfo). - */ - for (i = 0; i < p_node->physp_tbl_size; i++) - osm_physp_construct(&p_node->physp_table[i]); - - if (p_ni->node_type == IB_NODE_TYPE_SWITCH) - for (i = 0; i <= p_ni->num_ports; i++) - osm_node_init_physp(p_node, i, p_madw); - else - osm_node_init_physp(p_node, - ib_node_info_get_local_port_num(p_ni), - p_madw); - p_node->print_desc = strdup(OSM_NODE_DESC_UNKNOWN); - - return p_node; -} - -static void node_destroy(IN osm_node_t * p_node) -{ - uint16_t i; - - /* - Cleanup all physports - */ - for (i = 0; i < p_node->physp_tbl_size; i++) - osm_physp_destroy(&p_node->physp_table[i]); - - /* cleanup printable node_desc field */ - if (p_node->print_desc) - free(p_node->print_desc); -} - -void osm_node_delete(IN OUT osm_node_t ** p_node) -{ - CL_ASSERT(p_node && *p_node); - node_destroy(*p_node); - free(*p_node); - *p_node = NULL; -} - -void osm_node_link(IN osm_node_t * p_node, IN uint8_t port_num, - IN osm_node_t * p_remote_node, IN uint8_t remote_port_num) -{ - osm_physp_t *p_physp; - osm_physp_t *p_remote_physp; - - CL_ASSERT(port_num < p_node->physp_tbl_size); - CL_ASSERT(remote_port_num < p_remote_node->physp_tbl_size); - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - p_remote_physp = osm_node_get_physp_ptr(p_remote_node, remote_port_num); - - if (p_physp->p_remote_physp) - p_physp->p_remote_physp->p_remote_physp = NULL; - if (p_remote_physp->p_remote_physp) - p_remote_physp->p_remote_physp->p_remote_physp = NULL; - - osm_physp_link(p_physp, p_remote_physp); -} - -void osm_node_unlink(IN osm_node_t * p_node, IN uint8_t port_num, - IN osm_node_t * p_remote_node, IN uint8_t remote_port_num) -{ - osm_physp_t *p_physp; - osm_physp_t *p_remote_physp; - - CL_ASSERT(port_num < p_node->physp_tbl_size); - CL_ASSERT(remote_port_num < p_remote_node->physp_tbl_size); - - if (osm_node_link_exists(p_node, port_num, - p_remote_node, remote_port_num)) { - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - p_remote_physp = - osm_node_get_physp_ptr(p_remote_node, remote_port_num); - - osm_physp_unlink(p_physp, p_remote_physp); - } -} - -boolean_t osm_node_link_exists(IN osm_node_t * p_node, IN uint8_t port_num, - IN osm_node_t * p_remote_node, - IN uint8_t remote_port_num) -{ - osm_physp_t *p_physp; - osm_physp_t *p_remote_physp; - - CL_ASSERT(port_num < p_node->physp_tbl_size); - CL_ASSERT(remote_port_num < p_remote_node->physp_tbl_size); - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - p_remote_physp = osm_node_get_physp_ptr(p_remote_node, remote_port_num); - - return osm_physp_link_exists(p_physp, p_remote_physp); -} - -boolean_t osm_node_link_has_valid_ports(IN osm_node_t * p_node, - IN uint8_t port_num, - IN osm_node_t * p_remote_node, - IN uint8_t remote_port_num) -{ - osm_physp_t *p_physp; - osm_physp_t *p_remote_physp; - - CL_ASSERT(port_num < p_node->physp_tbl_size); - CL_ASSERT(remote_port_num < p_remote_node->physp_tbl_size); - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - p_remote_physp = osm_node_get_physp_ptr(p_remote_node, remote_port_num); - - return (p_physp && p_remote_physp); -} - -boolean_t osm_node_has_any_link(IN osm_node_t * p_node, IN uint8_t port_num) -{ - osm_physp_t *p_physp; - CL_ASSERT(port_num < p_node->physp_tbl_size); - p_physp = osm_node_get_physp_ptr(p_node, port_num); - return osm_physp_has_any_link(p_physp); -} - -osm_node_t *osm_node_get_remote_node(IN osm_node_t * p_node, - IN uint8_t port_num, - OUT uint8_t * p_remote_port_num) -{ - osm_physp_t *p_physp; - osm_physp_t *p_remote_physp; - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - - if (!p_physp || !osm_physp_has_any_link(p_physp)) - return NULL; - - p_remote_physp = osm_physp_get_remote(p_physp); - if (p_remote_port_num) - *p_remote_port_num = osm_physp_get_port_num(p_remote_physp); - - return osm_physp_get_node_ptr(p_remote_physp); -} - -/********************************************************************** - The lock must be held before calling this function. -**********************************************************************/ -ib_net16_t osm_node_get_remote_base_lid(IN osm_node_t * p_node, - IN uint32_t port_num) -{ - osm_physp_t *p_physp; - osm_physp_t *p_remote_physp; - CL_ASSERT(port_num < p_node->physp_tbl_size); - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (p_physp) { - p_remote_physp = osm_physp_get_remote(p_physp); - return osm_physp_get_base_lid(p_remote_physp); - } - - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_node_desc_rcv.c b/branches/opensm_3/user/opensm/osm_node_desc_rcv.c deleted file mode 100644 index 53161fa1..00000000 --- a/branches/opensm_3/user/opensm/osm_node_desc_rcv.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_nd_rcv_t. - * This object represents the NodeDescription Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static void nd_rcv_process_nd(IN osm_sm_t * sm, IN osm_node_t * p_node, - IN const ib_node_desc_t * p_nd) -{ - char *tmp_desc; - char print_desc[IB_NODE_DESCRIPTION_SIZE + 1]; - - OSM_LOG_ENTER(sm->p_log); - - memcpy(&p_node->node_desc.description, p_nd, sizeof(*p_nd)); - - /* also set up a printable version */ - memcpy(print_desc, p_nd, sizeof(*p_nd)); - print_desc[IB_NODE_DESCRIPTION_SIZE] = '\0'; - tmp_desc = remap_node_name(sm->p_subn->p_osm->node_name_map, - cl_ntoh64(osm_node_get_node_guid(p_node)), - print_desc); - - /* make a copy for this node to "own" */ - if (p_node->print_desc) - free(p_node->print_desc); - p_node->print_desc = tmp_desc; - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Node 0x%" PRIx64 "\n\t\t\t\tDescription = %s\n", - cl_ntoh64(osm_node_get_node_guid(p_node)), p_node->print_desc); - - OSM_LOG_EXIT(sm->p_log); -} - -void osm_nd_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_node_desc_t *p_nd; - ib_smp_t *p_smp; - osm_node_t *p_node; - ib_net64_t node_guid; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_nd = ib_smp_get_payload_ptr(p_smp); - - /* Acquire the node object and add the node description. */ - node_guid = osm_madw_get_nd_context_ptr(p_madw)->node_guid; - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - p_node = osm_get_node_by_guid(sm->p_subn, node_guid); - if (!p_node) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0B01: " - "NodeDescription received for nonexistent node " - "0x%" PRIx64 "\n", cl_ntoh64(node_guid)); - else - nd_rcv_process_nd(sm, p_node, p_nd); - - CL_PLOCK_RELEASE(sm->p_lock); - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_node_info_rcv.c b/branches/opensm_3/user/opensm/osm_node_info_rcv.c deleted file mode 100755 index 3e18d0f2..00000000 --- a/branches/opensm_3/user/opensm/osm_node_info_rcv.c +++ /dev/null @@ -1,804 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_ni_rcv_t. - * This object represents the NodeInfo Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static void report_duplicated_guid(IN osm_sm_t * sm, osm_physp_t * p_physp, - osm_node_t * p_neighbor_node, - const uint8_t port_num) -{ - osm_physp_t *p_old, *p_new; - osm_dr_path_t path; - - p_old = p_physp->p_remote_physp; - p_new = osm_node_get_physp_ptr(p_neighbor_node, port_num); - - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D01: " - "Found duplicated node.\n" - "Node 0x%" PRIx64 " port %u is reachable from remote node " - "0x%" PRIx64 " port %u and remote node 0x%" PRIx64 " port %u.\n" - "Paths are:\n", - cl_ntoh64(p_physp->p_node->node_info.node_guid), - p_physp->port_num, - cl_ntoh64(p_old->p_node->node_info.node_guid), p_old->port_num, - cl_ntoh64(p_new->p_node->node_info.node_guid), p_new->port_num); - - osm_dump_dr_path(sm->p_log, osm_physp_get_dr_path_ptr(p_physp), - OSM_LOG_ERROR); - - path = *osm_physp_get_dr_path_ptr(p_new); - if (osm_dr_path_extend(&path, port_num)) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D05: " - "DR path with hop count %d couldn't be extended\n", - path.hop_count); - osm_dump_dr_path(sm->p_log, &path, OSM_LOG_ERROR); - - osm_log(sm->p_log, OSM_LOG_SYS, - "FATAL: duplicated guids or 12x lane reversal\n"); -} - -static void requery_dup_node_info(IN osm_sm_t * sm, osm_physp_t * p_physp, - unsigned count) -{ - osm_madw_context_t context; - osm_dr_path_t path; - cl_status_t status; - - path = *osm_physp_get_dr_path_ptr(p_physp->p_remote_physp); - if (osm_dr_path_extend(&path, p_physp->p_remote_physp->port_num)) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D08: " - "DR path with hop count %d couldn't be extended\n", - path.hop_count); - return; - } - - context.ni_context.node_guid = - p_physp->p_remote_physp->p_node->node_info.port_guid; - context.ni_context.port_num = p_physp->p_remote_physp->port_num; - context.ni_context.dup_node_guid = p_physp->p_node->node_info.node_guid; - context.ni_context.dup_port_num = p_physp->port_num; - context.ni_context.dup_count = count; - - status = osm_req_get(sm, &path, IB_MAD_ATTR_NODE_INFO, 0, - CL_DISP_MSGID_NONE, &context); - - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D02: " - "Failure initiating NodeInfo request (%s)\n", - ib_get_err_str(status)); -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void ni_rcv_set_links(IN osm_sm_t * sm, osm_node_t * p_node, - const uint8_t port_num, - const osm_ni_context_t * p_ni_context) -{ - osm_node_t *p_neighbor_node; - osm_physp_t *p_physp; - - OSM_LOG_ENTER(sm->p_log); - - /* - A special case exists in which the node we're trying to - link is our own node. In this case, the guid value in - the ni_context will be zero. - */ - if (p_ni_context->node_guid == 0) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Nothing to link for our own node 0x%" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - goto _exit; - } - - p_neighbor_node = osm_get_node_by_guid(sm->p_subn, - p_ni_context->node_guid); - if (!p_neighbor_node) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D10: " - "Unexpected removal of neighbor node 0x%" PRIx64 "\n", - cl_ntoh64(p_ni_context->node_guid)); - goto _exit; - } - - /* When setting the link, ports on both - sides of the link should be initialized */ - CL_ASSERT(osm_node_link_has_valid_ports(p_node, port_num, - p_neighbor_node, - p_ni_context->port_num)); - - if (osm_node_link_exists(p_node, port_num, - p_neighbor_node, p_ni_context->port_num)) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Link already exists\n"); - goto _exit; - } - - if (osm_node_has_any_link(p_node, port_num) && - sm->p_subn->force_heavy_sweep == FALSE && - (!p_ni_context->dup_count || - (p_ni_context->dup_node_guid == osm_node_get_node_guid(p_node) && - p_ni_context->dup_port_num == port_num))) { - /* - Uh oh... - This could be reconnected ports, but also duplicated GUID - (2 nodes have the same guid) or a 12x link with lane reversal - that is not configured correctly. - We will try to recover by querying NodeInfo again. - In order to catch even fast port moving to new location(s) - and back we will count up to 5. - Some crazy reconnections (newly created switch loop right - before targeted CA) will not be catched this way. So in worst - case - report GUID duplication and request new discovery. - When switch node is targeted NodeInfo querying will be done - in opposite order, this is much stronger check, unfortunately - it is impossible with CAs. - */ - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (p_ni_context->dup_count > 5) { - report_duplicated_guid(sm, p_physp, p_neighbor_node, - p_ni_context->port_num); - sm->p_subn->force_heavy_sweep = TRUE; - } else if (p_node->sw) - requery_dup_node_info(sm, p_physp->p_remote_physp, - p_ni_context->dup_count + 1); - else - requery_dup_node_info(sm, p_physp, - p_ni_context->dup_count + 1); - } - - /* - When there are only two nodes with exact same guids (connected back - to back) - the previous check for duplicated guid will not catch - them. But the link will be from the port to itself... - Enhanced Port 0 is an exception to this - */ - if (osm_node_get_node_guid(p_node) == p_ni_context->node_guid && - port_num == p_ni_context->port_num && - port_num != 0 && cl_qmap_count(&sm->p_subn->sw_guid_tbl) == 0) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Duplicate GUID found by link from a port to itself:" - "node 0x%" PRIx64 ", port number %u\n", - cl_ntoh64(osm_node_get_node_guid(p_node)), port_num); - p_physp = osm_node_get_physp_ptr(p_node, port_num); - osm_dump_dr_path(sm->p_log, osm_physp_get_dr_path_ptr(p_physp), - OSM_LOG_VERBOSE); - - if (sm->p_subn->opt.exit_on_fatal == TRUE) { - osm_log(sm->p_log, OSM_LOG_SYS, - "Errors on subnet. Duplicate GUID found " - "by link from a port to itself. " - "See verbose opensm.log for more details\n"); - exit(1); - } - } - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Creating new link between:\n\t\t\t\tnode 0x%" PRIx64 - ", port number %u and\n\t\t\t\tnode 0x%" PRIx64 - ", port number %u\n", - cl_ntoh64(osm_node_get_node_guid(p_node)), port_num, - cl_ntoh64(p_ni_context->node_guid), p_ni_context->port_num); - - if (sm->ucast_mgr.cache_valid) - osm_ucast_cache_check_new_link(&sm->ucast_mgr, p_node, port_num, - p_neighbor_node, - p_ni_context->port_num); - - osm_node_link(p_node, port_num, p_neighbor_node, - p_ni_context->port_num); - -_exit: - OSM_LOG_EXIT(sm->p_log); -} - -static void ni_rcv_get_port_info(IN osm_sm_t * sm, IN osm_node_t * node, - IN const osm_madw_t * madw) -{ - osm_madw_context_t context; - osm_physp_t *physp; - ib_node_info_t *ni; - unsigned port, num_ports; - ib_api_status_t status; - - ni = ib_smp_get_payload_ptr(osm_madw_get_smp_ptr(madw)); - - if (ni->node_type == IB_NODE_TYPE_SWITCH) { - port = 0; - num_ports = osm_node_get_num_physp(node); - } else { - port = ib_node_info_get_local_port_num(ni); - num_ports = port + 1; - } - - physp = osm_node_get_physp_ptr(node, port); - - context.pi_context.node_guid = osm_node_get_node_guid(node); - context.pi_context.port_guid = osm_physp_get_port_guid(physp); - context.pi_context.set_method = FALSE; - context.pi_context.light_sweep = FALSE; - context.pi_context.active_transition = FALSE; - - for (; port < num_ports; port++) { - status = osm_req_get(sm, osm_physp_get_dr_path_ptr(physp), - IB_MAD_ATTR_PORT_INFO, cl_hton32(port), - CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR OD02: " - "Failure initiating PortInfo request (%s)\n", - ib_get_err_str(status)); - } -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -void osm_req_get_node_desc(IN osm_sm_t * sm, osm_physp_t * p_physp) -{ - ib_api_status_t status = IB_SUCCESS; - osm_madw_context_t context; - - OSM_LOG_ENTER(sm->p_log); - - context.nd_context.node_guid = - osm_node_get_node_guid(osm_physp_get_node_ptr(p_physp)); - - status = osm_req_get(sm, osm_physp_get_dr_path_ptr(p_physp), - IB_MAD_ATTR_NODE_DESC, 0, CL_DISP_MSGID_NONE, - &context); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D03: " - "Failure initiating NodeDescription request (%s)\n", - ib_get_err_str(status)); - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void ni_rcv_get_node_desc(IN osm_sm_t * sm, IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - ib_node_info_t *p_ni; - ib_smp_t *p_smp; - uint8_t port_num; - osm_physp_t *p_physp = NULL; - - OSM_LOG_ENTER(sm->p_log); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_ni = ib_smp_get_payload_ptr(p_smp); - port_num = ib_node_info_get_local_port_num(p_ni); - - /* - Request PortInfo & NodeDescription attributes for the port - that responded to the NodeInfo attribute. - Because this is a channel adapter or router, we are - not allowed to request PortInfo for the other ports. - Set the context union properly, so the recipient - knows which node & port are relevant. - */ - p_physp = osm_node_get_physp_ptr(p_node, port_num); - - osm_req_get_node_desc(sm, p_physp); - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void ni_rcv_process_new_ca_or_router(IN osm_sm_t * sm, - IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - OSM_LOG_ENTER(sm->p_log); - - ni_rcv_get_port_info(sm, p_node, p_madw); - - /* - A node guid of 0 is the corner case that indicates - we discovered our own node. Initialize the subnet - object with the SM's own port guid. - */ - if (osm_madw_get_ni_context_ptr(p_madw)->node_guid == 0) - sm->p_subn->sm_port_guid = p_node->node_info.port_guid; - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void ni_rcv_process_existing_ca_or_router(IN osm_sm_t * sm, - IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - ib_node_info_t *p_ni; - ib_smp_t *p_smp; - osm_port_t *p_port; - osm_port_t *p_port_check; - uint8_t port_num; - osm_physp_t *p_physp; - osm_dr_path_t *p_dr_path; - osm_bind_handle_t h_bind; - - OSM_LOG_ENTER(sm->p_log); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_ni = ib_smp_get_payload_ptr(p_smp); - port_num = ib_node_info_get_local_port_num(p_ni); - h_bind = osm_madw_get_bind_handle(p_madw); - - /* - Determine if we have encountered this node through a - previously undiscovered port. If so, build the new - port object. - */ - p_port = osm_get_port_by_guid(sm->p_subn, p_ni->port_guid); - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Creating new port object with GUID 0x%" PRIx64 "\n", - cl_ntoh64(p_ni->port_guid)); - - osm_node_init_physp(p_node, port_num, p_madw); - - p_port = osm_port_new(p_ni, p_node); - if (p_port == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D04: " - "Unable to create new port object\n"); - goto Exit; - } - - /* - Add the new port object to the database. - */ - p_port_check = - (osm_port_t *) cl_qmap_insert(&sm->p_subn->port_guid_tbl, - p_ni->port_guid, - &p_port->map_item); - if (p_port_check != p_port) { - /* - We should never be here! - Somehow, this port GUID already exists in the table. - */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D12: " - "Port 0x%" PRIx64 " already in the database!\n", - cl_ntoh64(p_ni->port_guid)); - - osm_port_delete(&p_port); - goto Exit; - } - - /* If we are a master, then this means the port is new on the subnet. - Mark it as new - need to send trap 64 for these ports. - The condition that we are master is true, since if we are in discovering - state (meaning we woke up from standby or we are just initializing), - then these ports may be new to us, but are not new on the subnet. - If we are master, then the subnet as we know it is the updated one, - and any new ports we encounter should cause trap 64. C14-72.1.1 */ - if (sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER) - p_port->is_new = 1; - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - } else { - p_physp = osm_node_get_physp_ptr(p_node, port_num); - /* - Update the DR Path to the port, - in case the old one is no longer available. - */ - p_dr_path = osm_physp_get_dr_path_ptr(p_physp); - - osm_dr_path_init(p_dr_path, h_bind, p_smp->hop_count, - p_smp->initial_path); - } - - ni_rcv_get_port_info(sm, p_node, p_madw); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -static void ni_rcv_process_switch(IN osm_sm_t * sm, IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - ib_api_status_t status = IB_SUCCESS; - osm_madw_context_t context; - osm_dr_path_t *path; - ib_smp_t *p_smp; - - OSM_LOG_ENTER(sm->p_log); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - /* update DR path of already initialized switch port 0 */ - path = osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_node, 0)); - osm_dr_path_init(path, osm_madw_get_bind_handle(p_madw), - p_smp->hop_count, p_smp->initial_path); - - context.si_context.node_guid = osm_node_get_node_guid(p_node); - context.si_context.set_method = FALSE; - context.si_context.light_sweep = FALSE; - - /* Request a SwitchInfo attribute */ - status = osm_req_get(sm, path, IB_MAD_ATTR_SWITCH_INFO, - 0, CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) - /* continue despite error */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D06: " - "Failure initiating SwitchInfo request (%s)\n", - ib_get_err_str(status)); - - if (p_node->discovery_count == 1) - ni_rcv_get_port_info(sm, p_node, p_madw); - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void ni_rcv_process_existing_switch(IN osm_sm_t * sm, - IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - OSM_LOG_ENTER(sm->p_log); - - /* - If this switch has already been probed during this sweep, - then don't bother reprobing it. - There is one exception - if the node has been visited, but - for some reason we don't have the switch object (this can happen - if the SwitchInfo mad didn't reach the SM) then we want - to retry to probe the switch. - */ - if (p_node->discovery_count == 1) - ni_rcv_process_switch(sm, p_node, p_madw); - else if (!p_node->sw) { - /* we don't have the SwitchInfo - retry to get it */ - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Retry to get SwitchInfo on node GUID:0x%" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - ni_rcv_process_switch(sm, p_node, p_madw); - } - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void ni_rcv_process_new_switch(IN osm_sm_t * sm, IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - OSM_LOG_ENTER(sm->p_log); - - ni_rcv_process_switch(sm, p_node, p_madw); - - /* - A node guid of 0 is the corner case that indicates - we discovered our own node. Initialize the subnet - object with the SM's own port guid. - */ - if (osm_madw_get_ni_context_ptr(p_madw)->node_guid == 0) - sm->p_subn->sm_port_guid = p_node->node_info.port_guid; - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - The plock must NOT be held before calling this function. -**********************************************************************/ -static void ni_rcv_process_new(IN osm_sm_t * sm, IN const osm_madw_t * p_madw) -{ - osm_node_t *p_node; - osm_node_t *p_node_check; - osm_port_t *p_port; - osm_port_t *p_port_check; - osm_router_t *p_rtr = NULL; - osm_router_t *p_rtr_check; - cl_qmap_t *p_rtr_guid_tbl; - ib_node_info_t *p_ni; - ib_smp_t *p_smp; - osm_ni_context_t *p_ni_context; - uint8_t port_num; - - OSM_LOG_ENTER(sm->p_log); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_ni = ib_smp_get_payload_ptr(p_smp); - p_ni_context = osm_madw_get_ni_context_ptr(p_madw); - port_num = ib_node_info_get_local_port_num(p_ni); - - osm_dump_smp_dr_path(sm->p_log, p_smp, OSM_LOG_VERBOSE); - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Discovered new %s node," - "\n\t\t\t\tGUID 0x%" PRIx64 ", TID 0x%" PRIx64 "\n", - ib_get_node_type_str(p_ni->node_type), - cl_ntoh64(p_ni->node_guid), cl_ntoh64(p_smp->trans_id)); - - p_node = osm_node_new(p_madw); - if (p_node == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D07: " - "Unable to create new node object\n"); - goto Exit; - } - - /* - Create a new port object to represent this node's physical - ports in the port table. - */ - p_port = osm_port_new(p_ni, p_node); - if (p_port == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D14: " - "Unable to create new port object\n"); - osm_node_delete(&p_node); - goto Exit; - } - - /* - Add the new port object to the database. - */ - p_port_check = - (osm_port_t *) cl_qmap_insert(&sm->p_subn->port_guid_tbl, - p_ni->port_guid, &p_port->map_item); - if (p_port_check != p_port) { - /* - We should never be here! - Somehow, this port GUID already exists in the table. - */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D15: " - "Duplicate Port GUID 0x%" PRIx64 - "! Found by the two directed routes:\n", - cl_ntoh64(p_ni->port_guid)); - osm_dump_dr_path(sm->p_log, - osm_physp_get_dr_path_ptr(p_port->p_physp), - OSM_LOG_ERROR); - osm_dump_dr_path(sm->p_log, - osm_physp_get_dr_path_ptr(p_port_check-> - p_physp), - OSM_LOG_ERROR); - osm_port_delete(&p_port); - osm_node_delete(&p_node); - goto Exit; - } - - /* If we are a master, then this means the port is new on the subnet. - Mark it as new - need to send trap 64 on these ports. - The condition that we are master is true, since if we are in discovering - state (meaning we woke up from standby or we are just initializing), - then these ports may be new to us, but are not new on the subnet. - If we are master, then the subnet as we know it is the updated one, - and any new ports we encounter should cause trap 64. C14-72.1.1 */ - if (sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER) - p_port->is_new = 1; - - /* If there were RouterInfo or other router attribute, - this would be elsewhere */ - if (p_ni->node_type == IB_NODE_TYPE_ROUTER) { - if ((p_rtr = osm_router_new(p_port)) == NULL) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D1A: " - "Unable to create new router object\n"); - else { - p_rtr_guid_tbl = &sm->p_subn->rtr_guid_tbl; - p_rtr_check = - (osm_router_t *) cl_qmap_insert(p_rtr_guid_tbl, - p_ni->port_guid, - &p_rtr->map_item); - if (p_rtr_check != p_rtr) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D1B: " - "Unable to add port GUID:0x%016" PRIx64 - " to router table\n", - cl_ntoh64(p_ni->port_guid)); - } - } - - p_node_check = - (osm_node_t *) cl_qmap_insert(&sm->p_subn->node_guid_tbl, - p_ni->node_guid, &p_node->map_item); - if (p_node_check != p_node) { - /* - This node must have been inserted by another thread. - This is unexpected, but is not an error. - We can simply clean-up, since the other thread will - see this processing through to completion. - */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Discovery race detected at node 0x%" PRIx64 "\n", - cl_ntoh64(p_ni->node_guid)); - osm_node_delete(&p_node); - p_node = p_node_check; - ni_rcv_set_links(sm, p_node, port_num, p_ni_context); - goto Exit; - } else - ni_rcv_set_links(sm, p_node, port_num, p_ni_context); - - p_node->discovery_count++; - ni_rcv_get_node_desc(sm, p_node, p_madw); - - switch (p_ni->node_type) { - case IB_NODE_TYPE_CA: - case IB_NODE_TYPE_ROUTER: - ni_rcv_process_new_ca_or_router(sm, p_node, p_madw); - break; - case IB_NODE_TYPE_SWITCH: - ni_rcv_process_new_switch(sm, p_node, p_madw); - break; - default: - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D16: " - "Unknown node type %u with GUID 0x%" PRIx64 "\n", - p_ni->node_type, cl_ntoh64(p_ni->node_guid)); - break; - } - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void ni_rcv_process_existing(IN osm_sm_t * sm, IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - ib_node_info_t *p_ni; - ib_smp_t *p_smp; - osm_ni_context_t *p_ni_context; - uint8_t port_num; - - OSM_LOG_ENTER(sm->p_log); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_ni = ib_smp_get_payload_ptr(p_smp); - p_ni_context = osm_madw_get_ni_context_ptr(p_madw); - port_num = ib_node_info_get_local_port_num(p_ni); - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Rediscovered %s node 0x%" PRIx64 " TID 0x%" PRIx64 - ", discovered %u times already\n", - ib_get_node_type_str(p_ni->node_type), - cl_ntoh64(p_ni->node_guid), - cl_ntoh64(p_smp->trans_id), p_node->discovery_count); - - /* - If we haven't already encountered this existing node - on this particular sweep, then process further. - */ - p_node->discovery_count++; - - switch (p_ni->node_type) { - case IB_NODE_TYPE_CA: - case IB_NODE_TYPE_ROUTER: - ni_rcv_process_existing_ca_or_router(sm, p_node, p_madw); - break; - - case IB_NODE_TYPE_SWITCH: - ni_rcv_process_existing_switch(sm, p_node, p_madw); - break; - - default: - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D09: " - "Unknown node type %u with GUID 0x%" PRIx64 "\n", - p_ni->node_type, cl_ntoh64(p_ni->node_guid)); - break; - } - - ni_rcv_set_links(sm, p_node, port_num, p_ni_context); - - OSM_LOG_EXIT(sm->p_log); -} - -void osm_ni_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_node_info_t *p_ni; - ib_smp_t *p_smp; - osm_node_t *p_node; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_ni = ib_smp_get_payload_ptr(p_smp); - - CL_ASSERT(p_smp->attr_id == IB_MAD_ATTR_NODE_INFO); - - if (p_ni->node_guid == 0) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D16: " - "Got Zero Node GUID! Found on the directed route:\n"); - osm_dump_smp_dr_path(sm->p_log, p_smp, OSM_LOG_ERROR); - goto Exit; - } - - if (p_ni->port_guid == 0) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D17: " - "Got Zero Port GUID! Found on the directed route:\n"); - osm_dump_smp_dr_path(sm->p_log, p_smp, OSM_LOG_ERROR); - goto Exit; - } - - /* - Determine if this node has already been discovered, - and process accordingly. - During processing of this node, hold the shared lock. - */ - - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - p_node = osm_get_node_by_guid(sm->p_subn, p_ni->node_guid); - - osm_dump_node_info(sm->p_log, p_ni, OSM_LOG_DEBUG); - - if (!p_node) - ni_rcv_process_new(sm, p_madw); - else - ni_rcv_process_existing(sm, p_node, p_madw); - - CL_PLOCK_RELEASE(sm->p_lock); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_opensm.c b/branches/opensm_3/user/opensm/osm_opensm.c deleted file mode 100644 index 7c988d14..00000000 --- a/branches/opensm_3/user/opensm/osm_opensm.c +++ /dev/null @@ -1,483 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_opensm_t. - * This object represents the opensm super object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct routing_engine_module { - const char *name; - int (*setup) (struct osm_routing_engine *, osm_opensm_t *); -}; - -extern int osm_ucast_minhop_setup(struct osm_routing_engine *, osm_opensm_t *); -extern int osm_ucast_updn_setup(struct osm_routing_engine *, osm_opensm_t *); -extern int osm_ucast_file_setup(struct osm_routing_engine *, osm_opensm_t *); -extern int osm_ucast_ftree_setup(struct osm_routing_engine *, osm_opensm_t *); -extern int osm_ucast_lash_setup(struct osm_routing_engine *, osm_opensm_t *); -extern int osm_ucast_dor_setup(struct osm_routing_engine *, osm_opensm_t *); - -const static struct routing_engine_module routing_modules[] = { - {"minhop", osm_ucast_minhop_setup}, - {"updn", osm_ucast_updn_setup}, - {"file", osm_ucast_file_setup}, - {"ftree", osm_ucast_ftree_setup}, - {"lash", osm_ucast_lash_setup}, - {"dor", osm_ucast_dor_setup}, - {NULL, NULL} -}; - -const char *osm_routing_engine_type_str(IN osm_routing_engine_type_t type) -{ - switch (type) { - case OSM_ROUTING_ENGINE_TYPE_NONE: - return "none"; - case OSM_ROUTING_ENGINE_TYPE_MINHOP: - return "minhop"; - case OSM_ROUTING_ENGINE_TYPE_UPDN: - return "updn"; - case OSM_ROUTING_ENGINE_TYPE_FILE: - return "file"; - case OSM_ROUTING_ENGINE_TYPE_FTREE: - return "ftree"; - case OSM_ROUTING_ENGINE_TYPE_LASH: - return "lash"; - case OSM_ROUTING_ENGINE_TYPE_DOR: - return "dor"; - default: - break; - } - return "unknown"; -} - -osm_routing_engine_type_t osm_routing_engine_type(IN const char *str) -{ - /* For legacy reasons, consider a NULL pointer and the string - * "null" as the minhop routing engine. - */ - if (!str || !strcasecmp(str, "null") - || !strcasecmp(str, "minhop")) - return OSM_ROUTING_ENGINE_TYPE_MINHOP; - else if (!strcasecmp(str, "none")) - return OSM_ROUTING_ENGINE_TYPE_NONE; - else if (!strcasecmp(str, "updn")) - return OSM_ROUTING_ENGINE_TYPE_UPDN; - else if (!strcasecmp(str, "file")) - return OSM_ROUTING_ENGINE_TYPE_FILE; - else if (!strcasecmp(str, "ftree")) - return OSM_ROUTING_ENGINE_TYPE_FTREE; - else if (!strcasecmp(str, "lash")) - return OSM_ROUTING_ENGINE_TYPE_LASH; - else if (!strcasecmp(str, "dor")) - return OSM_ROUTING_ENGINE_TYPE_DOR; - else - return OSM_ROUTING_ENGINE_TYPE_UNKNOWN; -} - -static void append_routing_engine(osm_opensm_t *osm, - struct osm_routing_engine *routing_engine) -{ - struct osm_routing_engine *r; - - routing_engine->next = NULL; - - if (!osm->routing_engine_list) { - osm->routing_engine_list = routing_engine; - return; - } - - r = osm->routing_engine_list; - while (r->next) - r = r->next; - - r->next = routing_engine; -} - -static void setup_routing_engine(osm_opensm_t *osm, const char *name) -{ - struct osm_routing_engine *re; - const struct routing_engine_module *m; - - for (m = routing_modules; m->name && *m->name; m++) { - if (!strcmp(m->name, name)) { - re = malloc(sizeof(struct osm_routing_engine)); - if (!re) { - OSM_LOG(&osm->log, OSM_LOG_VERBOSE, - "memory allocation failed\n"); - return; - } - memset(re, 0, sizeof(struct osm_routing_engine)); - - re->name = m->name; - if (m->setup(re, osm)) { - OSM_LOG(&osm->log, OSM_LOG_VERBOSE, - "setup of routing" - " engine \'%s\' failed\n", name); - return; - } - OSM_LOG(&osm->log, OSM_LOG_DEBUG, - "\'%s\' routing engine set up\n", re->name); - append_routing_engine(osm, re); - return; - } - } - - OSM_LOG(&osm->log, OSM_LOG_ERROR, - "cannot find or setup routing engine \'%s\'\n", name); -} - -static void setup_routing_engines(osm_opensm_t *osm, const char *engine_names) -{ - char *name, *str, *p; - - if (!engine_names || !*engine_names) { - setup_routing_engine(osm, "minhop"); - return; - } - - str = strdup(engine_names); - name = strtok_r(str, ", \t\n", &p); - while (name && *name) { - setup_routing_engine(osm, name); - name = strtok_r(NULL, ", \t\n", &p); - } - free(str); - - if (!osm->routing_engine_list) - setup_routing_engine(osm, "minhop"); -} - -void osm_opensm_construct(IN osm_opensm_t * p_osm) -{ - memset(p_osm, 0, sizeof(*p_osm)); - p_osm->osm_version = OSM_VERSION; - osm_subn_construct(&p_osm->subn); - osm_sm_construct(&p_osm->sm); - osm_sa_construct(&p_osm->sa); - osm_db_construct(&p_osm->db); - osm_mad_pool_construct(&p_osm->mad_pool); - osm_vl15_construct(&p_osm->vl15); - osm_log_construct(&p_osm->log); -} - -static void destroy_routing_engines(osm_opensm_t *osm) -{ - struct osm_routing_engine *r, *next; - - next = osm->routing_engine_list; - while (next) { - r = next; - next = r->next; - if (r->delete) - r->delete(r->context); - free(r); - } -} - -static void destroy_plugins(osm_opensm_t *osm) -{ - osm_epi_plugin_t *p; - /* remove from the list, and destroy it */ - while (!cl_is_qlist_empty(&osm->plugin_list)){ - p = (osm_epi_plugin_t *)cl_qlist_remove_head(&osm->plugin_list); - /* plugin is responsible for freeing its own resources */ - osm_epi_destroy(p); - } -} - -void osm_opensm_destroy(IN osm_opensm_t * p_osm) -{ - /* in case of shutdown through exit proc - no ^C */ - osm_exit_flag = TRUE; - - /* - * First of all, clear the is_sm bit. - */ - if (p_osm->sm.mad_ctrl.h_bind) - osm_vendor_set_sm(p_osm->sm.mad_ctrl.h_bind, FALSE); - -#ifdef ENABLE_OSM_PERF_MGR - /* Shutdown the PerfMgr */ - osm_perfmgr_shutdown(&p_osm->perfmgr); -#endif /* ENABLE_OSM_PERF_MGR */ - - /* shut down the SA - * - unbind from QP1 messages - */ - osm_sa_shutdown(&p_osm->sa); - - /* shut down the SM - * - make sure the SM sweeper thread exited - * - unbind from QP0 messages - */ - osm_sm_shutdown(&p_osm->sm); - - /* cleanup all messages on VL15 fifo that were not sent yet */ - osm_vl15_shutdown(&p_osm->vl15, &p_osm->mad_pool); - - /* shut down the dispatcher - so no new messages cross */ - cl_disp_shutdown(&p_osm->disp); - - /* dump SA DB */ - osm_sa_db_file_dump(p_osm); - - /* do the destruction in reverse order as init */ - destroy_plugins(p_osm); - destroy_routing_engines(p_osm); - osm_sa_destroy(&p_osm->sa); - osm_sm_destroy(&p_osm->sm); -#ifdef ENABLE_OSM_PERF_MGR - osm_perfmgr_destroy(&p_osm->perfmgr); -#endif /* ENABLE_OSM_PERF_MGR */ - osm_db_destroy(&p_osm->db); - osm_vl15_destroy(&p_osm->vl15, &p_osm->mad_pool); - osm_mad_pool_destroy(&p_osm->mad_pool); - osm_vendor_delete(&p_osm->p_vendor); - osm_subn_destroy(&p_osm->subn); - cl_disp_destroy(&p_osm->disp); -#ifdef HAVE_LIBPTHREAD - pthread_cond_destroy(&p_osm->stats.cond); - pthread_mutex_destroy(&p_osm->stats.mutex); -#else - cl_event_destroy(&p_osm->stats.event); -#endif - close_node_name_map(p_osm->node_name_map); - - cl_plock_destroy(&p_osm->lock); - - osm_log_destroy(&p_osm->log); -} - -static void load_plugins(osm_opensm_t *osm, const char *plugin_names) -{ - osm_epi_plugin_t *epi; - char *p_names, *name, *p; - - p_names = strdup(plugin_names); - name = strtok_r(p_names, " \t\n", &p); - while (name && *name) { - epi = osm_epi_construct(osm, name); - if (!epi) - osm_log(&osm->log, OSM_LOG_ERROR, - "cannot load plugin \'%s\'\n", name); - else - cl_qlist_insert_tail(&osm->plugin_list, &epi->list); - name = strtok_r(NULL, " \t\n", &p); - } - free(p_names); -} - -ib_api_status_t osm_opensm_init(IN osm_opensm_t * p_osm, - IN const osm_subn_opt_t * p_opt) -{ - ib_api_status_t status; - - /* Can't use log macros here, since we're initializing the log */ - osm_opensm_construct(p_osm); - - if (p_opt->daemon) - p_osm->log.daemon = 1; - - status = osm_log_init_v2(&p_osm->log, p_opt->force_log_flush, - p_opt->log_flags, p_opt->log_file, - p_opt->log_max_size, p_opt->accum_log_file); - if (status != IB_SUCCESS) - return status; - p_osm->log.log_prefix = p_opt->log_prefix; - - /* If there is a log level defined - add the OSM_VERSION to it */ - osm_log(&p_osm->log, - osm_log_get_level(&p_osm->log) & (OSM_LOG_SYS ^ 0xFF), "%s\n", - p_osm->osm_version); - /* Write the OSM_VERSION to the SYS_LOG */ - osm_log(&p_osm->log, OSM_LOG_SYS, "%s\n", p_osm->osm_version); /* Format Waived */ - - OSM_LOG(&p_osm->log, OSM_LOG_FUNCS, "[\n"); /* Format Waived */ - - status = cl_plock_init(&p_osm->lock); - if (status != IB_SUCCESS) - goto Exit; - -#ifdef HAVE_LIBPTHREAD - pthread_mutex_init(&p_osm->stats.mutex, NULL); - pthread_cond_init(&p_osm->stats.cond, NULL); -#else - status = cl_event_init(&p_osm->stats.event, FALSE); - if (status != IB_SUCCESS) - goto Exit; -#endif - - if (p_opt->single_thread) { - OSM_LOG(&p_osm->log, OSM_LOG_INFO, - "Forcing single threaded dispatcher\n"); - status = cl_disp_init(&p_osm->disp, 1, "opensm"); - } else { - /* - * Normal behavior is to initialize the dispatcher with - * one thread per CPU, as specified by a thread count of '0'. - */ - status = cl_disp_init(&p_osm->disp, 0, "opensm"); - } - if (status != IB_SUCCESS) - goto Exit; - - status = osm_subn_init(&p_osm->subn, p_osm, p_opt); - if (status != IB_SUCCESS) - goto Exit; - - p_osm->p_vendor = - osm_vendor_new(&p_osm->log, p_opt->transaction_timeout); - if (p_osm->p_vendor == NULL) { - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - status = osm_mad_pool_init(&p_osm->mad_pool); - if (status != IB_SUCCESS) - goto Exit; - - status = osm_vl15_init(&p_osm->vl15, p_osm->p_vendor, - &p_osm->log, &p_osm->stats, - p_opt->max_wire_smps); - if (status != IB_SUCCESS) - goto Exit; - - /* the DB is in use by the SM and SA so init before */ - status = osm_db_init(&p_osm->db, &p_osm->log); - if (status != IB_SUCCESS) - goto Exit; - - status = osm_sm_init(&p_osm->sm, &p_osm->subn, &p_osm->db, - p_osm->p_vendor, &p_osm->mad_pool, &p_osm->vl15, - &p_osm->log, &p_osm->stats, &p_osm->disp, - &p_osm->lock); - - if (status != IB_SUCCESS) - goto Exit; - - status = osm_sa_init(&p_osm->sm, &p_osm->sa, &p_osm->subn, - p_osm->p_vendor, &p_osm->mad_pool, &p_osm->log, - &p_osm->stats, &p_osm->disp, &p_osm->lock); - - if (status != IB_SUCCESS) - goto Exit; - - cl_qlist_init(&p_osm->plugin_list); - - if (p_opt->event_plugin_name) - load_plugins(p_osm, p_opt->event_plugin_name); - -#ifdef ENABLE_OSM_PERF_MGR - status = osm_perfmgr_init(&p_osm->perfmgr, p_osm, p_opt); - if (status != IB_SUCCESS) - goto Exit; -#endif /* ENABLE_OSM_PERF_MGR */ - - setup_routing_engines(p_osm, p_opt->routing_engine_names); - - p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_NONE; - - p_osm->node_name_map = open_node_name_map(p_opt->node_name_map_name); - -Exit: - OSM_LOG(&p_osm->log, OSM_LOG_FUNCS, "]\n"); /* Format Waived */ - return status; -} - -ib_api_status_t osm_opensm_bind(IN osm_opensm_t * p_osm, IN ib_net64_t guid) -{ - ib_api_status_t status; - - OSM_LOG_ENTER(&p_osm->log); - - status = osm_sm_bind(&p_osm->sm, guid); - if (status != IB_SUCCESS) - goto Exit; - - status = osm_sa_bind(&p_osm->sa, guid); - if (status != IB_SUCCESS) - goto Exit; - -#ifdef ENABLE_OSM_PERF_MGR - status = osm_perfmgr_bind(&p_osm->perfmgr, guid); - if (status != IB_SUCCESS) - goto Exit; -#endif /* ENABLE_OSM_PERF_MGR */ - - /* setting IS_SM in capability mask */ - OSM_LOG(&p_osm->log, OSM_LOG_INFO, "Setting IS_SM on port 0x%016" PRIx64 "\n", - cl_ntoh64(guid)); - osm_vendor_set_sm(p_osm->sm.mad_ctrl.h_bind, TRUE); - -Exit: - OSM_LOG_EXIT(&p_osm->log); - return status; -} - -void osm_opensm_report_event(osm_opensm_t *osm, osm_epi_event_id_t event_id, - void *event_data) -{ - cl_list_item_t *item; - - for (item = cl_qlist_head(&osm->plugin_list); - item != cl_qlist_end(&osm->plugin_list); - item = cl_qlist_next(item)) { - osm_epi_plugin_t *p = (osm_epi_plugin_t *)item; - if (p->impl->report) - p->impl->report(p->plugin_data, event_id, event_data); - } -} diff --git a/branches/opensm_3/user/opensm/osm_perfmgr.c b/branches/opensm_3/user/opensm/osm_perfmgr.c deleted file mode 100644 index ce271aa5..00000000 --- a/branches/opensm_3/user/opensm/osm_perfmgr.c +++ /dev/null @@ -1,1284 +0,0 @@ -/* - * Copyright (c) 2007 The Regents of the University of California. - * Copyright (c) 2007-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_perfmgr_t. - * This object implements an IBA performance manager. - * - * Author: - * Ira Weiny, LLNL - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#ifdef ENABLE_OSM_PERF_MGR -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define PERFMGR_INITIAL_TID_VALUE 0xcafe - -#if ENABLE_OSM_PERF_MGR_PROFILE -struct { - double fastest_us; - double slowest_us; - double avg_us; - uint64_t num; -} perfmgr_mad_stats = { -fastest_us: DBL_MAX, slowest_us: DBL_MIN, avg_us: 0, num:0}; - -/* diff must be something which can fit in a susecond_t */ -static inline void update_mad_stats(struct timeval *diff) -{ - double new = (diff->tv_sec * 1000000) + diff->tv_usec; - if (new < perfmgr_mad_stats.fastest_us) - perfmgr_mad_stats.fastest_us = new; - if (new > perfmgr_mad_stats.slowest_us) - perfmgr_mad_stats.slowest_us = new; - - perfmgr_mad_stats.avg_us = - ((perfmgr_mad_stats.avg_us * perfmgr_mad_stats.num) + new) - / (perfmgr_mad_stats.num + 1); - perfmgr_mad_stats.num++; -} - -static inline void clear_mad_stats(void) -{ - perfmgr_mad_stats.fastest_us = DBL_MAX; - perfmgr_mad_stats.slowest_us = DBL_MIN; - perfmgr_mad_stats.avg_us = 0; - perfmgr_mad_stats.num = 0; -} - -/* after and diff can be the same struct */ -static inline void diff_time(struct timeval *before, struct timeval *after, - struct timeval *diff) -{ - struct timeval tmp = *after; - if (tmp.tv_usec < before->tv_usec) { - tmp.tv_sec--; - tmp.tv_usec += 1000000; - } - diff->tv_sec = tmp.tv_sec - before->tv_sec; - diff->tv_usec = tmp.tv_usec - before->tv_usec; -} -#endif - -/********************************************************************** - * Internal helper functions. - **********************************************************************/ -static void init_monitored_nodes(osm_perfmgr_t * pm) -{ - cl_qmap_init(&pm->monitored_map); - pm->remove_list = NULL; - cl_event_construct(&pm->sig_query); - cl_event_init(&pm->sig_query, FALSE); -} - -static void mark_for_removal(osm_perfmgr_t * pm, monitored_node_t * node) -{ - if (pm->remove_list) { - node->next = pm->remove_list; - pm->remove_list = node; - } else { - node->next = NULL; - pm->remove_list = node; - } -} - -static void remove_marked_nodes(osm_perfmgr_t * pm) -{ - while (pm->remove_list) { - monitored_node_t *next = pm->remove_list->next; - - cl_qmap_remove_item(&pm->monitored_map, - (cl_map_item_t *) (pm->remove_list)); - - if (pm->remove_list->name) - free(pm->remove_list->name); - free(pm->remove_list); - pm->remove_list = next; - } -} - -static inline void decrement_outstanding_queries(osm_perfmgr_t * pm) -{ - cl_atomic_dec(&pm->outstanding_queries); - cl_event_signal(&pm->sig_query); -} - -/********************************************************************** - * Receive the MAD from the vendor layer and post it for processing by - * the dispatcher. - **********************************************************************/ -static void perfmgr_mad_recv_callback(osm_madw_t * p_madw, void *bind_context, - osm_madw_t * p_req_madw) -{ - osm_perfmgr_t *pm = (osm_perfmgr_t *) bind_context; - - OSM_LOG_ENTER(pm->log); - - osm_madw_copy_context(p_madw, p_req_madw); - osm_mad_pool_put(pm->mad_pool, p_req_madw); - - decrement_outstanding_queries(pm); - - /* post this message for later processing. */ - if (cl_disp_post(pm->pc_disp_h, OSM_MSG_MAD_PORT_COUNTERS, - p_madw, NULL, NULL) != CL_SUCCESS) { - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C01: " - "PerfMgr Dispatcher post failed\n"); - osm_mad_pool_put(pm->mad_pool, p_madw); - } - OSM_LOG_EXIT(pm->log); -} - -/********************************************************************** - * Process MAD send errors. - **********************************************************************/ -static void perfmgr_mad_send_err_callback(void *bind_context, - osm_madw_t * p_madw) -{ - osm_perfmgr_t *pm = (osm_perfmgr_t *) bind_context; - osm_madw_context_t *context = &p_madw->context; - uint64_t node_guid = context->perfmgr_context.node_guid; - uint8_t port = context->perfmgr_context.port; - cl_map_item_t *p_node; - monitored_node_t *p_mon_node; - - OSM_LOG_ENTER(pm->log); - - /* - * get the monitored node struct to have the printable name - * for log messages - */ - if ((p_node = cl_qmap_get(&pm->monitored_map, node_guid)) == - cl_qmap_end(&pm->monitored_map)) { - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C15: GUID 0x%016" - PRIx64 " not found in monitored map\n", node_guid); - goto Exit; - } - p_mon_node = (monitored_node_t *) p_node; - - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C02: %s (0x%" PRIx64 - ") port %u\n", p_mon_node->name, p_mon_node->guid, port); - - if (pm->subn->opt.perfmgr_redir && p_madw->status == IB_TIMEOUT) { - /* First, find the node in the monitored map */ - cl_plock_acquire(pm->lock); - /* Now, validate port number */ - if (port >= p_mon_node->num_ports) { - cl_plock_release(pm->lock); - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C16: " - "Invalid port num %u for %s (GUID 0x%016" - PRIx64 ") num ports %u\n", port, - p_mon_node->name, p_mon_node->guid, - p_mon_node->num_ports); - goto Exit; - } - /* Clear redirection info */ - p_mon_node->redir_port[port].redir_lid = 0; - p_mon_node->redir_port[port].redir_qp = 0; - cl_plock_release(pm->lock); - } - -Exit: - osm_mad_pool_put(pm->mad_pool, p_madw); - - decrement_outstanding_queries(pm); - - OSM_LOG_EXIT(pm->log); -} - -/********************************************************************** - * Bind the PerfMgr to the vendor layer for MAD sends/receives - **********************************************************************/ -ib_api_status_t osm_perfmgr_bind(osm_perfmgr_t * pm, ib_net64_t port_guid) -{ - osm_bind_info_t bind_info; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(pm->log); - - if (pm->bind_handle != OSM_BIND_INVALID_HANDLE) { - OSM_LOG(pm->log, OSM_LOG_ERROR, - "ERR 4C03: Multiple binds not allowed\n"); - status = IB_ERROR; - goto Exit; - } - - bind_info.port_guid = port_guid; - bind_info.mad_class = IB_MCLASS_PERF; - bind_info.class_version = 1; - bind_info.is_responder = FALSE; - bind_info.is_report_processor = FALSE; - bind_info.is_trap_processor = FALSE; - bind_info.recv_q_size = OSM_PM_DEFAULT_QP1_RCV_SIZE; - bind_info.send_q_size = OSM_PM_DEFAULT_QP1_SEND_SIZE; - bind_info.timeout = pm->subn->opt.transaction_timeout; - bind_info.retries = pm->subn->opt.transaction_retries; - - OSM_LOG(pm->log, OSM_LOG_VERBOSE, - "Binding to port GUID 0x%" PRIx64 "\n", cl_ntoh64(port_guid)); - - pm->bind_handle = osm_vendor_bind(pm->vendor, &bind_info, pm->mad_pool, - perfmgr_mad_recv_callback, - perfmgr_mad_send_err_callback, pm); - - if (pm->bind_handle == OSM_BIND_INVALID_HANDLE) { - status = IB_ERROR; - OSM_LOG(pm->log, OSM_LOG_ERROR, - "ERR 4C04: Vendor specific bind failed (%s)\n", - ib_get_err_str(status)); - } - -Exit: - OSM_LOG_EXIT(pm->log); - return status; -} - -/********************************************************************** - * Unbind the PerfMgr from the vendor layer for MAD sends/receives - **********************************************************************/ -static void perfmgr_mad_unbind(osm_perfmgr_t * pm) -{ - OSM_LOG_ENTER(pm->log); - if (pm->bind_handle == OSM_BIND_INVALID_HANDLE) { - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C05: No previous bind\n"); - goto Exit; - } - osm_vendor_unbind(pm->bind_handle); -Exit: - OSM_LOG_EXIT(pm->log); -} - -/********************************************************************** - * Given a monitored node and a port, return the qp - **********************************************************************/ -static ib_net32_t get_qp(monitored_node_t * mon_node, uint8_t port) -{ - ib_net32_t qp = IB_QP1; - - if (mon_node && mon_node->num_ports && port < mon_node->num_ports && - mon_node->redir_port[port].redir_lid && - mon_node->redir_port[port].redir_qp) - qp = mon_node->redir_port[port].redir_qp; - - return qp; -} - -/********************************************************************** - * Given a node, a port, and an optional monitored node, - * return the appropriate lid to query that port - **********************************************************************/ -static ib_net16_t get_lid(osm_node_t * p_node, uint8_t port, - monitored_node_t * mon_node) -{ - if (mon_node && mon_node->num_ports && port < mon_node->num_ports && - mon_node->redir_port[port].redir_lid) - return mon_node->redir_port[port].redir_lid; - - switch (p_node->node_info.node_type) { - case IB_NODE_TYPE_CA: - case IB_NODE_TYPE_ROUTER: - return osm_node_get_base_lid(p_node, port); - case IB_NODE_TYPE_SWITCH: - return osm_node_get_base_lid(p_node, 0); - default: - return 0; - } -} - -/********************************************************************** - * Form and send the Port Counters MAD for a single port. - **********************************************************************/ -static ib_api_status_t perfmgr_send_pc_mad(osm_perfmgr_t * perfmgr, - ib_net16_t dest_lid, - ib_net32_t dest_qp, uint8_t port, - uint8_t mad_method, - osm_madw_context_t * p_context) -{ - ib_api_status_t status = IB_SUCCESS; - ib_port_counters_t *port_counter = NULL; - ib_perfmgt_mad_t *pm_mad = NULL; - osm_madw_t *p_madw = NULL; - - OSM_LOG_ENTER(perfmgr->log); - - p_madw = osm_mad_pool_get(perfmgr->mad_pool, perfmgr->bind_handle, - MAD_BLOCK_SIZE, NULL); - if (p_madw == NULL) - return IB_INSUFFICIENT_MEMORY; - - pm_mad = osm_madw_get_perfmgt_mad_ptr(p_madw); - - /* build the mad */ - pm_mad->header.base_ver = 1; - pm_mad->header.mgmt_class = IB_MCLASS_PERF; - pm_mad->header.class_ver = 1; - pm_mad->header.method = mad_method; - pm_mad->header.status = 0; - pm_mad->header.class_spec = 0; - pm_mad->header.trans_id = - cl_hton64((uint64_t) cl_atomic_inc(&perfmgr->trans_id)); - pm_mad->header.attr_id = IB_MAD_ATTR_PORT_CNTRS; - pm_mad->header.resv = 0; - pm_mad->header.attr_mod = 0; - - port_counter = (ib_port_counters_t *) & pm_mad->data; - memset(port_counter, 0, sizeof(*port_counter)); - port_counter->port_select = port; - port_counter->counter_select = 0xFFFF; - - p_madw->mad_addr.dest_lid = dest_lid; - p_madw->mad_addr.addr_type.gsi.remote_qp = dest_qp; - p_madw->mad_addr.addr_type.gsi.remote_qkey = - cl_hton32(IB_QP1_WELL_KNOWN_Q_KEY); - /* FIXME what about other partitions */ - p_madw->mad_addr.addr_type.gsi.pkey_ix = 0; - p_madw->mad_addr.addr_type.gsi.service_level = 0; - p_madw->mad_addr.addr_type.gsi.global_route = FALSE; - p_madw->resp_expected = TRUE; - - if (p_context) - p_madw->context = *p_context; - - status = osm_vendor_send(perfmgr->bind_handle, p_madw, TRUE); - - if (status == IB_SUCCESS) { - /* pause thread if there are too many outstanding requests */ - cl_atomic_inc(&(perfmgr->outstanding_queries)); - if (perfmgr->outstanding_queries > - perfmgr->max_outstanding_queries) { - perfmgr->sweep_state = PERFMGR_SWEEP_SUSPENDED; - cl_event_wait_on(&perfmgr->sig_query, EVENT_NO_TIMEOUT, - TRUE); - perfmgr->sweep_state = PERFMGR_SWEEP_ACTIVE; - } - } - - OSM_LOG_EXIT(perfmgr->log); - return status; -} - -/********************************************************************** - * sweep the node_guid_tbl and collect the node guids to be tracked - **********************************************************************/ -static void collect_guids(cl_map_item_t * p_map_item, void *context) -{ - osm_node_t *node = (osm_node_t *) p_map_item; - uint64_t node_guid = cl_ntoh64(node->node_info.node_guid); - osm_perfmgr_t *pm = (osm_perfmgr_t *) context; - monitored_node_t *mon_node = NULL; - uint32_t num_ports; - - OSM_LOG_ENTER(pm->log); - - if (cl_qmap_get(&pm->monitored_map, node_guid) - == cl_qmap_end(&pm->monitored_map)) { - /* if not already in map add it */ - num_ports = osm_node_get_num_physp(node); - mon_node = malloc(sizeof(*mon_node) + - sizeof(redir_t) * num_ports); - if (!mon_node) { - OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 4C06: " - "malloc failed: not handling node %s" - "(GUID 0x%" PRIx64 ")\n", node->print_desc, - node_guid); - goto Exit; - } - memset(mon_node, 0, - sizeof(*mon_node) + sizeof(redir_t) * num_ports); - mon_node->guid = node_guid; - mon_node->name = strdup(node->print_desc); - mon_node->num_ports = num_ports; - /* check for enhanced switch port 0 */ - mon_node->esp0 = (node->sw && - ib_switch_info_is_enhanced_port0(&node->sw-> - switch_info)); - cl_qmap_insert(&pm->monitored_map, node_guid, - (cl_map_item_t *) mon_node); - } - -Exit: - OSM_LOG_EXIT(pm->log); -} - -/********************************************************************** - * query the Port Counters of all the nodes in the subnet. - **********************************************************************/ -static void perfmgr_query_counters(cl_map_item_t * p_map_item, void *context) -{ - ib_api_status_t status = IB_SUCCESS; - osm_perfmgr_t *pm = context; - osm_node_t *node = NULL; - monitored_node_t *mon_node = (monitored_node_t *) p_map_item; - osm_madw_context_t mad_context; - uint64_t node_guid = 0; - ib_net32_t remote_qp; - uint8_t port, num_ports = 0; - - OSM_LOG_ENTER(pm->log); - - cl_plock_acquire(pm->lock); - node = osm_get_node_by_guid(pm->subn, cl_hton64(mon_node->guid)); - if (!node) { - OSM_LOG(pm->log, OSM_LOG_ERROR, - "ERR 4C07: Node \"%s\" (guid 0x%" PRIx64 - ") no longer exists so removing from PerfMgr monitoring\n", - mon_node->name, mon_node->guid); - mark_for_removal(pm, mon_node); - goto Exit; - } - - num_ports = osm_node_get_num_physp(node); - node_guid = cl_ntoh64(node->node_info.node_guid); - - /* make sure there is a database object ready to store this info */ - if (perfmgr_db_create_entry(pm->db, node_guid, mon_node->esp0, - num_ports, node->print_desc) != - PERFMGR_EVENT_DB_SUCCESS) { - OSM_LOG(pm->log, OSM_LOG_ERROR, - "ERR 4C08: DB create entry failed for 0x%" - PRIx64 " (%s) : %s\n", node_guid, node->print_desc, - strerror(errno)); - goto Exit; - } - - /* issue the query for each port */ - for (port = mon_node->esp0 ? 0 : 1; port < num_ports; port++) { - ib_net16_t lid; - - if (!osm_node_get_physp_ptr(node, port)) - continue; - - lid = get_lid(node, port, mon_node); - if (lid == 0) { - OSM_LOG(pm->log, OSM_LOG_DEBUG, "WARN: node 0x%" PRIx64 - " port %d (%s): port out of range, skipping\n", - cl_ntoh64(node->node_info.node_guid), port, - node->print_desc); - continue; - } - - remote_qp = get_qp(mon_node, port); - - mad_context.perfmgr_context.node_guid = node_guid; - mad_context.perfmgr_context.port = port; - mad_context.perfmgr_context.mad_method = IB_MAD_METHOD_GET; -#if ENABLE_OSM_PERF_MGR_PROFILE - gettimeofday(&mad_context.perfmgr_context.query_start, NULL); -#endif - OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Getting stats for node 0x%" - PRIx64 " port %d (lid %u) (%s)\n", node_guid, port, - cl_ntoh16(lid), node->print_desc); - status = perfmgr_send_pc_mad(pm, lid, remote_qp, port, - IB_MAD_METHOD_GET, &mad_context); - if (status != IB_SUCCESS) - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C09: " - "Failed to issue port counter query for node 0x%" - PRIx64 " port %d (%s)\n", - node->node_info.node_guid, port, - node->print_desc); - } -Exit: - cl_plock_release(pm->lock); - OSM_LOG_EXIT(pm->log); -} - -/********************************************************************** - * Discovery stuff. - * This code should not be here, but merged with main OpenSM - **********************************************************************/ -extern int wait_for_pending_transactions(osm_stats_t * stats); -extern void osm_drop_mgr_process(IN osm_sm_t * sm); - -static int sweep_hop_1(osm_sm_t * sm) -{ - ib_api_status_t status = IB_SUCCESS; - osm_bind_handle_t h_bind; - osm_madw_context_t context; - osm_node_t *p_node; - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_dr_path_t *p_dr_path; - osm_dr_path_t hop_1_path; - ib_net64_t port_guid; - uint8_t port_num; - uint8_t path_array[IB_SUBNET_PATH_HOPS_MAX]; - uint8_t num_ports; - osm_physp_t *p_ext_physp; - - port_guid = sm->p_subn->sm_port_guid; - - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 4C81: No SM port object\n"); - return -1; - } - - p_node = p_port->p_node; - port_num = ib_node_info_get_local_port_num(&p_node->node_info); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Probing hop 1 on local port %u\n", port_num); - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - - CL_ASSERT(p_physp); - - p_dr_path = osm_physp_get_dr_path_ptr(p_physp); - h_bind = osm_dr_path_get_bind_handle(p_dr_path); - - CL_ASSERT(h_bind != OSM_BIND_INVALID_HANDLE); - - memset(path_array, 0, sizeof(path_array)); - /* the hop_1 operations depend on the type of our node. - * Currently - legal nodes that can host SM are SW and CA */ - switch (osm_node_get_type(p_node)) { - case IB_NODE_TYPE_CA: - case IB_NODE_TYPE_ROUTER: - memset(&context, 0, sizeof(context)); - context.ni_context.node_guid = osm_node_get_node_guid(p_node); - context.ni_context.port_num = port_num; - - path_array[1] = port_num; - - osm_dr_path_init(&hop_1_path, h_bind, 1, path_array); - status = osm_req_get(sm, &hop_1_path, IB_MAD_ATTR_NODE_INFO, 0, - CL_DISP_MSGID_NONE, &context); - - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 4C82: " - "Request for NodeInfo failed\n"); - break; - - case IB_NODE_TYPE_SWITCH: - /* Need to go over all the ports of the switch, and send a node_info - * from them. This doesn't include the port 0 of the switch, which - * hosts the SM. - * Note: We'll send another switchInfo on port 0, since if no ports - * are connected, we still want to get some response, and have the - * subnet come up. - */ - num_ports = osm_node_get_num_physp(p_node); - for (port_num = 0; port_num < num_ports; port_num++) { - /* go through the port only if the port is not DOWN */ - p_ext_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_ext_physp || ib_port_info_get_port_state - (&p_ext_physp->port_info) <= IB_LINK_DOWN) - continue; - - memset(&context, 0, sizeof(context)); - context.ni_context.node_guid = - osm_node_get_node_guid(p_node); - context.ni_context.port_num = port_num; - - path_array[1] = port_num; - - osm_dr_path_init(&hop_1_path, h_bind, 1, path_array); - status = osm_req_get(sm, &hop_1_path, - IB_MAD_ATTR_NODE_INFO, 0, - CL_DISP_MSGID_NONE, &context); - - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 4C84: " - "Request for NodeInfo failed\n"); - } - break; - - default: - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 4C83: Unknown node type %d\n", - osm_node_get_type(p_node)); - } - - return status; -} - -static unsigned is_sm_port_down(osm_sm_t * sm) -{ - ib_net64_t port_guid; - osm_port_t *p_port; - - port_guid = sm->p_subn->sm_port_guid; - if (port_guid == 0) - return 1; - - CL_PLOCK_ACQUIRE(sm->p_lock); - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - if (!p_port) { - CL_PLOCK_RELEASE(sm->p_lock); - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 4C85: " - "SM port with GUID:%016" PRIx64 " is unknown\n", - cl_ntoh64(port_guid)); - return 1; - } - CL_PLOCK_RELEASE(sm->p_lock); - - return osm_physp_get_port_state(p_port->p_physp) == IB_LINK_DOWN; -} - -static int sweep_hop_0(osm_sm_t * sm) -{ - ib_api_status_t status; - osm_dr_path_t dr_path; - osm_bind_handle_t h_bind; - uint8_t path_array[IB_SUBNET_PATH_HOPS_MAX]; - - memset(path_array, 0, sizeof(path_array)); - - h_bind = osm_sm_mad_ctrl_get_bind_handle(&sm->mad_ctrl); - if (h_bind == OSM_BIND_INVALID_HANDLE) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "No bound ports\n"); - return -1; - } - - osm_dr_path_init(&dr_path, h_bind, 0, path_array); - status = osm_req_get(sm, &dr_path, IB_MAD_ATTR_NODE_INFO, 0, - CL_DISP_MSGID_NONE, NULL); - - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 4C86: Request for NodeInfo failed\n"); - - return status; -} - -static void reset_node_count(cl_map_item_t * p_map_item, void *cxt) -{ - osm_node_t *p_node = (osm_node_t *) p_map_item; - p_node->discovery_count = 0; -} - -static void reset_port_count(cl_map_item_t * p_map_item, void *cxt) -{ - osm_port_t *p_port = (osm_port_t *) p_map_item; - p_port->discovery_count = 0; -} - -static void reset_switch_count(cl_map_item_t * p_map_item, void *cxt) -{ - osm_switch_t *p_sw = (osm_switch_t *) p_map_item; - p_sw->need_update = 0; -} - -static int perfmgr_discovery(osm_opensm_t * osm) -{ - int ret; - - CL_PLOCK_ACQUIRE(&osm->lock); - cl_qmap_apply_func(&osm->subn.node_guid_tbl, reset_node_count, NULL); - cl_qmap_apply_func(&osm->subn.port_guid_tbl, reset_port_count, NULL); - cl_qmap_apply_func(&osm->subn.sw_guid_tbl, reset_switch_count, NULL); - CL_PLOCK_RELEASE(&osm->lock); - - osm->subn.in_sweep_hop_0 = TRUE; - - ret = sweep_hop_0(&osm->sm); - if (ret) - goto _exit; - - if (wait_for_pending_transactions(&osm->stats)) - goto _exit; - - if (is_sm_port_down(&osm->sm)) { - OSM_LOG(&osm->log, OSM_LOG_VERBOSE, "SM port is down\n"); - goto _drop; - } - - osm->subn.in_sweep_hop_0 = FALSE; - - ret = sweep_hop_1(&osm->sm); - if (ret) - goto _exit; - - if (wait_for_pending_transactions(&osm->stats)) - goto _exit; - -_drop: - osm_drop_mgr_process(&osm->sm); - -_exit: - return ret; -} - -/********************************************************************** - * Main PerfMgr processor - query the performance counters. - **********************************************************************/ -void osm_perfmgr_process(osm_perfmgr_t * pm) -{ -#if ENABLE_OSM_PERF_MGR_PROFILE - struct timeval before, after; -#endif - - if (pm->state != PERFMGR_STATE_ENABLED) - return; - - if (pm->subn->sm_state == IB_SMINFO_STATE_STANDBY || - pm->subn->sm_state == IB_SMINFO_STATE_NOTACTIVE) - perfmgr_discovery(pm->subn->p_osm); - -#if ENABLE_OSM_PERF_MGR_PROFILE - gettimeofday(&before, NULL); -#endif - pm->sweep_state = PERFMGR_SWEEP_ACTIVE; - /* With the global lock held, collect the node guids */ - /* FIXME we should be able to track SA notices - * and not have to sweep the node_guid_tbl each pass - */ - OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Gathering PerfMgr stats\n"); - cl_plock_acquire(pm->lock); - cl_qmap_apply_func(&pm->subn->node_guid_tbl, collect_guids, pm); - cl_plock_release(pm->lock); - - /* then for each node query their counters */ - cl_qmap_apply_func(&pm->monitored_map, perfmgr_query_counters, pm); - - /* clean out any nodes found to be removed during the sweep */ - remove_marked_nodes(pm); - -#if ENABLE_OSM_PERF_MGR_PROFILE - /* spin on outstanding queries */ - while (pm->outstanding_queries > 0) - cl_event_wait_on(&pm->sig_sweep, 1000, TRUE); - - gettimeofday(&after, NULL); - diff_time(&before, &after, &after); - osm_log(pm->log, OSM_LOG_INFO, - "PerfMgr total sweep time : %ld.%06ld s\n" - " fastest mad : %g us\n" - " slowest mad : %g us\n" - " average mad : %g us\n", - after.tv_sec, after.tv_usec, perfmgr_mad_stats.fastest_us, - perfmgr_mad_stats.slowest_us, perfmgr_mad_stats.avg_us); - clear_mad_stats(); -#endif - - pm->sweep_state = PERFMGR_SWEEP_SLEEP; -} - -/********************************************************************** - * PerfMgr timer - loop continuously and signal SM to run PerfMgr - * processor if enabled. - **********************************************************************/ -static void perfmgr_sweep(void *arg) -{ - osm_perfmgr_t *pm = arg; - - if (pm->state == PERFMGR_STATE_ENABLED) - osm_sm_signal(pm->sm, OSM_SIGNAL_PERFMGR_SWEEP); - cl_timer_start(&pm->sweep_timer, pm->sweep_time_s * 1000); -} - -void osm_perfmgr_shutdown(osm_perfmgr_t * pm) -{ - OSM_LOG_ENTER(pm->log); - cl_timer_stop(&pm->sweep_timer); - cl_disp_unregister(pm->pc_disp_h); - perfmgr_mad_unbind(pm); - OSM_LOG_EXIT(pm->log); -} - -void osm_perfmgr_destroy(osm_perfmgr_t * pm) -{ - OSM_LOG_ENTER(pm->log); - perfmgr_db_destroy(pm->db); - cl_timer_destroy(&pm->sweep_timer); - OSM_LOG_EXIT(pm->log); -} - -/********************************************************************** - * Detect if someone else on the network could have cleared the counters - * without us knowing. This is easy to detect because the counters never - * wrap but are "sticky" - * - * The one time this will not work is if the port is getting errors fast - * enough to have the reading overtake the previous reading. In this case, - * counters will be missed. - **********************************************************************/ -static void perfmgr_check_oob_clear(osm_perfmgr_t * pm, - monitored_node_t * mon_node, uint8_t port, - perfmgr_db_err_reading_t * cr, - perfmgr_db_data_cnt_reading_t * dc) -{ - perfmgr_db_err_reading_t prev_err; - perfmgr_db_data_cnt_reading_t prev_dc; - - if (perfmgr_db_get_prev_err(pm->db, mon_node->guid, port, &prev_err) - != PERFMGR_EVENT_DB_SUCCESS) { - OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Failed to find previous " - "error reading for %s (guid 0x%" PRIx64 ") port %u\n", - mon_node->name, mon_node->guid, port); - return; - } - - if (cr->symbol_err_cnt < prev_err.symbol_err_cnt || - cr->link_err_recover < prev_err.link_err_recover || - cr->link_downed < prev_err.link_downed || - cr->rcv_err < prev_err.rcv_err || - cr->rcv_rem_phys_err < prev_err.rcv_rem_phys_err || - cr->rcv_switch_relay_err < prev_err.rcv_switch_relay_err || - cr->xmit_discards < prev_err.xmit_discards || - cr->xmit_constraint_err < prev_err.xmit_constraint_err || - cr->rcv_constraint_err < prev_err.rcv_constraint_err || - cr->link_integrity < prev_err.link_integrity || - cr->buffer_overrun < prev_err.buffer_overrun || - cr->vl15_dropped < prev_err.vl15_dropped) { - OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 4C0A: " - "Detected an out of band error clear " - "on %s (0x%" PRIx64 ") port %u\n", - mon_node->name, mon_node->guid, port); - perfmgr_db_clear_prev_err(pm->db, mon_node->guid, port); - } - - /* FIXME handle extended counters */ - if (perfmgr_db_get_prev_dc(pm->db, mon_node->guid, port, &prev_dc) - != PERFMGR_EVENT_DB_SUCCESS) { - OSM_LOG(pm->log, OSM_LOG_VERBOSE, - "Failed to find previous data count " - "reading for %s (0x%" PRIx64 ") port %u\n", - mon_node->name, mon_node->guid, port); - return; - } - - if (dc->xmit_data < prev_dc.xmit_data || - dc->rcv_data < prev_dc.rcv_data || - dc->xmit_pkts < prev_dc.xmit_pkts || - dc->rcv_pkts < prev_dc.rcv_pkts) { - OSM_LOG(pm->log, OSM_LOG_ERROR, - "PerfMgr: ERR 4C0B: Detected an out of band data counter " - "clear on node %s (0x%" PRIx64 ") port %u\n", - mon_node->name, mon_node->guid, port); - perfmgr_db_clear_prev_dc(pm->db, mon_node->guid, port); - } -} - -/********************************************************************** - * Return 1 if the value is "close" to overflowing - **********************************************************************/ -static int counter_overflow_4(uint8_t val) -{ - return (val >= 10); -} - -static int counter_overflow_8(uint8_t val) -{ - return (val >= (UINT8_MAX - (UINT8_MAX / 4))); -} - -static int counter_overflow_16(ib_net16_t val) -{ - return (cl_ntoh16(val) >= (UINT16_MAX - (UINT16_MAX / 4))); -} - -static int counter_overflow_32(ib_net32_t val) -{ - return (cl_ntoh32(val) >= (UINT32_MAX - (UINT32_MAX / 4))); -} - -/********************************************************************** - * Check if the port counters have overflowed and if so issue a clear - * MAD to the port. - **********************************************************************/ -static void perfmgr_check_overflow(osm_perfmgr_t * pm, - monitored_node_t * mon_node, uint8_t port, - ib_port_counters_t * pc) -{ - osm_madw_context_t mad_context; - ib_api_status_t status; - ib_net32_t remote_qp; - - OSM_LOG_ENTER(pm->log); - - if (counter_overflow_16(pc->symbol_err_cnt) || - counter_overflow_8(pc->link_err_recover) || - counter_overflow_8(pc->link_downed) || - counter_overflow_16(pc->rcv_err) || - counter_overflow_16(pc->rcv_rem_phys_err) || - counter_overflow_16(pc->rcv_switch_relay_err) || - counter_overflow_16(pc->xmit_discards) || - counter_overflow_8(pc->xmit_constraint_err) || - counter_overflow_8(pc->rcv_constraint_err) || - counter_overflow_4(PC_LINK_INT(pc->link_int_buffer_overrun)) || - counter_overflow_4(PC_BUF_OVERRUN(pc->link_int_buffer_overrun)) || - counter_overflow_16(pc->vl15_dropped) || - counter_overflow_32(pc->xmit_data) || - counter_overflow_32(pc->rcv_data) || - counter_overflow_32(pc->xmit_pkts) || - counter_overflow_32(pc->rcv_pkts)) { - osm_node_t *p_node = NULL; - ib_net16_t lid = 0; - - osm_log(pm->log, OSM_LOG_VERBOSE, - "PerfMgr: Counter overflow: %s (0x%" PRIx64 - ") port %d; clearing counters\n", - mon_node->name, mon_node->guid, port); - - cl_plock_acquire(pm->lock); - p_node = - osm_get_node_by_guid(pm->subn, cl_hton64(mon_node->guid)); - lid = get_lid(p_node, port, mon_node); - cl_plock_release(pm->lock); - if (lid == 0) { - OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 4C0C: " - "Failed to clear counters for %s (0x%" - PRIx64 ") port %d; failed to get lid\n", - mon_node->name, mon_node->guid, port); - goto Exit; - } - - remote_qp = get_qp(NULL, port); - - mad_context.perfmgr_context.node_guid = mon_node->guid; - mad_context.perfmgr_context.port = port; - mad_context.perfmgr_context.mad_method = IB_MAD_METHOD_SET; - /* clear port counters */ - status = perfmgr_send_pc_mad(pm, lid, remote_qp, port, - IB_MAD_METHOD_SET, &mad_context); - if (status != IB_SUCCESS) - OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 4C11: " - "Failed to send clear counters MAD for %s (0x%" - PRIx64 ") port %d\n", - mon_node->name, mon_node->guid, port); - - perfmgr_db_clear_prev_dc(pm->db, mon_node->guid, port); - } - -Exit: - OSM_LOG_EXIT(pm->log); -} - -/********************************************************************** - * Check values for logging of errors - **********************************************************************/ -static void perfmgr_log_events(osm_perfmgr_t * pm, - monitored_node_t * mon_node, uint8_t port, - perfmgr_db_err_reading_t * reading) -{ - perfmgr_db_err_reading_t prev_read; - time_t time_diff = 0; - perfmgr_db_err_t err = - perfmgr_db_get_prev_err(pm->db, mon_node->guid, port, &prev_read); - - if (err != PERFMGR_EVENT_DB_SUCCESS) { - OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Failed to find previous " - "reading for %s (0x%" PRIx64 ") port %u\n", - mon_node->name, mon_node->guid, port); - return; - } - time_diff = (reading->time - prev_read.time); - - /* FIXME these events should be defineable by the user in a config - * file somewhere. */ - if (reading->symbol_err_cnt > prev_read.symbol_err_cnt) - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C0D: " - "Found %" PRIu64 " Symbol errors in %lu sec on %s (0x%" - PRIx64 ") port %u\n", - reading->symbol_err_cnt - prev_read.symbol_err_cnt, - time_diff, mon_node->name, mon_node->guid, port); - - if (reading->rcv_err > prev_read.rcv_err) - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C0E: " - "Found %" PRIu64 - " Receive errors in %lu sec on %s (0x%" PRIx64 - ") port %u\n", reading->rcv_err - prev_read.rcv_err, - time_diff, mon_node->name, mon_node->guid, port); - - if (reading->xmit_discards > prev_read.xmit_discards) - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C0F: " - "Found %" PRIu64 " Xmit Discards in %lu sec on %s (0x%" - PRIx64 ") port %u\n", - reading->xmit_discards - prev_read.xmit_discards, - time_diff, mon_node->name, mon_node->guid, port); -} - -/********************************************************************** - * The dispatcher uses a thread pool which will call this function when - * there is a thread available to process the mad received on the wire. - **********************************************************************/ -static void pc_recv_process(void *context, void *data) -{ - osm_perfmgr_t *pm = context; - osm_madw_t *p_madw = data; - osm_madw_context_t *mad_context = &p_madw->context; - ib_port_counters_t *wire_read = - (ib_port_counters_t *) & osm_madw_get_perfmgt_mad_ptr(p_madw)->data; - ib_mad_t *p_mad = osm_madw_get_mad_ptr(p_madw); - uint64_t node_guid = mad_context->perfmgr_context.node_guid; - uint8_t port = mad_context->perfmgr_context.port; - perfmgr_db_err_reading_t err_reading; - perfmgr_db_data_cnt_reading_t data_reading; - cl_map_item_t *p_node; - monitored_node_t *p_mon_node; - - OSM_LOG_ENTER(pm->log); - - /* - * get the monitored node struct to have the printable name - * for log messages - */ - if ((p_node = cl_qmap_get(&pm->monitored_map, node_guid)) == - cl_qmap_end(&pm->monitored_map)) { - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C12: GUID 0x%016" - PRIx64 " not found in monitored map\n", node_guid); - goto Exit; - } - p_mon_node = (monitored_node_t *) p_node; - - OSM_LOG(pm->log, OSM_LOG_VERBOSE, - "Processing received MAD status 0x%x context 0x%" - PRIx64 " port %u\n", p_mad->status, node_guid, port); - - CL_ASSERT(p_mad->attr_id == IB_MAD_ATTR_PORT_CNTRS || - p_mad->attr_id == IB_MAD_ATTR_CLASS_PORT_INFO); - - /* Response could also be redirection (IBM eHCA PMA does this) */ - if (p_mad->attr_id == IB_MAD_ATTR_CLASS_PORT_INFO) { - char gid_str[INET6_ADDRSTRLEN]; - ib_class_port_info_t *cpi = - (ib_class_port_info_t *) & - (osm_madw_get_perfmgt_mad_ptr(p_madw)->data); - ib_api_status_t status; - - OSM_LOG(pm->log, OSM_LOG_VERBOSE, - "Redirection to LID %u GID %s QP 0x%x received\n", - cl_ntoh16(cpi->redir_lid), - inet_ntop(AF_INET6, cpi->redir_gid.raw, gid_str, - sizeof gid_str), cl_ntoh32(cpi->redir_qp)); - - /* LID or GID redirection ? */ - /* For GID redirection, need to get PathRecord from SA */ - if (cpi->redir_lid == 0) { - OSM_LOG(pm->log, OSM_LOG_VERBOSE, - "GID redirection not currently implemented!\n"); - goto Exit; - } - - if (!pm->subn->opt.perfmgr_redir) { - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C16: " - "redirection requested but disabled\n"); - goto Exit; - } - - /* LID redirection support (easier than GID redirection) */ - cl_plock_acquire(pm->lock); - /* Now, validate port number */ - if (port >= p_mon_node->num_ports) { - cl_plock_release(pm->lock); - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C13: " - "Invalid port num %d for GUID 0x%016" - PRIx64 " num ports %d\n", port, node_guid, - p_mon_node->num_ports); - goto Exit; - } - p_mon_node->redir_port[port].redir_lid = cpi->redir_lid; - p_mon_node->redir_port[port].redir_qp = cpi->redir_qp; - cl_plock_release(pm->lock); - - /* Finally, reissue the query to the redirected location */ - status = perfmgr_send_pc_mad(pm, cpi->redir_lid, cpi->redir_qp, - port, mad_context->perfmgr_context. - mad_method, mad_context); - if (status != IB_SUCCESS) - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 4C14: " - "Failed to send redirected MAD with method 0x%x for node 0x%" - PRIx64 " port %d\n", - mad_context->perfmgr_context.mad_method, - node_guid, port); - goto Exit; - } - - perfmgr_db_fill_err_read(wire_read, &err_reading); - /* FIXME separate query for extended counters if they are supported - * on the port. - */ - perfmgr_db_fill_data_cnt_read_pc(wire_read, &data_reading); - - /* detect an out of band clear on the port */ - if (mad_context->perfmgr_context.mad_method != IB_MAD_METHOD_SET) - perfmgr_check_oob_clear(pm, p_mon_node, port, &err_reading, - &data_reading); - - /* log any critical events from this reading */ - perfmgr_log_events(pm, p_mon_node, port, &err_reading); - - if (mad_context->perfmgr_context.mad_method == IB_MAD_METHOD_GET) { - perfmgr_db_add_err_reading(pm->db, node_guid, port, - &err_reading); - perfmgr_db_add_dc_reading(pm->db, node_guid, port, - &data_reading); - } else { - perfmgr_db_clear_prev_err(pm->db, node_guid, port); - perfmgr_db_clear_prev_dc(pm->db, node_guid, port); - } - - perfmgr_check_overflow(pm, p_mon_node, port, wire_read); - -#if ENABLE_OSM_PERF_MGR_PROFILE - do { - struct timeval proc_time; - gettimeofday(&proc_time, NULL); - diff_time(&p_madw->context.perfmgr_context.query_start, - &proc_time, &proc_time); - update_mad_stats(&proc_time); - } while (0); -#endif - -Exit: - osm_mad_pool_put(pm->mad_pool, p_madw); - - OSM_LOG_EXIT(pm->log); -} - -/********************************************************************** - * Initialize the PerfMgr object - **********************************************************************/ -ib_api_status_t osm_perfmgr_init(osm_perfmgr_t * pm, osm_opensm_t * osm, - const osm_subn_opt_t * p_opt) -{ - ib_api_status_t status; - - OSM_LOG_ENTER(&osm->log); - - OSM_LOG(&osm->log, OSM_LOG_VERBOSE, "Initializing PerfMgr\n"); - - memset(pm, 0, sizeof(*pm)); - - cl_event_construct(&pm->sig_sweep); - cl_event_init(&pm->sig_sweep, FALSE); - pm->subn = &osm->subn; - pm->sm = &osm->sm; - pm->log = &osm->log; - pm->mad_pool = &osm->mad_pool; - pm->vendor = osm->p_vendor; - pm->trans_id = PERFMGR_INITIAL_TID_VALUE; - pm->lock = &osm->lock; - pm->state = - p_opt->perfmgr ? PERFMGR_STATE_ENABLED : PERFMGR_STATE_DISABLE; - pm->sweep_time_s = p_opt->perfmgr_sweep_time_s; - pm->max_outstanding_queries = p_opt->perfmgr_max_outstanding_queries; - pm->osm = osm; - - status = cl_timer_init(&pm->sweep_timer, perfmgr_sweep, pm); - if (status != IB_SUCCESS) - goto Exit; - - status = IB_INSUFFICIENT_RESOURCES; - pm->db = perfmgr_db_construct(pm); - if (!pm->db) { - pm->state = PERFMGR_STATE_NO_DB; - goto Exit; - } - - pm->pc_disp_h = cl_disp_register(&osm->disp, OSM_MSG_MAD_PORT_COUNTERS, - pc_recv_process, pm); - if (pm->pc_disp_h == CL_DISP_INVALID_HANDLE) { - perfmgr_db_destroy(pm->db); - goto Exit; - } - - init_monitored_nodes(pm); - - cl_timer_start(&pm->sweep_timer, pm->sweep_time_s * 1000); - - status = IB_SUCCESS; -Exit: - OSM_LOG_EXIT(pm->log); - return status; -} - -/********************************************************************** - * Clear the counters from the db - **********************************************************************/ -void osm_perfmgr_clear_counters(osm_perfmgr_t * pm) -{ - /** - * FIXME todo issue clear on the fabric? - */ - perfmgr_db_clear_counters(pm->db); - osm_log(pm->log, OSM_LOG_INFO, "PerfMgr counters cleared\n"); -} - -/******************************************************************* - * Dump the DB information to the file specified - *******************************************************************/ -void osm_perfmgr_dump_counters(osm_perfmgr_t * pm, perfmgr_db_dump_t dump_type) -{ - char path[256]; - char *file_name; - if (pm->subn->opt.event_db_dump_file) - file_name = pm->subn->opt.event_db_dump_file; - else { - snprintf(path, sizeof(path), "%s/%s", - pm->subn->opt.dump_files_dir, - OSM_PERFMGR_DEFAULT_DUMP_FILE); - file_name = path; - } - if (perfmgr_db_dump(pm->db, file_name, dump_type) != 0) - OSM_LOG(pm->log, OSM_LOG_ERROR, "Failed to dump file %s : %s", - file_name, strerror(errno)); -} - -/******************************************************************* - * Print the DB information to the fp specified - *******************************************************************/ -void osm_perfmgr_print_counters(osm_perfmgr_t * pm, char *nodename, FILE * fp) -{ - uint64_t guid = strtoull(nodename, NULL, 0); - if (guid == 0 && errno) - perfmgr_db_print_by_name(pm->db, nodename, fp); - else - perfmgr_db_print_by_guid(pm->db, guid, fp); -} -#endif /* ENABLE_OSM_PERF_MGR */ diff --git a/branches/opensm_3/user/opensm/osm_perfmgr_db.c b/branches/opensm_3/user/opensm/osm_perfmgr_db.c deleted file mode 100644 index ee0a92a1..00000000 --- a/branches/opensm_3/user/opensm/osm_perfmgr_db.c +++ /dev/null @@ -1,818 +0,0 @@ -/* - * Copyright (c) 2008-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2007 The Regents of the University of California. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#ifdef ENABLE_OSM_PERF_MGR - -#include -#include -#include -#include -#include - -#include -#include -#include - -static void free_node(db_node_t * node); - -/** ========================================================================= - */ -perfmgr_db_t *perfmgr_db_construct(osm_perfmgr_t *perfmgr) -{ - perfmgr_db_t *db = malloc(sizeof(*db)); - if (!db) - return NULL; - - cl_qmap_init(&db->pc_data); - cl_plock_construct(&db->lock); - cl_plock_init(&db->lock); - db->perfmgr = perfmgr; - return db; -} - -/** ========================================================================= - */ -void perfmgr_db_destroy(perfmgr_db_t * db) -{ - cl_map_item_t *item, *next_item; - - if (db) { - item = cl_qmap_head(&db->pc_data); - while (item != cl_qmap_end(&db->pc_data)) { - next_item = cl_qmap_next(item); - free_node((db_node_t *)item); - item = next_item; - } - cl_plock_destroy(&db->lock); - free(db); - } -} - -/********************************************************************** - * Internal call db->lock should be held when calling - **********************************************************************/ -static inline db_node_t *get(perfmgr_db_t * db, uint64_t guid) -{ - cl_map_item_t *rc = cl_qmap_get(&db->pc_data, guid); - const cl_map_item_t *end = cl_qmap_end(&db->pc_data); - - if (rc == end) - return NULL; - return (db_node_t *) rc; -} - -static inline perfmgr_db_err_t bad_node_port(db_node_t * node, uint8_t port) -{ - if (!node) - return PERFMGR_EVENT_DB_GUIDNOTFOUND; - if (port >= node->num_ports || (!node->esp0 && port == 0)) - return PERFMGR_EVENT_DB_PORTNOTFOUND; - return PERFMGR_EVENT_DB_SUCCESS; -} - -/** ========================================================================= - */ -static db_node_t *malloc_node(uint64_t guid, boolean_t esp0, - uint8_t num_ports, char *name) -{ - int i = 0; - time_t cur_time = 0; - db_node_t *rc = malloc(sizeof(*rc)); - if (!rc) - return NULL; - - rc->ports = calloc(num_ports, sizeof(db_port_t)); - if (!rc->ports) - goto free_rc; - rc->num_ports = num_ports; - rc->node_guid = guid; - rc->esp0 = esp0; - - cur_time = time(NULL); - for (i = 0; i < num_ports; i++) { - rc->ports[i].last_reset = cur_time; - rc->ports[i].err_previous.time = cur_time; - rc->ports[i].dc_previous.time = cur_time; - } - snprintf(rc->node_name, sizeof(rc->node_name), "%s", name); - - return rc; - -free_rc: - free(rc); - return NULL; -} - -/** ========================================================================= - */ -static void free_node(db_node_t * node) -{ - if (!node) - return; - if (node->ports) - free(node->ports); - free(node); -} - -/* insert nodes to the database */ -static perfmgr_db_err_t insert(perfmgr_db_t * db, db_node_t * node) -{ - cl_map_item_t *rc = cl_qmap_insert(&db->pc_data, node->node_guid, - (cl_map_item_t *) node); - - if ((void *)rc != (void *)node) - return PERFMGR_EVENT_DB_FAIL; - return PERFMGR_EVENT_DB_SUCCESS; -} - -perfmgr_db_err_t -perfmgr_db_create_entry(perfmgr_db_t * db, uint64_t guid, boolean_t esp0, - uint8_t num_ports, char *name) -{ - perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS; - - cl_plock_excl_acquire(&db->lock); - if (!get(db, guid)) { - db_node_t *pc_node = malloc_node(guid, esp0, num_ports, - name); - if (!pc_node) { - rc = PERFMGR_EVENT_DB_NOMEM; - goto Exit; - } - if (insert(db, pc_node)) { - free_node(pc_node); - rc = PERFMGR_EVENT_DB_FAIL; - goto Exit; - } - } -Exit: - cl_plock_release(&db->lock); - return rc; -} - -/********************************************************************** - * Dump a reading vs the previous reading to stdout - **********************************************************************/ -static inline void -debug_dump_err_reading(perfmgr_db_t * db, uint64_t guid, uint8_t port_num, - db_port_t * port, perfmgr_db_err_reading_t * cur) -{ - osm_log_t *log = db->perfmgr->log; - - if (!osm_log_is_active(log, OSM_LOG_DEBUG)) - return; /* optimize this a bit */ - - osm_log(log, OSM_LOG_DEBUG, - "GUID 0x%" PRIx64 " Port %u:\n", guid, port_num); - osm_log(log, OSM_LOG_DEBUG, - "sym %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->symbol_err_cnt, port->err_previous.symbol_err_cnt, - port->err_total.symbol_err_cnt); - osm_log(log, OSM_LOG_DEBUG, - "ler %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->link_err_recover, port->err_previous.link_err_recover, - port->err_total.link_err_recover); - osm_log(log, OSM_LOG_DEBUG, - "ld %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->link_downed, port->err_previous.link_downed, - port->err_total.link_downed); - osm_log(log, OSM_LOG_DEBUG, - "re %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", cur->rcv_err, - port->err_previous.rcv_err, port->err_total.rcv_err); - osm_log(log, OSM_LOG_DEBUG, - "rrp %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->rcv_rem_phys_err, port->err_previous.rcv_rem_phys_err, - port->err_total.rcv_rem_phys_err); - osm_log(log, OSM_LOG_DEBUG, - "rsr %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->rcv_switch_relay_err, - port->err_previous.rcv_switch_relay_err, - port->err_total.rcv_switch_relay_err); - osm_log(log, OSM_LOG_DEBUG, - "xd %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->xmit_discards, port->err_previous.xmit_discards, - port->err_total.xmit_discards); - osm_log(log, OSM_LOG_DEBUG, - "xce %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->xmit_constraint_err, - port->err_previous.xmit_constraint_err, - port->err_total.xmit_constraint_err); - osm_log(log, OSM_LOG_DEBUG, - "rce %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->rcv_constraint_err, port->err_previous.rcv_constraint_err, - port->err_total.rcv_constraint_err); - osm_log(log, OSM_LOG_DEBUG, - "li %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->link_integrity, port->err_previous.link_integrity, - port->err_total.link_integrity); - osm_log(log, OSM_LOG_DEBUG, - "bo %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->buffer_overrun, port->err_previous.buffer_overrun, - port->err_total.buffer_overrun); - osm_log(log, OSM_LOG_DEBUG, - "vld %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->vl15_dropped, port->err_previous.vl15_dropped, - port->err_total.vl15_dropped); -} - -/********************************************************************** - * perfmgr_db_err_reading_t functions - **********************************************************************/ -perfmgr_db_err_t -perfmgr_db_add_err_reading(perfmgr_db_t * db, uint64_t guid, uint8_t port, - perfmgr_db_err_reading_t * reading) -{ - db_port_t *p_port = NULL; - db_node_t *node = NULL; - perfmgr_db_err_reading_t *previous = NULL; - perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS; - osm_epi_pe_event_t epi_pe_data; - - cl_plock_excl_acquire(&db->lock); - node = get(db, guid); - if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS) - goto Exit; - - p_port = &(node->ports[port]); - previous = &(node->ports[port].err_previous); - - debug_dump_err_reading(db, guid, port, p_port, reading); - - epi_pe_data.time_diff_s = (reading->time - previous->time); - osm_epi_create_port_id(&epi_pe_data.port_id, guid, port, - node->node_name); - - /* calculate changes from previous reading */ - epi_pe_data.symbol_err_cnt = - (reading->symbol_err_cnt - previous->symbol_err_cnt); - p_port->err_total.symbol_err_cnt += epi_pe_data.symbol_err_cnt; - epi_pe_data.link_err_recover = - (reading->link_err_recover - previous->link_err_recover); - p_port->err_total.link_err_recover += epi_pe_data.link_err_recover; - epi_pe_data.link_downed = - (reading->link_downed - previous->link_downed); - p_port->err_total.link_downed += epi_pe_data.link_downed; - epi_pe_data.rcv_err = (reading->rcv_err - previous->rcv_err); - p_port->err_total.rcv_err += epi_pe_data.rcv_err; - epi_pe_data.rcv_rem_phys_err = - (reading->rcv_rem_phys_err - previous->rcv_rem_phys_err); - p_port->err_total.rcv_rem_phys_err += epi_pe_data.rcv_rem_phys_err; - epi_pe_data.rcv_switch_relay_err = - (reading->rcv_switch_relay_err - previous->rcv_switch_relay_err); - p_port->err_total.rcv_switch_relay_err += - epi_pe_data.rcv_switch_relay_err; - epi_pe_data.xmit_discards = - (reading->xmit_discards - previous->xmit_discards); - p_port->err_total.xmit_discards += epi_pe_data.xmit_discards; - epi_pe_data.xmit_constraint_err = - (reading->xmit_constraint_err - previous->xmit_constraint_err); - p_port->err_total.xmit_constraint_err += - epi_pe_data.xmit_constraint_err; - epi_pe_data.rcv_constraint_err = - (reading->rcv_constraint_err - previous->rcv_constraint_err); - p_port->err_total.rcv_constraint_err += epi_pe_data.rcv_constraint_err; - epi_pe_data.link_integrity = - (reading->link_integrity - previous->link_integrity); - p_port->err_total.link_integrity += epi_pe_data.link_integrity; - epi_pe_data.buffer_overrun = - (reading->buffer_overrun - previous->buffer_overrun); - p_port->err_total.buffer_overrun += epi_pe_data.buffer_overrun; - epi_pe_data.vl15_dropped = - (reading->vl15_dropped - previous->vl15_dropped); - p_port->err_total.vl15_dropped += epi_pe_data.vl15_dropped; - - p_port->err_previous = *reading; - - osm_opensm_report_event(db->perfmgr->osm, OSM_EVENT_ID_PORT_ERRORS, - &epi_pe_data); - -Exit: - cl_plock_release(&db->lock); - return rc; -} - -perfmgr_db_err_t perfmgr_db_get_prev_err(perfmgr_db_t * db, uint64_t guid, - uint8_t port, - perfmgr_db_err_reading_t * reading) -{ - db_node_t *node = NULL; - perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS; - - cl_plock_acquire(&db->lock); - - node = get(db, guid); - if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS) - goto Exit; - - *reading = node->ports[port].err_previous; - -Exit: - cl_plock_release(&db->lock); - return rc; -} - -perfmgr_db_err_t -perfmgr_db_clear_prev_err(perfmgr_db_t * db, uint64_t guid, uint8_t port) -{ - db_node_t *node = NULL; - perfmgr_db_err_reading_t *previous = NULL; - perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS; - - cl_plock_excl_acquire(&db->lock); - node = get(db, guid); - if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS) - goto Exit; - - previous = &(node->ports[port].err_previous); - - memset(previous, 0, sizeof(*previous)); - node->ports[port].err_previous.time = time(NULL); - -Exit: - cl_plock_release(&db->lock); - return rc; -} - -static inline void -debug_dump_dc_reading(perfmgr_db_t * db, uint64_t guid, uint8_t port_num, - db_port_t * port, perfmgr_db_data_cnt_reading_t * cur) -{ - osm_log_t *log = db->perfmgr->log; - if (!osm_log_is_active(log, OSM_LOG_DEBUG)) - return; - - osm_log(log, OSM_LOG_DEBUG, - "xd %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->xmit_data, port->dc_previous.xmit_data, - port->dc_total.xmit_data); - osm_log(log, OSM_LOG_DEBUG, - "rd %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", cur->rcv_data, - port->dc_previous.rcv_data, port->dc_total.rcv_data); - osm_log(log, OSM_LOG_DEBUG, - "xp %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", - cur->xmit_pkts, port->dc_previous.xmit_pkts, - port->dc_total.xmit_pkts); - osm_log(log, OSM_LOG_DEBUG, - "rp %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", cur->rcv_pkts, - port->dc_previous.rcv_pkts, port->dc_total.rcv_pkts); -} - -/********************************************************************** - * perfmgr_db_data_cnt_reading_t functions - **********************************************************************/ -perfmgr_db_err_t -perfmgr_db_add_dc_reading(perfmgr_db_t * db, uint64_t guid, uint8_t port, - perfmgr_db_data_cnt_reading_t * reading) -{ - db_port_t *p_port = NULL; - db_node_t *node = NULL; - perfmgr_db_data_cnt_reading_t *previous = NULL; - perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS; - osm_epi_dc_event_t epi_dc_data; - - cl_plock_excl_acquire(&db->lock); - node = get(db, guid); - if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS) - goto Exit; - - p_port = &node->ports[port]; - previous = &node->ports[port].dc_previous; - - debug_dump_dc_reading(db, guid, port, p_port, reading); - - epi_dc_data.time_diff_s = reading->time - previous->time; - osm_epi_create_port_id(&epi_dc_data.port_id, guid, port, - node->node_name); - - /* calculate changes from previous reading */ - epi_dc_data.xmit_data = reading->xmit_data - previous->xmit_data; - p_port->dc_total.xmit_data += epi_dc_data.xmit_data; - epi_dc_data.rcv_data = reading->rcv_data - previous->rcv_data; - p_port->dc_total.rcv_data += epi_dc_data.rcv_data; - epi_dc_data.xmit_pkts = reading->xmit_pkts - previous->xmit_pkts; - p_port->dc_total.xmit_pkts += epi_dc_data.xmit_pkts; - epi_dc_data.rcv_pkts = reading->rcv_pkts - previous->rcv_pkts; - p_port->dc_total.rcv_pkts += epi_dc_data.rcv_pkts; - epi_dc_data.unicast_xmit_pkts = - reading->unicast_xmit_pkts - previous->unicast_xmit_pkts; - p_port->dc_total.unicast_xmit_pkts += epi_dc_data.unicast_xmit_pkts; - epi_dc_data.unicast_rcv_pkts = - reading->unicast_rcv_pkts - previous->unicast_rcv_pkts; - p_port->dc_total.unicast_rcv_pkts += epi_dc_data.unicast_rcv_pkts; - epi_dc_data.multicast_xmit_pkts = - reading->multicast_xmit_pkts - previous->multicast_xmit_pkts; - p_port->dc_total.multicast_xmit_pkts += epi_dc_data.multicast_xmit_pkts; - epi_dc_data.multicast_rcv_pkts = - reading->multicast_rcv_pkts - previous->multicast_rcv_pkts; - p_port->dc_total.multicast_rcv_pkts += epi_dc_data.multicast_rcv_pkts; - - p_port->dc_previous = *reading; - - osm_opensm_report_event(db->perfmgr->osm, - OSM_EVENT_ID_PORT_DATA_COUNTERS, &epi_dc_data); - -Exit: - cl_plock_release(&db->lock); - return rc; -} - -perfmgr_db_err_t perfmgr_db_get_prev_dc(perfmgr_db_t * db, uint64_t guid, - uint8_t port, - perfmgr_db_data_cnt_reading_t * reading) -{ - db_node_t *node = NULL; - perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS; - - cl_plock_acquire(&db->lock); - - node = get(db, guid); - if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS) - goto Exit; - - *reading = node->ports[port].dc_previous; - -Exit: - cl_plock_release(&db->lock); - return rc; -} - -perfmgr_db_err_t -perfmgr_db_clear_prev_dc(perfmgr_db_t * db, uint64_t guid, uint8_t port) -{ - db_node_t *node = NULL; - perfmgr_db_data_cnt_reading_t *previous = NULL; - perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS; - - cl_plock_excl_acquire(&db->lock); - node = get(db, guid); - if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS) - goto Exit; - - previous = &node->ports[port].dc_previous; - - memset(previous, 0, sizeof(*previous)); - node->ports[port].dc_previous.time = time(NULL); - -Exit: - cl_plock_release(&db->lock); - return rc; -} - -static void clear_counters(cl_map_item_t * const p_map_item, void *context) -{ - db_node_t *node = (db_node_t *) p_map_item; - int i = 0; - time_t ts = time(NULL); - - for (i = 0; i < node->num_ports; i++) { - node->ports[i].err_total.symbol_err_cnt = 0; - node->ports[i].err_total.link_err_recover = 0; - node->ports[i].err_total.link_downed = 0; - node->ports[i].err_total.rcv_err = 0; - node->ports[i].err_total.rcv_rem_phys_err = 0; - node->ports[i].err_total.rcv_switch_relay_err = 0; - node->ports[i].err_total.xmit_discards = 0; - node->ports[i].err_total.xmit_constraint_err = 0; - node->ports[i].err_total.rcv_constraint_err = 0; - node->ports[i].err_total.link_integrity = 0; - node->ports[i].err_total.buffer_overrun = 0; - node->ports[i].err_total.vl15_dropped = 0; - node->ports[i].err_total.time = ts; - - node->ports[i].dc_total.xmit_data = 0; - node->ports[i].dc_total.rcv_data = 0; - node->ports[i].dc_total.xmit_pkts = 0; - node->ports[i].dc_total.rcv_pkts = 0; - node->ports[i].dc_total.unicast_xmit_pkts = 0; - node->ports[i].dc_total.unicast_rcv_pkts = 0; - node->ports[i].dc_total.multicast_xmit_pkts = 0; - node->ports[i].dc_total.multicast_rcv_pkts = 0; - node->ports[i].dc_total.time = ts; - - node->ports[i].last_reset = ts; - } -} - -/********************************************************************** - * Clear all the counters from the db - **********************************************************************/ -void perfmgr_db_clear_counters(perfmgr_db_t * db) -{ - cl_plock_excl_acquire(&db->lock); - cl_qmap_apply_func(&db->pc_data, clear_counters, (void *)db); - cl_plock_release(&db->lock); -#if 0 - if (db->db_impl->clear_counters) - db->db_impl->clear_counters(db->db_data); -#endif -} - -/********************************************************************** - * Output a tab delimited output of the port counters - **********************************************************************/ -static void dump_node_mr(db_node_t * node, FILE * fp) -{ - int i = 0; - - fprintf(fp, "\nName\tGUID\tPort\tLast Reset\t" - "%s\t%s\t" - "%s\t%s\t%s\t%s\t%s\t%s\t%s\t" - "%s\t%s\t%s\t%s\t%s\t%s\t%s\t" - "%s\t%s\t%s\t%s\n", - "symbol_err_cnt", - "link_err_recover", - "link_downed", - "rcv_err", - "rcv_rem_phys_err", - "rcv_switch_relay_err", - "xmit_discards", - "xmit_constraint_err", - "rcv_constraint_err", - "link_int_err", - "buf_overrun_err", - "vl15_dropped", - "xmit_data", - "rcv_data", - "xmit_pkts", - "rcv_pkts", - "unicast_xmit_pkts", - "unicast_rcv_pkts", - "multicast_xmit_pkts", - "multicast_rcv_pkts"); - for (i = (node->esp0) ? 0 : 1; i < node->num_ports; i++) { - char *since = ctime(&node->ports[i].last_reset); - since[strlen(since) - 1] = '\0'; /* remove \n */ - - fprintf(fp, - "%s\t0x%" PRIx64 "\t%d\t%s\t%" PRIu64 "\t%" PRIu64 "\t" - "%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\t" - "%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\t" "%" PRIu64 - "\t%" PRIu64 "\t%" PRIu64 "\t" "%" PRIu64 "\t%" PRIu64 - "\t%" PRIu64 "\t%" PRIu64 "\t" "%" PRIu64 "\t%" PRIu64 - "\t%" PRIu64 "\t%" PRIu64 "\n", node->node_name, - node->node_guid, i, since, - node->ports[i].err_total.symbol_err_cnt, - node->ports[i].err_total.link_err_recover, - node->ports[i].err_total.link_downed, - node->ports[i].err_total.rcv_err, - node->ports[i].err_total.rcv_rem_phys_err, - node->ports[i].err_total.rcv_switch_relay_err, - node->ports[i].err_total.xmit_discards, - node->ports[i].err_total.xmit_constraint_err, - node->ports[i].err_total.rcv_constraint_err, - node->ports[i].err_total.link_integrity, - node->ports[i].err_total.buffer_overrun, - node->ports[i].err_total.vl15_dropped, - node->ports[i].dc_total.xmit_data, - node->ports[i].dc_total.rcv_data, - node->ports[i].dc_total.xmit_pkts, - node->ports[i].dc_total.rcv_pkts, - node->ports[i].dc_total.unicast_xmit_pkts, - node->ports[i].dc_total.unicast_rcv_pkts, - node->ports[i].dc_total.multicast_xmit_pkts, - node->ports[i].dc_total.multicast_rcv_pkts); - } -} - -/********************************************************************** - * Output a human readable output of the port counters - **********************************************************************/ -static void dump_node_hr(db_node_t * node, FILE * fp) -{ - int i = 0; - - fprintf(fp, "\n"); - for (i = (node->esp0) ? 0 : 1; i < node->num_ports; i++) { - char *since = ctime(&node->ports[i].last_reset); - since[strlen(since) - 1] = '\0'; /* remove \n */ - - fprintf(fp, "\"%s\" 0x%" PRIx64 " port %d (Since %s)\n" - " symbol_err_cnt : %" PRIu64 "\n" - " link_err_recover : %" PRIu64 "\n" - " link_downed : %" PRIu64 "\n" - " rcv_err : %" PRIu64 "\n" - " rcv_rem_phys_err : %" PRIu64 "\n" - " rcv_switch_relay_err : %" PRIu64 "\n" - " xmit_discards : %" PRIu64 "\n" - " xmit_constraint_err : %" PRIu64 "\n" - " rcv_constraint_err : %" PRIu64 "\n" - " link_integrity_err : %" PRIu64 "\n" - " buf_overrun_err : %" PRIu64 "\n" - " vl15_dropped : %" PRIu64 "\n" - " xmit_data : %" PRIu64 "\n" - " rcv_data : %" PRIu64 "\n" - " xmit_pkts : %" PRIu64 "\n" - " rcv_pkts : %" PRIu64 "\n" - " unicast_xmit_pkts : %" PRIu64 "\n" - " unicast_rcv_pkts : %" PRIu64 "\n" - " multicast_xmit_pkts : %" PRIu64 "\n" - " multicast_rcv_pkts : %" PRIu64 "\n", - node->node_name, - node->node_guid, - i, - since, - node->ports[i].err_total.symbol_err_cnt, - node->ports[i].err_total.link_err_recover, - node->ports[i].err_total.link_downed, - node->ports[i].err_total.rcv_err, - node->ports[i].err_total.rcv_rem_phys_err, - node->ports[i].err_total.rcv_switch_relay_err, - node->ports[i].err_total.xmit_discards, - node->ports[i].err_total.xmit_constraint_err, - node->ports[i].err_total.rcv_constraint_err, - node->ports[i].err_total.link_integrity, - node->ports[i].err_total.buffer_overrun, - node->ports[i].err_total.vl15_dropped, - node->ports[i].dc_total.xmit_data, - node->ports[i].dc_total.rcv_data, - node->ports[i].dc_total.xmit_pkts, - node->ports[i].dc_total.rcv_pkts, - node->ports[i].dc_total.unicast_xmit_pkts, - node->ports[i].dc_total.unicast_rcv_pkts, - node->ports[i].dc_total.multicast_xmit_pkts, - node->ports[i].dc_total.multicast_rcv_pkts); - } -} - -/* Define a context for the __db_dump callback */ -typedef struct { - FILE *fp; - perfmgr_db_dump_t dump_type; -} dump_context_t; - -static void db_dump(cl_map_item_t * const p_map_item, void *context) -{ - db_node_t *node = (db_node_t *) p_map_item; - dump_context_t *c = (dump_context_t *) context; - FILE *fp = c->fp; - - switch (c->dump_type) { - case PERFMGR_EVENT_DB_DUMP_MR: - dump_node_mr(node, fp); - break; - case PERFMGR_EVENT_DB_DUMP_HR: - default: - dump_node_hr(node, fp); - break; - } -} - -/********************************************************************** - * print node data to fp - **********************************************************************/ -void -perfmgr_db_print_by_name(perfmgr_db_t * db, char *nodename, FILE *fp) -{ - cl_map_item_t *item; - db_node_t *node; - - cl_plock_acquire(&db->lock); - - /* find the node */ - item = cl_qmap_head(&db->pc_data); - while (item != cl_qmap_end(&db->pc_data)) { - node = (db_node_t *)item; - if (strcmp(node->node_name, nodename) == 0) { - dump_node_hr(node, fp); - goto done; - } - item = cl_qmap_next(item); - } - - fprintf(fp, "Node %s not found...\n", nodename); -done: - cl_plock_release(&db->lock); -} - -/********************************************************************** - * print node data to fp - **********************************************************************/ -void -perfmgr_db_print_by_guid(perfmgr_db_t * db, uint64_t nodeguid, FILE *fp) -{ - cl_map_item_t *node; - - cl_plock_acquire(&db->lock); - - node = cl_qmap_get(&db->pc_data, nodeguid); - if (node != cl_qmap_end(&db->pc_data)) - dump_node_hr((db_node_t *)node, fp); - else - fprintf(fp, "Node 0x%" PRIx64 " not found...\n", nodeguid); - - cl_plock_release(&db->lock); -} - -/********************************************************************** - * dump the data to the file "file" - **********************************************************************/ -perfmgr_db_err_t -perfmgr_db_dump(perfmgr_db_t * db, char *file, perfmgr_db_dump_t dump_type) -{ - dump_context_t context; - - context.fp = fopen(file, "w+"); - if (!context.fp) - return PERFMGR_EVENT_DB_FAIL; - context.dump_type = dump_type; - - cl_plock_acquire(&db->lock); - cl_qmap_apply_func(&db->pc_data, db_dump, (void *)&context); - cl_plock_release(&db->lock); - fclose(context.fp); - return PERFMGR_EVENT_DB_SUCCESS; -} - -/********************************************************************** - * Fill in the various DB objects from their wire counter parts - **********************************************************************/ -void -perfmgr_db_fill_err_read(ib_port_counters_t * wire_read, - perfmgr_db_err_reading_t * reading) -{ - reading->symbol_err_cnt = cl_ntoh16(wire_read->symbol_err_cnt); - reading->link_err_recover = cl_ntoh16(wire_read->link_err_recover); - reading->link_downed = wire_read->link_downed; - reading->rcv_err = wire_read->rcv_err; - reading->rcv_rem_phys_err = cl_ntoh16(wire_read->rcv_rem_phys_err); - reading->rcv_switch_relay_err = - cl_ntoh16(wire_read->rcv_switch_relay_err); - reading->xmit_discards = cl_ntoh16(wire_read->xmit_discards); - reading->xmit_constraint_err = - cl_ntoh16(wire_read->xmit_constraint_err); - reading->rcv_constraint_err = wire_read->rcv_constraint_err; - reading->link_integrity = - PC_LINK_INT(wire_read->link_int_buffer_overrun); - reading->buffer_overrun = - PC_BUF_OVERRUN(wire_read->link_int_buffer_overrun); - reading->vl15_dropped = cl_ntoh16(wire_read->vl15_dropped); - reading->time = time(NULL); -} - -void -perfmgr_db_fill_data_cnt_read_pc(ib_port_counters_t * wire_read, - perfmgr_db_data_cnt_reading_t * reading) -{ - reading->xmit_data = cl_ntoh32(wire_read->xmit_data); - reading->rcv_data = cl_ntoh32(wire_read->rcv_data); - reading->xmit_pkts = cl_ntoh32(wire_read->xmit_pkts); - reading->rcv_pkts = cl_ntoh32(wire_read->rcv_pkts); - reading->unicast_xmit_pkts = 0; - reading->unicast_rcv_pkts = 0; - reading->multicast_xmit_pkts = 0; - reading->multicast_rcv_pkts = 0; - reading->time = time(NULL); -} - -void -perfmgr_db_fill_data_cnt_read_epc(ib_port_counters_ext_t * wire_read, - perfmgr_db_data_cnt_reading_t * reading) -{ - reading->xmit_data = cl_ntoh64(wire_read->xmit_data); - reading->rcv_data = cl_ntoh64(wire_read->rcv_data); - reading->xmit_pkts = cl_ntoh64(wire_read->xmit_pkts); - reading->rcv_pkts = cl_ntoh64(wire_read->rcv_pkts); - reading->unicast_xmit_pkts = cl_ntoh64(wire_read->unicast_xmit_pkts); - reading->unicast_rcv_pkts = cl_ntoh64(wire_read->unicast_rcv_pkts); - reading->multicast_xmit_pkts = - cl_ntoh64(wire_read->multicast_xmit_pkts); - reading->multicast_rcv_pkts = cl_ntoh64(wire_read->multicast_rcv_pkts); - reading->time = time(NULL); -} -#endif /* ENABLE_OSM_PERF_MGR */ diff --git a/branches/opensm_3/user/opensm/osm_pkey.c b/branches/opensm_3/user/opensm/osm_pkey.c deleted file mode 100644 index de4fbb5a..00000000 --- a/branches/opensm_3/user/opensm/osm_pkey.c +++ /dev/null @@ -1,427 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006,2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of opensm pkey manipulation functions. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void osm_pkey_tbl_construct(IN osm_pkey_tbl_t * p_pkey_tbl) -{ - cl_ptr_vector_construct(&p_pkey_tbl->blocks); - cl_ptr_vector_construct(&p_pkey_tbl->new_blocks); - cl_map_construct(&p_pkey_tbl->keys); -} - -void osm_pkey_tbl_destroy(IN osm_pkey_tbl_t * p_pkey_tbl) -{ - ib_pkey_table_t *p_block; - uint16_t num_blocks, i; - - num_blocks = (uint16_t) (cl_ptr_vector_get_size(&p_pkey_tbl->blocks)); - for (i = 0; i < num_blocks; i++) - if ((p_block = cl_ptr_vector_get(&p_pkey_tbl->blocks, i))) - free(p_block); - cl_ptr_vector_destroy(&p_pkey_tbl->blocks); - - num_blocks = - (uint16_t) (cl_ptr_vector_get_size(&p_pkey_tbl->new_blocks)); - for (i = 0; i < num_blocks; i++) - if ((p_block = cl_ptr_vector_get(&p_pkey_tbl->new_blocks, i))) - free(p_block); - cl_ptr_vector_destroy(&p_pkey_tbl->new_blocks); - - cl_map_remove_all(&p_pkey_tbl->keys); - cl_map_destroy(&p_pkey_tbl->keys); -} - -ib_api_status_t osm_pkey_tbl_init(IN osm_pkey_tbl_t * p_pkey_tbl) -{ - cl_ptr_vector_init(&p_pkey_tbl->blocks, 0, 1); - cl_ptr_vector_init(&p_pkey_tbl->new_blocks, 0, 1); - cl_map_init(&p_pkey_tbl->keys, 1); - cl_qlist_init(&p_pkey_tbl->pending); - p_pkey_tbl->used_blocks = 0; - p_pkey_tbl->max_blocks = 0; - return IB_SUCCESS; -} - -void osm_pkey_tbl_init_new_blocks(IN const osm_pkey_tbl_t * p_pkey_tbl) -{ - ib_pkey_table_t *p_block; - size_t b, num_blocks = cl_ptr_vector_get_size(&p_pkey_tbl->new_blocks); - - for (b = 0; b < num_blocks; b++) - if ((p_block = cl_ptr_vector_get(&p_pkey_tbl->new_blocks, b))) - memset(p_block, 0, sizeof(*p_block)); -} - -void osm_pkey_tbl_cleanup_pending(IN osm_pkey_tbl_t * p_pkey_tbl) -{ - cl_list_item_t *p_item; - - p_item = cl_qlist_remove_head(&p_pkey_tbl->pending); - while (p_item != cl_qlist_end(&p_pkey_tbl->pending)) { - free((osm_pending_pkey_t *) p_item); - } -} - -ib_api_status_t osm_pkey_tbl_set(IN osm_pkey_tbl_t * p_pkey_tbl, - IN uint16_t block, IN ib_pkey_table_t * p_tbl) -{ - uint16_t b, i; - ib_pkey_table_t *p_pkey_block; - uint16_t *p_prev_pkey; - ib_net16_t pkey; - - /* make sure the block is allocated */ - if (cl_ptr_vector_get_size(&p_pkey_tbl->blocks) > block) - p_pkey_block = - (ib_pkey_table_t *) cl_ptr_vector_get(&p_pkey_tbl->blocks, - block); - else - p_pkey_block = NULL; - - if (!p_pkey_block) { - p_pkey_block = - (ib_pkey_table_t *) malloc(sizeof(ib_pkey_table_t)); - if (!p_pkey_block) - return IB_ERROR; - memset(p_pkey_block, 0, sizeof(ib_pkey_table_t)); - cl_ptr_vector_set(&p_pkey_tbl->blocks, block, p_pkey_block); - } - - /* sets the block values */ - memcpy(p_pkey_block, p_tbl, sizeof(ib_pkey_table_t)); - - /* - NOTE: as the spec does not require uniqueness of PKeys in - tables there is no other way but to refresh the entire keys map. - - Moreover, if the same key exists but with full membership it should - have precedence on the key with limited membership ! - */ - cl_map_remove_all(&p_pkey_tbl->keys); - - for (b = 0; b < cl_ptr_vector_get_size(&p_pkey_tbl->blocks); b++) { - - p_pkey_block = cl_ptr_vector_get(&p_pkey_tbl->blocks, b); - if (!p_pkey_block) - continue; - - for (i = 0; i < IB_NUM_PKEY_ELEMENTS_IN_BLOCK; i++) { - pkey = p_pkey_block->pkey_entry[i]; - if (ib_pkey_is_invalid(pkey)) - continue; - - /* - ignore the PKey Full Member bit in the key but store - the pointer to the table element as the map value - */ - p_prev_pkey = - cl_map_get(&p_pkey_tbl->keys, - ib_pkey_get_base(pkey)); - - /* we only insert if no previous or it is not full member */ - if ((p_prev_pkey == NULL) || - (cl_ntoh16(*p_prev_pkey) < cl_ntoh16(pkey))) - cl_map_insert(&p_pkey_tbl->keys, - ib_pkey_get_base(pkey), - &(p_pkey_block->pkey_entry[i]) - ); - } - } - return IB_SUCCESS; -} - -/* - Store the given pkey in the "new" blocks array. - Also, make sure the regular block exists. -*/ -ib_api_status_t osm_pkey_tbl_set_new_entry(IN osm_pkey_tbl_t * p_pkey_tbl, - IN uint16_t block_idx, - IN uint8_t pkey_idx, - IN uint16_t pkey) -{ - ib_pkey_table_t *p_block; - - if (!(p_block = osm_pkey_tbl_new_block_get(p_pkey_tbl, block_idx))) { - p_block = (ib_pkey_table_t *) malloc(sizeof(ib_pkey_table_t)); - if (!p_block) - return IB_ERROR; - memset(p_block, 0, sizeof(ib_pkey_table_t)); - cl_ptr_vector_set(&p_pkey_tbl->new_blocks, block_idx, p_block); - } - - p_block->pkey_entry[pkey_idx] = pkey; - if (p_pkey_tbl->used_blocks <= block_idx) - p_pkey_tbl->used_blocks = block_idx + 1; - - return IB_SUCCESS; -} - -boolean_t osm_pkey_find_next_free_entry(IN osm_pkey_tbl_t * p_pkey_tbl, - OUT uint16_t * p_block_idx, - OUT uint8_t * p_pkey_idx) -{ - ib_pkey_table_t *p_new_block; - - CL_ASSERT(p_block_idx); - CL_ASSERT(p_pkey_idx); - - while (*p_block_idx < p_pkey_tbl->max_blocks) { - if (*p_pkey_idx > IB_NUM_PKEY_ELEMENTS_IN_BLOCK - 1) { - *p_pkey_idx = 0; - (*p_block_idx)++; - if (*p_block_idx >= p_pkey_tbl->max_blocks) - return FALSE; - } - - p_new_block = - osm_pkey_tbl_new_block_get(p_pkey_tbl, *p_block_idx); - - if (!p_new_block || - ib_pkey_is_invalid(p_new_block->pkey_entry[*p_pkey_idx])) - return TRUE; - else - (*p_pkey_idx)++; - } - return FALSE; -} - -ib_api_status_t osm_pkey_tbl_get_block_and_idx(IN osm_pkey_tbl_t * p_pkey_tbl, - IN uint16_t * p_pkey, - OUT uint16_t * p_block_idx, - OUT uint8_t * p_pkey_idx) -{ - uint16_t num_of_blocks; - uint16_t block_index; - ib_pkey_table_t *block; - - CL_ASSERT(p_block_idx != NULL); - CL_ASSERT(p_pkey_idx != NULL); - - num_of_blocks = (uint16_t) cl_ptr_vector_get_size(&p_pkey_tbl->blocks); - for (block_index = 0; block_index < num_of_blocks; block_index++) { - block = osm_pkey_tbl_block_get(p_pkey_tbl, block_index); - if ((block->pkey_entry <= p_pkey) && - (p_pkey < - block->pkey_entry + IB_NUM_PKEY_ELEMENTS_IN_BLOCK)) { - *p_block_idx = block_index; - *p_pkey_idx = (uint8_t) (p_pkey - block->pkey_entry); - return IB_SUCCESS; - } - } - return IB_NOT_FOUND; -} - -static boolean_t match_pkey(IN const ib_net16_t * pkey1, - IN const ib_net16_t * pkey2) -{ - - /* if both pkeys are not full member - this is not a match */ - if (!(ib_pkey_is_full_member(*pkey1) || ib_pkey_is_full_member(*pkey2))) - return FALSE; - - /* compare if the bases are the same. if they are - then - this is a match */ - if (ib_pkey_get_base(*pkey1) != ib_pkey_get_base(*pkey2)) - return FALSE; - - return TRUE; -} - -boolean_t osm_physp_share_this_pkey(IN const osm_physp_t * p_physp1, - IN const osm_physp_t * p_physp2, - IN ib_net16_t pkey) -{ - ib_net16_t *pkey1, *pkey2; - - pkey1 = cl_map_get(&(osm_physp_get_pkey_tbl(p_physp1))->keys, - ib_pkey_get_base(pkey)); - pkey2 = cl_map_get(&(osm_physp_get_pkey_tbl(p_physp2))->keys, - ib_pkey_get_base(pkey)); - return (pkey1 && pkey2 && match_pkey(pkey1, pkey2)); -} - -ib_net16_t osm_physp_find_common_pkey(IN const osm_physp_t * p_physp1, - IN const osm_physp_t * p_physp2) -{ - ib_net16_t *pkey1, *pkey2; - uint64_t pkey1_base, pkey2_base; - const osm_pkey_tbl_t *pkey_tbl1, *pkey_tbl2; - cl_map_iterator_t map_iter1, map_iter2; - - pkey_tbl1 = osm_physp_get_pkey_tbl(p_physp1); - pkey_tbl2 = osm_physp_get_pkey_tbl(p_physp2); - - map_iter1 = cl_map_head(&pkey_tbl1->keys); - map_iter2 = cl_map_head(&pkey_tbl2->keys); - - /* we rely on the fact the map are sorted by pkey */ - while ((map_iter1 != cl_map_end(&pkey_tbl1->keys)) && - (map_iter2 != cl_map_end(&pkey_tbl2->keys))) { - pkey1 = (ib_net16_t *) cl_map_obj(map_iter1); - pkey2 = (ib_net16_t *) cl_map_obj(map_iter2); - - if (match_pkey(pkey1, pkey2)) - return *pkey1; - - /* advance the lower value if they are not equal */ - pkey1_base = cl_map_key(map_iter1); - pkey2_base = cl_map_key(map_iter2); - if (pkey2_base == pkey1_base) { - map_iter1 = cl_map_next(map_iter1); - map_iter2 = cl_map_next(map_iter2); - } else if (pkey2_base < pkey1_base) - map_iter2 = cl_map_next(map_iter2); - else - map_iter1 = cl_map_next(map_iter1); - } - - return 0; -} - -boolean_t osm_physp_share_pkey(IN osm_log_t * p_log, - IN const osm_physp_t * p_physp_1, - IN const osm_physp_t * p_physp_2) -{ - const osm_pkey_tbl_t *pkey_tbl1, *pkey_tbl2; - - if (p_physp_1 == p_physp_2) - return TRUE; - - pkey_tbl1 = osm_physp_get_pkey_tbl(p_physp_1); - pkey_tbl2 = osm_physp_get_pkey_tbl(p_physp_2); - - /* - The spec: 10.9.2 does not require each phys port to have PKey Table. - So actually if it does not, we need to use the default port instead. - - HACK: meanwhile we will ignore the check - */ - if (cl_is_map_empty(&pkey_tbl1->keys) - || cl_is_map_empty(&pkey_tbl2->keys)) - return TRUE; - - return - !ib_pkey_is_invalid(osm_physp_find_common_pkey - (p_physp_1, p_physp_2)); -} - -boolean_t osm_port_share_pkey(IN osm_log_t * p_log, - IN const osm_port_t * p_port_1, - IN const osm_port_t * p_port_2) -{ - - osm_physp_t *p_physp1, *p_physp2; - boolean_t ret; - - OSM_LOG_ENTER(p_log); - - if (!p_port_1 || !p_port_2) { - ret = FALSE; - goto Exit; - } - - p_physp1 = p_port_1->p_physp; - p_physp2 = p_port_2->p_physp; - - if (!p_physp1 || !p_physp2) { - ret = FALSE; - goto Exit; - } - - ret = osm_physp_share_pkey(p_log, p_physp1, p_physp2); - -Exit: - OSM_LOG_EXIT(p_log); - return ret; -} - -boolean_t osm_physp_has_pkey(IN osm_log_t * p_log, IN ib_net16_t pkey, - IN const osm_physp_t * p_physp) -{ - - ib_net16_t *p_pkey, pkey_base; - const osm_pkey_tbl_t *pkey_tbl; - boolean_t res = FALSE; - - OSM_LOG_ENTER(p_log); - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Search for PKey: 0x%04x\n", cl_ntoh16(pkey)); - - /* if the pkey given is an invalid pkey - return TRUE. */ - if (ib_pkey_is_invalid(pkey)) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Given invalid PKey - we treat it loosely and allow it\n"); - res = TRUE; - goto Exit; - } - - pkey_base = ib_pkey_get_base(pkey); - - pkey_tbl = osm_physp_get_pkey_tbl(p_physp); - - p_pkey = cl_map_get(&pkey_tbl->keys, pkey_base); - if (p_pkey) { - res = TRUE; - OSM_LOG(p_log, OSM_LOG_DEBUG, - "PKey 0x%04x was found\n", cl_ntoh16(pkey)); - } else - OSM_LOG(p_log, OSM_LOG_DEBUG, - "PKey 0x%04x was not found\n", cl_ntoh16(pkey)); - -Exit: - OSM_LOG_EXIT(p_log); - return res; -} diff --git a/branches/opensm_3/user/opensm/osm_pkey_mgr.c b/branches/opensm_3/user/opensm/osm_pkey_mgr.c deleted file mode 100644 index 379079c6..00000000 --- a/branches/opensm_3/user/opensm/osm_pkey_mgr.c +++ /dev/null @@ -1,520 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of the P_Key Manager (Partititon Manager). - * This is part of the OpenSM. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include - -/* - The max number of pkey blocks for a physical port is located in - a different place for switch external ports (SwitchInfo) and the - rest of the ports (NodeInfo). -*/ -static uint16_t -pkey_mgr_get_physp_max_blocks(IN const osm_subn_t * p_subn, - IN const osm_physp_t * p_physp) -{ - osm_node_t *p_node = osm_physp_get_node_ptr(p_physp); - uint16_t num_pkeys = 0; - - if (!p_node->sw || (osm_physp_get_port_num(p_physp) == 0)) - num_pkeys = cl_ntoh16(p_node->node_info.partition_cap); - else - num_pkeys = cl_ntoh16(p_node->sw->switch_info.enforce_cap); - return ((num_pkeys + 31) / 32); -} - -/* - * Insert new pending pkey entry to the specific port pkey table - * pending pkeys. New entries are inserted at the back. - */ -static void -pkey_mgr_process_physical_port(IN osm_log_t * p_log, - IN osm_sm_t * sm, - IN const ib_net16_t pkey, - IN osm_physp_t * p_physp) -{ - osm_node_t *p_node = osm_physp_get_node_ptr(p_physp); - osm_pkey_tbl_t *p_pkey_tbl; - ib_net16_t *p_orig_pkey; - char *stat = NULL; - osm_pending_pkey_t *p_pending; - - p_pkey_tbl = &p_physp->pkeys; - p_pending = (osm_pending_pkey_t *) malloc(sizeof(osm_pending_pkey_t)); - if (!p_pending) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0502: " - "Failed to allocate new pending pkey entry for node " - "0x%016" PRIx64 " port %u\n", - cl_ntoh64(osm_node_get_node_guid(p_node)), - osm_physp_get_port_num(p_physp)); - return; - } - p_pending->pkey = pkey; - p_orig_pkey = cl_map_get(&p_pkey_tbl->keys, ib_pkey_get_base(pkey)); - if (!p_orig_pkey) { - p_pending->is_new = TRUE; - cl_qlist_insert_tail(&p_pkey_tbl->pending, - (cl_list_item_t *) p_pending); - stat = "inserted"; - } else { - CL_ASSERT(ib_pkey_get_base(*p_orig_pkey) == - ib_pkey_get_base(pkey)); - p_pending->is_new = FALSE; - if (osm_pkey_tbl_get_block_and_idx(p_pkey_tbl, p_orig_pkey, - &p_pending->block, - &p_pending->index) != - IB_SUCCESS) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0503: " - "Failed to obtain P_Key 0x%04x block and index " - "for node 0x%016" PRIx64 " port %u\n", - cl_ntoh16(ib_pkey_get_base(pkey)), - cl_ntoh64(osm_node_get_node_guid(p_node)), - osm_physp_get_port_num(p_physp)); - return; - } - cl_qlist_insert_head(&p_pkey_tbl->pending, - (cl_list_item_t *) p_pending); - stat = "updated"; - } - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "pkey 0x%04x was %s for node 0x%016" PRIx64 " port %u\n", - cl_ntoh16(pkey), stat, - cl_ntoh64(osm_node_get_node_guid(p_node)), - osm_physp_get_port_num(p_physp)); -} - -static void -pkey_mgr_process_partition_table(osm_log_t * p_log, osm_sm_t * sm, - const osm_prtn_t * p_prtn, - const boolean_t full) -{ - const cl_map_t *p_tbl = - full ? &p_prtn->full_guid_tbl : &p_prtn->part_guid_tbl; - cl_map_iterator_t i, i_next; - ib_net16_t pkey = p_prtn->pkey; - osm_physp_t *p_physp; - - if (full) - pkey |= cl_hton16(0x8000); - - i_next = cl_map_head(p_tbl); - while (i_next != cl_map_end(p_tbl)) { - i = i_next; - i_next = cl_map_next(i); - p_physp = cl_map_obj(i); - if (p_physp) - pkey_mgr_process_physical_port(p_log, sm, pkey, - p_physp); - } -} - -static ib_api_status_t -pkey_mgr_update_pkey_entry(IN osm_sm_t * sm, - IN const osm_physp_t * p_physp, - IN const ib_pkey_table_t * block, - IN const uint16_t block_index) -{ - osm_madw_context_t context; - osm_node_t *p_node = osm_physp_get_node_ptr(p_physp); - uint32_t attr_mod; - - context.pkey_context.node_guid = osm_node_get_node_guid(p_node); - context.pkey_context.port_guid = osm_physp_get_port_guid(p_physp); - context.pkey_context.set_method = TRUE; - attr_mod = block_index; - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH) - attr_mod |= osm_physp_get_port_num(p_physp) << 16; - return osm_req_set(sm, osm_physp_get_dr_path_ptr(p_physp), - (uint8_t *) block, sizeof(*block), - IB_MAD_ATTR_P_KEY_TABLE, - cl_hton32(attr_mod), CL_DISP_MSGID_NONE, &context); -} - -static ib_api_status_t -pkey_mgr_enforce_partition(IN osm_log_t * p_log, osm_sm_t * sm, - IN osm_physp_t * p_physp, IN const boolean_t enforce) -{ - osm_madw_context_t context; - uint8_t payload[IB_SMP_DATA_SIZE]; - ib_port_info_t *p_pi; - ib_api_status_t status; - - p_pi = &p_physp->port_info; - - if ((p_pi->vl_enforce & 0xc) == (0xc) * (enforce == TRUE)) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "No need to update PortInfo for " - "node 0x%016" PRIx64 " port %u (%s)\n", - cl_ntoh64(osm_node_get_node_guid - (osm_physp_get_node_ptr(p_physp))), - osm_physp_get_port_num(p_physp), - p_physp->p_node->print_desc); - return IB_SUCCESS; - } - - memcpy(payload, p_pi, sizeof(ib_port_info_t)); - memset(payload + sizeof(ib_port_info_t), 0, - IB_SMP_DATA_SIZE - sizeof(ib_port_info_t)); - - p_pi = (ib_port_info_t *) payload; - if (enforce == TRUE) - p_pi->vl_enforce |= 0xc; - else - p_pi->vl_enforce &= ~0xc; - p_pi->state_info2 = 0; - ib_port_info_set_port_state(p_pi, IB_LINK_NO_CHANGE); - - context.pi_context.node_guid = - osm_node_get_node_guid(osm_physp_get_node_ptr(p_physp)); - context.pi_context.port_guid = osm_physp_get_port_guid(p_physp); - context.pi_context.set_method = TRUE; - context.pi_context.light_sweep = FALSE; - context.pi_context.active_transition = FALSE; - - status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p_physp), - payload, sizeof(payload), - IB_MAD_ATTR_PORT_INFO, - cl_hton32(osm_physp_get_port_num(p_physp)), - CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0511: " - "Failed to set PortInfo for " - "node 0x%016" PRIx64 " port %u (%s)\n", - cl_ntoh64(osm_node_get_node_guid - (osm_physp_get_node_ptr(p_physp))), - osm_physp_get_port_num(p_physp), - p_physp->p_node->print_desc); - else - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Set PortInfo for node 0x%016" PRIx64 " port %u (%s)\n", - cl_ntoh64(osm_node_get_node_guid - (osm_physp_get_node_ptr(p_physp))), - osm_physp_get_port_num(p_physp), - p_physp->p_node->print_desc); - return status; -} - -static int pkey_mgr_update_port(osm_log_t * p_log, osm_sm_t * sm, - const osm_port_t * const p_port) -{ - osm_physp_t *p_physp; - osm_node_t *p_node; - ib_pkey_table_t *block, *new_block; - osm_pkey_tbl_t *p_pkey_tbl; - uint16_t block_index; - uint8_t pkey_index; - uint16_t last_free_block_index = 0; - uint8_t last_free_pkey_index = 0; - uint16_t num_of_blocks; - uint16_t max_num_of_blocks; - ib_api_status_t status; - osm_pending_pkey_t *p_pending; - boolean_t found; - ib_pkey_table_t empty_block; - int ret = 0; - - memset(&empty_block, 0, sizeof(ib_pkey_table_t)); - - p_physp = p_port->p_physp; - if (!p_physp) - return FALSE; - - p_node = osm_physp_get_node_ptr(p_physp); - p_pkey_tbl = &p_physp->pkeys; - num_of_blocks = osm_pkey_tbl_get_num_blocks(p_pkey_tbl); - max_num_of_blocks = - pkey_mgr_get_physp_max_blocks(sm->p_subn, p_physp); - if (p_pkey_tbl->max_blocks > max_num_of_blocks) { - OSM_LOG(p_log, OSM_LOG_INFO, - "Max number of blocks reduced from %u to %u " - "for node 0x%016" PRIx64 " port %u (%s)\n", - p_pkey_tbl->max_blocks, max_num_of_blocks, - cl_ntoh64(osm_node_get_node_guid(p_node)), - osm_physp_get_port_num(p_physp), - p_physp->p_node->print_desc); - } - p_pkey_tbl->max_blocks = max_num_of_blocks; - - osm_pkey_tbl_init_new_blocks(p_pkey_tbl); - p_pkey_tbl->used_blocks = 0; - - /* - process every pending pkey in order - - first must be "updated" last are "new" - */ - p_pending = - (osm_pending_pkey_t *) cl_qlist_remove_head(&p_pkey_tbl->pending); - while (p_pending != - (osm_pending_pkey_t *) cl_qlist_end(&p_pkey_tbl->pending)) { - if (p_pending->is_new == FALSE) { - block_index = p_pending->block; - pkey_index = p_pending->index; - found = TRUE; - } else { - found = osm_pkey_find_next_free_entry(p_pkey_tbl, - &last_free_block_index, - &last_free_pkey_index); - if (!found) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0504: " - "Failed to find empty space for new pkey 0x%04x " - "for node 0x%016" PRIx64 " port %u (%s)\n", - cl_ntoh16(p_pending->pkey), - cl_ntoh64(osm_node_get_node_guid - (p_node)), - osm_physp_get_port_num(p_physp), - p_physp->p_node->print_desc); - } else { - block_index = last_free_block_index; - pkey_index = last_free_pkey_index++; - } - } - - if (found) { - if (IB_SUCCESS != - osm_pkey_tbl_set_new_entry(p_pkey_tbl, block_index, - pkey_index, - p_pending->pkey)) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0505: " - "Failed to set PKey 0x%04x in block %u idx %u " - "for node 0x%016" PRIx64 " port %u (%s)\n", - cl_ntoh16(p_pending->pkey), block_index, - pkey_index, - cl_ntoh64(osm_node_get_node_guid - (p_node)), - osm_physp_get_port_num(p_physp), - p_physp->p_node->print_desc); - } - } - - free(p_pending); - p_pending = - (osm_pending_pkey_t *) cl_qlist_remove_head(&p_pkey_tbl-> - pending); - } - - /* now look for changes and store */ - for (block_index = 0; block_index < num_of_blocks; block_index++) { - block = osm_pkey_tbl_block_get(p_pkey_tbl, block_index); - new_block = osm_pkey_tbl_new_block_get(p_pkey_tbl, block_index); - if (!new_block) - new_block = &empty_block; - if (block && !memcmp(new_block, block, sizeof(*block))) - continue; - - status = - pkey_mgr_update_pkey_entry(sm, p_physp, new_block, - block_index); - if (status == IB_SUCCESS) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Updated pkey table block %d for node 0x%016" - PRIx64 " port %u (%s)\n", block_index, - cl_ntoh64(osm_node_get_node_guid(p_node)), - osm_physp_get_port_num(p_physp), - p_physp->p_node->print_desc); - else { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0506: " - "pkey_mgr_update_pkey_entry() failed to update " - "pkey table block %d for node 0x%016" PRIx64 - " port %u (%s)\n", block_index, - cl_ntoh64(osm_node_get_node_guid(p_node)), - osm_physp_get_port_num(p_physp), - p_physp->p_node->print_desc); - ret = -1; - } - } - - return ret; -} - -static int pkey_mgr_update_peer_port(osm_log_t * p_log, osm_sm_t * sm, - const osm_subn_t * p_subn, - const osm_port_t * const p_port, - boolean_t enforce) -{ - osm_physp_t *p_physp, *peer; - osm_node_t *p_node; - ib_pkey_table_t *block, *peer_block; - const osm_pkey_tbl_t *p_pkey_tbl; - osm_pkey_tbl_t *p_peer_pkey_tbl; - uint16_t block_index; - uint16_t num_of_blocks; - uint16_t peer_max_blocks; - ib_api_status_t status = IB_SUCCESS; - ib_pkey_table_t empty_block; - int ret = 0; - - memset(&empty_block, 0, sizeof(ib_pkey_table_t)); - - p_physp = p_port->p_physp; - if (!p_physp) - return -1; - peer = osm_physp_get_remote(p_physp); - if (!peer) - return -1; - p_node = osm_physp_get_node_ptr(peer); - if (!p_node->sw || !p_node->sw->switch_info.enforce_cap) - return 0; - - p_pkey_tbl = osm_physp_get_pkey_tbl(p_physp); - p_peer_pkey_tbl = &peer->pkeys; - num_of_blocks = osm_pkey_tbl_get_num_blocks(p_pkey_tbl); - peer_max_blocks = pkey_mgr_get_physp_max_blocks(p_subn, peer); - if (peer_max_blocks < p_pkey_tbl->used_blocks) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0508: " - "Not enough pkey entries (%u < %u) on switch 0x%016" - PRIx64 " port %u (%s). Clearing Enforcement bit\n", - peer_max_blocks, num_of_blocks, - cl_ntoh64(osm_node_get_node_guid(p_node)), - osm_physp_get_port_num(peer), - p_node->print_desc); - enforce = FALSE; - ret = -1; - } - - if (pkey_mgr_enforce_partition(p_log, sm, peer, enforce)) - ret = -1; - - if (enforce == FALSE) - return ret; - - p_peer_pkey_tbl->used_blocks = p_pkey_tbl->used_blocks; - for (block_index = 0; block_index < p_pkey_tbl->used_blocks; - block_index++) { - block = osm_pkey_tbl_new_block_get(p_pkey_tbl, block_index); - if (!block) - block = &empty_block; - - peer_block = - osm_pkey_tbl_block_get(p_peer_pkey_tbl, block_index); - if (!peer_block - || memcmp(peer_block, block, sizeof(*peer_block))) { - status = pkey_mgr_update_pkey_entry(sm, peer, block, - block_index); - if (status != IB_SUCCESS) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0509: " - "pkey_mgr_update_pkey_entry() failed to update " - "pkey table block %d for node 0x%016" - PRIx64 " port %u (%s)\n", block_index, - cl_ntoh64(osm_node_get_node_guid - (p_node)), - osm_physp_get_port_num(peer), - p_node->print_desc); - ret = -1; - } - } - } - - if (!ret) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Pkey table was updated for node 0x%016" PRIx64 - " port %u (%s)\n", - cl_ntoh64(osm_node_get_node_guid(p_node)), - osm_physp_get_port_num(peer), p_node->print_desc); - - return ret; -} - -int osm_pkey_mgr_process(IN osm_opensm_t * p_osm) -{ - cl_qmap_t *p_tbl; - cl_map_item_t *p_next; - osm_prtn_t *p_prtn; - osm_port_t *p_port; - int ret = 0; - - CL_ASSERT(p_osm); - - OSM_LOG_ENTER(&p_osm->log); - - CL_PLOCK_EXCL_ACQUIRE(&p_osm->lock); - - if (osm_prtn_make_partitions(&p_osm->log, &p_osm->subn) != IB_SUCCESS) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "ERR 0510: " - "osm_prtn_make_partitions() failed\n"); - ret = -1; - goto _err; - } - - /* populate the pending pkey entries by scanning all partitions */ - p_tbl = &p_osm->subn.prtn_pkey_tbl; - p_next = cl_qmap_head(p_tbl); - while (p_next != cl_qmap_end(p_tbl)) { - p_prtn = (osm_prtn_t *) p_next; - p_next = cl_qmap_next(p_next); - pkey_mgr_process_partition_table(&p_osm->log, &p_osm->sm, - p_prtn, FALSE); - pkey_mgr_process_partition_table(&p_osm->log, &p_osm->sm, - p_prtn, TRUE); - } - - /* calculate and set new pkey tables */ - p_tbl = &p_osm->subn.port_guid_tbl; - p_next = cl_qmap_head(p_tbl); - while (p_next != cl_qmap_end(p_tbl)) { - p_port = (osm_port_t *) p_next; - p_next = cl_qmap_next(p_next); - if (pkey_mgr_update_port(&p_osm->log, &p_osm->sm, p_port)) - ret = -1; - if ((osm_node_get_type(p_port->p_node) != IB_NODE_TYPE_SWITCH) - && pkey_mgr_update_peer_port(&p_osm->log, &p_osm->sm, - &p_osm->subn, p_port, - !p_osm->subn.opt. - no_partition_enforcement)) - ret = -1; - } - -_err: - CL_PLOCK_RELEASE(&p_osm->lock); - OSM_LOG_EXIT(&p_osm->log); - return ret; -} diff --git a/branches/opensm_3/user/opensm/osm_pkey_rcv.c b/branches/opensm_3/user/opensm/osm_pkey_rcv.c deleted file mode 100644 index 709ef0b4..00000000 --- a/branches/opensm_3/user/opensm/osm_pkey_rcv.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * WE ONLY RECEIVE GET or SET responses - */ -void osm_pkey_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_pkey_table_t *p_pkey_tbl; - ib_smp_t *p_smp; - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_node_t *p_node; - osm_pkey_context_t *p_context; - ib_net64_t port_guid; - ib_net64_t node_guid; - uint8_t port_num; - uint16_t block_num; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - p_context = osm_madw_get_pkey_context_ptr(p_madw); - p_pkey_tbl = ib_smp_get_payload_ptr(p_smp); - - port_guid = p_context->port_guid; - node_guid = p_context->node_guid; - - CL_ASSERT(p_smp->attr_id == IB_MAD_ATTR_P_KEY_TABLE); - - cl_plock_excl_acquire(sm->p_lock); - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 4806: " - "No port object for port with GUID 0x%" PRIx64 - "\n\t\t\t\tfor parent node GUID 0x%" PRIx64 - ", TID 0x%" PRIx64 "\n", cl_ntoh64(port_guid), - cl_ntoh64(node_guid), cl_ntoh64(p_smp->trans_id)); - goto Exit; - } - - p_node = p_port->p_node; - CL_ASSERT(p_node); - - block_num = (uint16_t) ((cl_ntoh32(p_smp->attr_mod)) & 0x0000FFFF); - /* in case of a non switch node the attr modifier should be ignored */ - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH) { - port_num = - (uint8_t) (((cl_ntoh32(p_smp->attr_mod)) & 0x00FF0000) >> - 16); - p_physp = osm_node_get_physp_ptr(p_node, port_num); - } else { - p_physp = p_port->p_physp; - port_num = p_physp->port_num; - } - - /* - We do not care if this is a result of a set or get - - all we want is to update the subnet. - */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Got GetResp(PKey) block:%u port_num %u with GUID 0x%" - PRIx64 " for parent node GUID 0x%" PRIx64 ", TID 0x%" - PRIx64 "\n", block_num, port_num, cl_ntoh64(port_guid), - cl_ntoh64(node_guid), cl_ntoh64(p_smp->trans_id)); - - /* - Determine if we encountered a new Physical Port. - If so, ignore it. - */ - if (!p_physp) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 4807: " - "Got invalid port number %u\n", port_num); - goto Exit; - } - - osm_dump_pkey_block(sm->p_log, port_guid, block_num, port_num, - p_pkey_tbl, OSM_LOG_DEBUG); - - osm_physp_set_pkey_tbl(sm->p_log, sm->p_subn, - p_physp, p_pkey_tbl, block_num); - -Exit: - cl_plock_release(sm->p_lock); - - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_port.c b/branches/opensm_3/user/opensm/osm_port.c deleted file mode 100644 index 11cd01dd..00000000 --- a/branches/opensm_3/user/opensm/osm_port.c +++ /dev/null @@ -1,634 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_physp_t. - * This object represents an Infiniband Port. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include - -void osm_physp_construct(IN osm_physp_t * p_physp) -{ - memset(p_physp, 0, sizeof(*p_physp)); - osm_dr_path_construct(&p_physp->dr_path); - cl_ptr_vector_construct(&p_physp->slvl_by_port); - osm_pkey_tbl_construct(&p_physp->pkeys); -} - -void osm_physp_destroy(IN osm_physp_t * p_physp) -{ - size_t num_slvl, i; - - /* the physp might be uninitialized */ - if (p_physp->port_guid) { - /* free the SL2VL Tables */ - num_slvl = cl_ptr_vector_get_size(&p_physp->slvl_by_port); - for (i = 0; i < num_slvl; i++) - free(cl_ptr_vector_get(&p_physp->slvl_by_port, i)); - cl_ptr_vector_destroy(&p_physp->slvl_by_port); - - /* free the P_Key Tables */ - osm_pkey_tbl_destroy(&p_physp->pkeys); - - memset(p_physp, 0, sizeof(*p_physp)); - osm_dr_path_construct(&p_physp->dr_path); /* clear dr_path */ - } -} - -void osm_physp_init(IN osm_physp_t * p_physp, IN ib_net64_t port_guid, - IN uint8_t port_num, IN const struct osm_node *p_node, - IN osm_bind_handle_t h_bind, IN uint8_t hop_count, - IN const uint8_t * p_initial_path) -{ - uint16_t num_slvl, i; - ib_slvl_table_t *p_slvl; - - CL_ASSERT(p_node); - - osm_physp_construct(p_physp); - p_physp->port_guid = port_guid; - p_physp->port_num = port_num; - p_physp->healthy = TRUE; - p_physp->need_update = 2; - p_physp->p_node = (struct osm_node *)p_node; - - osm_dr_path_init(&p_physp->dr_path, h_bind, hop_count, p_initial_path); - - /* allocate enough SL2VL tables */ - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH) - /* we need node num ports + 1 SL2VL tables */ - num_slvl = osm_node_get_num_physp(p_node) + 1; - else - /* An end node - we need only one SL2VL */ - num_slvl = 1; - - cl_ptr_vector_init(&p_physp->slvl_by_port, num_slvl, 1); - for (i = 0; i < num_slvl; i++) { - p_slvl = (ib_slvl_table_t *) malloc(sizeof(ib_slvl_table_t)); - if (!p_slvl) - break; - memset(p_slvl, 0, sizeof(ib_slvl_table_t)); - cl_ptr_vector_set(&p_physp->slvl_by_port, i, p_slvl); - } - - /* initialize the pkey table */ - osm_pkey_tbl_init(&p_physp->pkeys); -} - -void osm_port_delete(IN OUT osm_port_t ** pp_port) -{ - free(*pp_port); - *pp_port = NULL; -} - -osm_port_t *osm_port_new(IN const ib_node_info_t * p_ni, - IN osm_node_t * p_parent_node) -{ - osm_port_t *p_port; - ib_net64_t port_guid; - osm_physp_t *p_physp; - uint8_t port_num; - - p_port = malloc(sizeof(*p_port)); - if (!p_port) - return NULL; - - memset(p_port, 0, sizeof(*p_port)); - cl_qlist_init(&p_port->mcm_list); - p_port->p_node = (struct osm_node *)p_parent_node; - port_guid = p_ni->port_guid; - p_port->guid = port_guid; - port_num = p_ni->node_type == IB_NODE_TYPE_SWITCH ? - 0 : ib_node_info_get_local_port_num(p_ni); - - /* - Get the pointers to the physical node objects "owned" by this - logical port GUID. - For switches, port '0' is owned; for HCA's and routers, - only the singular part that has this GUID is owned. - */ - p_physp = osm_node_get_physp_ptr(p_parent_node, port_num); - CL_ASSERT(port_guid == osm_physp_get_port_guid(p_physp)); - p_port->p_physp = p_physp; - - return p_port; -} - -void osm_port_get_lid_range_ho(IN const osm_port_t * p_port, - IN uint16_t * p_min_lid, IN uint16_t * p_max_lid) -{ - uint8_t lmc; - - *p_min_lid = cl_ntoh16(osm_port_get_base_lid(p_port)); - lmc = osm_port_get_lmc(p_port); - *p_max_lid = (uint16_t) (*p_min_lid + (1 << lmc) - 1); -} - -uint8_t osm_physp_calc_link_mtu(IN osm_log_t * p_log, - IN const osm_physp_t * p_physp) -{ - const osm_physp_t *p_remote_physp; - uint8_t mtu; - uint8_t remote_mtu; - - OSM_LOG_ENTER(p_log); - - p_remote_physp = osm_physp_get_remote(p_physp); - if (p_remote_physp) { - /* use the available MTU */ - mtu = ib_port_info_get_mtu_cap(&p_physp->port_info); - - remote_mtu = - ib_port_info_get_mtu_cap(&p_remote_physp->port_info); - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Remote port 0x%016" PRIx64 " port = %u : " - "MTU = %u. This Port MTU: %u\n", - cl_ntoh64(osm_physp_get_port_guid(p_remote_physp)), - osm_physp_get_port_num(p_remote_physp), - remote_mtu, mtu); - - if (mtu != remote_mtu) { - if (mtu > remote_mtu) - mtu = remote_mtu; - - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "MTU mismatch between ports." - "\n\t\t\t\tPort 0x%016" PRIx64 ", port %u" - " and port 0x%016" PRIx64 ", port %u." - "\n\t\t\t\tUsing lower MTU of %u\n", - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - osm_physp_get_port_num(p_physp), - cl_ntoh64(osm_physp_get_port_guid - (p_remote_physp)), - osm_physp_get_port_num(p_remote_physp), mtu); - } - } else - mtu = ib_port_info_get_neighbor_mtu(&p_physp->port_info); - - if (mtu == 0) { - OSM_LOG(p_log, OSM_LOG_DEBUG, "ERR 4101: " - "Invalid MTU = 0. Forcing correction to 256\n"); - mtu = 1; - } - - OSM_LOG_EXIT(p_log); - return mtu; -} - -uint8_t osm_physp_calc_link_op_vls(IN osm_log_t * p_log, - IN const osm_subn_t * p_subn, - IN const osm_physp_t * p_physp) -{ - const osm_physp_t *p_remote_physp; - uint8_t op_vls; - uint8_t remote_op_vls; - - OSM_LOG_ENTER(p_log); - - p_remote_physp = osm_physp_get_remote(p_physp); - if (p_remote_physp) { - /* use the available VLCap */ - op_vls = ib_port_info_get_vl_cap(&p_physp->port_info); - - remote_op_vls = - ib_port_info_get_vl_cap(&p_remote_physp->port_info); - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Remote port 0x%016" PRIx64 " port = 0x%X : " - "VL_CAP = %u. This port VL_CAP = %u\n", - cl_ntoh64(osm_physp_get_port_guid(p_remote_physp)), - osm_physp_get_port_num(p_remote_physp), - remote_op_vls, op_vls); - - if (op_vls != remote_op_vls) { - if (op_vls > remote_op_vls) - op_vls = remote_op_vls; - - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "OP_VLS mismatch between ports." - "\n\t\t\t\tPort 0x%016" PRIx64 ", port 0x%X" - " and port 0x%016" PRIx64 ", port 0x%X." - "\n\t\t\t\tUsing lower OP_VLS of %u\n", - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - osm_physp_get_port_num(p_physp), - cl_ntoh64(osm_physp_get_port_guid - (p_remote_physp)), - osm_physp_get_port_num(p_remote_physp), op_vls); - } - } else - op_vls = ib_port_info_get_op_vls(&p_physp->port_info); - - if (op_vls == 0) { - /* for non compliant implementations */ - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Invalid OP_VLS = 0. Forcing correction to 1 (VL0)\n"); - op_vls = 1; - } - - /* support user limitation of max_op_vls */ - if (op_vls > p_subn->opt.max_op_vls) - op_vls = p_subn->opt.max_op_vls; - - OSM_LOG_EXIT(p_log); - return op_vls; -} - -static inline uint64_t ptr_to_key(void const *p) -{ - uint64_t k = 0; - - memcpy(&k, p, sizeof(void *)); - return k; -} - -static inline void *key_to_ptr(uint64_t k) -{ - void *p = 0; - - memcpy(&p, &k, sizeof(void *)); - return p; -} - -/********************************************************************** - Traverse the fabric from the SM node following the DR path given and - add every phys port traversed to the map. Avoid tracking the first and - last phys ports (going into the first switch and into the target port). - **********************************************************************/ -static cl_status_t physp_get_dr_physp_set(IN osm_log_t * p_log, - IN osm_subn_t const *p_subn, - IN osm_dr_path_t const *p_path, - OUT cl_map_t * p_physp_map) -{ - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_node_t *p_node; - uint8_t hop; - cl_status_t status = CL_SUCCESS; - - OSM_LOG_ENTER(p_log); - - /* find the OSM node */ - p_port = osm_get_port_by_guid(p_subn, p_subn->sm_port_guid); - if (!p_port) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4103: " - "Failed to find the SM own port by guid\n"); - status = CL_ERROR; - goto Exit; - } - - /* get the node of the SM */ - p_node = p_port->p_node; - - /* - traverse the path adding the nodes to the table - start after the first dummy hop and stop just before the - last one - */ - for (hop = 1; hop < p_path->hop_count - 1; hop++) { - /* go out using the phys port of the path */ - p_physp = osm_node_get_physp_ptr(p_node, p_path->path[hop]); - - /* make sure we got a valid port and it has a remote port */ - if (!p_physp) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4104: " - "DR Traversal stopped on invalid port at hop:%u\n", - hop); - status = CL_ERROR; - goto Exit; - } - - /* we track the ports we go out along the path */ - if (hop > 1) - cl_map_insert(p_physp_map, ptr_to_key(p_physp), NULL); - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Traversed through node: 0x%016" PRIx64 - " port:%u\n", - cl_ntoh64(p_node->node_info.node_guid), - p_path->path[hop]); - - if (!(p_physp = osm_physp_get_remote(p_physp))) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4106: " - "DR Traversal stopped on missing remote physp at hop:%u\n", - hop); - status = CL_ERROR; - goto Exit; - } - - p_node = osm_physp_get_node_ptr(p_physp); - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -static void physp_update_new_dr_path(IN osm_physp_t const *p_dest_physp, - IN cl_map_t * p_visited_map, - IN osm_bind_handle_t * h_bind) -{ - cl_list_t tmpPortsList; - osm_physp_t *p_physp, *p_src_physp = NULL; - uint8_t path_array[IB_SUBNET_PATH_HOPS_MAX]; - uint8_t i = 0; - osm_dr_path_t *p_dr_path; - - cl_list_construct(&tmpPortsList); - cl_list_init(&tmpPortsList, 10); - - cl_list_insert_head(&tmpPortsList, p_dest_physp); - /* get the output port where we need to come from */ - p_physp = (osm_physp_t *) cl_map_get(p_visited_map, - ptr_to_key(p_dest_physp)); - while (p_physp != NULL) { - cl_list_insert_head(&tmpPortsList, p_physp); - /* get the input port through where we reached the output port */ - p_src_physp = p_physp; - p_physp = (osm_physp_t *) cl_map_get(p_visited_map, - ptr_to_key(p_physp)); - /* if we reached a null p_physp - this means we are at the begining - of the path. Break. */ - if (p_physp == NULL) - break; - /* get the output port */ - p_physp = (osm_physp_t *) cl_map_get(p_visited_map, - ptr_to_key(p_physp)); - } - - memset(path_array, 0, sizeof(path_array)); - p_physp = (osm_physp_t *) cl_list_remove_head(&tmpPortsList); - while (p_physp != NULL) { - i++; - path_array[i] = p_physp->port_num; - p_physp = (osm_physp_t *) cl_list_remove_head(&tmpPortsList); - } - if (p_src_physp) { - p_dr_path = osm_physp_get_dr_path_ptr(p_src_physp); - osm_dr_path_init(p_dr_path, h_bind, i, path_array); - } - - cl_list_destroy(&tmpPortsList); -} - -void osm_physp_replace_dr_path_with_alternate_dr_path(IN osm_log_t * p_log, - IN osm_subn_t const - *p_subn, IN osm_physp_t const - *p_dest_physp, - IN osm_bind_handle_t * - h_bind) -{ - cl_map_t physp_map; - cl_map_t visited_map; - osm_dr_path_t *p_dr_path; - cl_list_t *p_currPortsList; - cl_list_t *p_nextPortsList; - osm_port_t *p_port; - osm_physp_t *p_physp, *p_remote_physp; - ib_net64_t port_guid; - boolean_t next_list_is_full = TRUE, reached_dest = FALSE; - uint8_t num_ports, port_num; - - p_nextPortsList = (cl_list_t *) malloc(sizeof(cl_list_t)); - if (!p_nextPortsList) - return; - - /* - initialize the map of all port participating in current dr path - not including first and last switches - */ - cl_map_construct(&physp_map); - cl_map_init(&physp_map, 4); - cl_map_construct(&visited_map); - cl_map_init(&visited_map, 4); - p_dr_path = osm_physp_get_dr_path_ptr(p_dest_physp); - physp_get_dr_physp_set(p_log, p_subn, p_dr_path, &physp_map); - - /* - BFS from OSM port until we find the target physp but avoid - going through mapped ports - */ - cl_list_construct(p_nextPortsList); - cl_list_init(p_nextPortsList, 10); - - port_guid = p_subn->sm_port_guid; - - CL_ASSERT(port_guid); - - p_port = osm_get_port_by_guid(p_subn, port_guid); - if (!p_port) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4105: No SM port object\n"); - goto Exit; - } - - /* - HACK: We are assuming SM is running on HCA, so when getting the default - port we'll get the port connected to the rest of the subnet. If SM is - running on SWITCH - we should try to get a dr path from all switch ports. - */ - p_physp = p_port->p_physp; - - CL_ASSERT(p_physp); - - cl_list_insert_tail(p_nextPortsList, p_physp); - - while (next_list_is_full == TRUE) { - next_list_is_full = FALSE; - p_currPortsList = p_nextPortsList; - p_nextPortsList = (cl_list_t *) malloc(sizeof(cl_list_t)); - if (!p_nextPortsList) { - p_nextPortsList = p_currPortsList; - goto Exit; - } - cl_list_construct(p_nextPortsList); - cl_list_init(p_nextPortsList, 10); - p_physp = (osm_physp_t *) cl_list_remove_head(p_currPortsList); - while (p_physp != NULL) { - /* If we are in a switch - need to go out through all - the other physical ports of the switch */ - num_ports = osm_node_get_num_physp(p_physp->p_node); - - for (port_num = 1; port_num < num_ports; port_num++) { - if (osm_node_get_type(p_physp->p_node) == - IB_NODE_TYPE_SWITCH) - p_remote_physp = - osm_node_get_physp_ptr(p_physp-> - p_node, - port_num); - else - /* this is HCA or router - the remote port is just the port connected - on the other side */ - p_remote_physp = - p_physp->p_remote_physp; - - /* - make sure that all of the following occurred: - 1. The port isn't NULL - 2. This is not the port we came from - 3. The port is not in the physp_map - 4. This port haven't been visited before - */ - if (p_remote_physp && - p_remote_physp != p_physp && - cl_map_get(&physp_map, - ptr_to_key(p_remote_physp)) - == NULL - && cl_map_get(&visited_map, - ptr_to_key - (p_remote_physp)) == NULL) { - /* Insert the port into the visited_map, and save its source port */ - cl_map_insert(&visited_map, - ptr_to_key - (p_remote_physp), - p_physp); - - /* Is this the p_dest_physp? */ - if (p_remote_physp == p_dest_physp) { - /* update the new dr path */ - physp_update_new_dr_path - (p_dest_physp, &visited_map, - h_bind); - reached_dest = TRUE; - break; - } - - /* add the p_remote_physp to the nextPortsList */ - cl_list_insert_tail(p_nextPortsList, - p_remote_physp); - next_list_is_full = TRUE; - } - } - - p_physp = (osm_physp_t *) - cl_list_remove_head(p_currPortsList); - if (reached_dest == TRUE) { - /* free the rest of the currPortsList */ - while (p_physp != NULL) - p_physp = (osm_physp_t *) - cl_list_remove_head - (p_currPortsList); - /* free the nextPortsList, if items were added to it */ - p_physp = (osm_physp_t *) - cl_list_remove_head(p_nextPortsList); - while (p_physp != NULL) - p_physp = (osm_physp_t *) - cl_list_remove_head - (p_nextPortsList); - next_list_is_full = FALSE; - } - } - cl_list_destroy(p_currPortsList); - free(p_currPortsList); - } - - /* cleanup */ -Exit: - cl_list_destroy(p_nextPortsList); - free(p_nextPortsList); - cl_map_destroy(&physp_map); - cl_map_destroy(&visited_map); -} - -boolean_t osm_link_is_healthy(IN const osm_physp_t * p_physp) -{ - osm_physp_t *p_remote_physp; - - CL_ASSERT(p_physp); - p_remote_physp = p_physp->p_remote_physp; - if (p_remote_physp != NULL) - return ((p_physp->healthy) & (p_remote_physp->healthy)); - /* the other side is not known - consider the link as healthy */ - return TRUE; -} - -void osm_physp_set_pkey_tbl(IN osm_log_t * p_log, IN const osm_subn_t * p_subn, - IN osm_physp_t * p_physp, - IN ib_pkey_table_t * p_pkey_tbl, - IN uint16_t block_num) -{ - uint16_t max_blocks; - - CL_ASSERT(p_pkey_tbl); - /* - (14.2.5.7) - the block number valid values are 0-2047, and are - further limited by the size of the P_Key table specified by - the PartitionCap on the node. - */ - if (!p_physp->p_node->sw || p_physp->port_num == 0) - /* - The maximum blocks is defined in the node info: partition cap - for CA, router, and switch management ports. - */ - max_blocks = - (cl_ntoh16(p_physp->p_node->node_info.partition_cap) + - IB_NUM_PKEY_ELEMENTS_IN_BLOCK - 1) - / IB_NUM_PKEY_ELEMENTS_IN_BLOCK; - else - /* - This is a switch, and not a management port. The maximum - blocks is defined in the switch info: partition enforcement - cap. - */ - max_blocks = - (cl_ntoh16(p_physp->p_node->sw->switch_info.enforce_cap) + - IB_NUM_PKEY_ELEMENTS_IN_BLOCK - - 1) / IB_NUM_PKEY_ELEMENTS_IN_BLOCK; - - if (block_num >= max_blocks) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4108: " - "Got illegal set for block number:%u " - "For GUID: %" PRIx64 " port number:%u\n", - block_num, - cl_ntoh64(p_physp->p_node->node_info.node_guid), - p_physp->port_num); - return; - } - - osm_pkey_tbl_set(&p_physp->pkeys, block_num, p_pkey_tbl); -} diff --git a/branches/opensm_3/user/opensm/osm_port_info_rcv.c b/branches/opensm_3/user/opensm/osm_port_info_rcv.c deleted file mode 100644 index ad3e81f6..00000000 --- a/branches/opensm_3/user/opensm/osm_port_info_rcv.c +++ /dev/null @@ -1,618 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_pi_rcv_t. - * This object represents the PortInfo Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static void pi_rcv_check_and_fix_lid(osm_log_t * log, ib_port_info_t * pi, - osm_physp_t * p) -{ - if (cl_ntoh16(pi->base_lid) > IB_LID_UCAST_END_HO) { - OSM_LOG(log, OSM_LOG_ERROR, "ERR 0F04: " - "Got invalid base LID %u from the network. " - "Corrected to %u\n", cl_ntoh16(pi->base_lid), - cl_ntoh16(p->port_info.base_lid)); - pi->base_lid = p->port_info.base_lid; - } -} - -static void pi_rcv_process_endport(IN osm_sm_t * sm, IN osm_physp_t * p_physp, - IN const ib_port_info_t * p_pi) -{ - osm_madw_context_t context; - ib_api_status_t status; - ib_net64_t port_guid; - uint8_t rate, mtu; - cl_qmap_t *p_sm_tbl; - osm_remote_sm_t *p_sm; - - OSM_LOG_ENTER(sm->p_log); - - port_guid = osm_physp_get_port_guid(p_physp); - - /* HACK extended port 0 should be handled too! */ - if (osm_physp_get_port_num(p_physp) != 0) { - /* track the minimal endport MTU and rate */ - mtu = ib_port_info_get_mtu_cap(p_pi); - if (mtu < sm->p_subn->min_ca_mtu) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Setting endport minimal MTU to:%u defined by port:0x%" - PRIx64 "\n", mtu, cl_ntoh64(port_guid)); - sm->p_subn->min_ca_mtu = mtu; - } - - rate = ib_port_info_compute_rate(p_pi); - if (rate < sm->p_subn->min_ca_rate) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Setting endport minimal rate to:%u defined by port:0x%" - PRIx64 "\n", rate, cl_ntoh64(port_guid)); - sm->p_subn->min_ca_rate = rate; - } - } - - if (port_guid != sm->p_subn->sm_port_guid) { - p_sm_tbl = &sm->p_subn->sm_guid_tbl; - if (p_pi->capability_mask & IB_PORT_CAP_IS_SM) { - /* - * Before querying the SM - we want to make sure we - * clean its state, so if the querying fails we - * recognize that this SM is not active. - */ - p_sm = - (osm_remote_sm_t *) cl_qmap_get(p_sm_tbl, - port_guid); - if (p_sm != (osm_remote_sm_t *) cl_qmap_end(p_sm_tbl)) - /* clean it up */ - p_sm->smi.pri_state = - 0xF0 & p_sm->smi.pri_state; - if (sm->p_subn->opt.ignore_other_sm) - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Ignoring SM on port 0x%" PRIx64 "\n", - cl_ntoh64(port_guid)); - else { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Detected another SM. Requesting SMInfo" - "\n\t\t\t\tPort 0x%" PRIx64 "\n", - cl_ntoh64(port_guid)); - - /* - This port indicates it's an SM and - it's not our own port. - Acquire the SMInfo Attribute. - */ - memset(&context, 0, sizeof(context)); - context.smi_context.set_method = FALSE; - context.smi_context.port_guid = port_guid; - status = osm_req_get(sm, - osm_physp_get_dr_path_ptr - (p_physp), - IB_MAD_ATTR_SM_INFO, 0, - CL_DISP_MSGID_NONE, - &context); - - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 0F05: " - "Failure requesting SMInfo (%s)\n", - ib_get_err_str(status)); - } - } else { - p_sm = - (osm_remote_sm_t *) cl_qmap_remove(p_sm_tbl, - port_guid); - if (p_sm != (osm_remote_sm_t *) cl_qmap_end(p_sm_tbl)) - free(p_sm); - } - } - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void pi_rcv_process_switch_port(IN osm_sm_t * sm, IN osm_node_t * p_node, - IN osm_physp_t * p_physp, - IN ib_port_info_t * p_pi) -{ - ib_api_status_t status = IB_SUCCESS; - osm_madw_context_t context; - osm_physp_t *p_remote_physp; - osm_node_t *p_remote_node; - uint8_t port_num; - uint8_t remote_port_num; - osm_dr_path_t path; - - OSM_LOG_ENTER(sm->p_log); - - /* - Check the state of the physical port. - If there appears to be something on the other end of the wire, - then ask for NodeInfo. Ignore the switch management port. - */ - port_num = osm_physp_get_port_num(p_physp); - /* if in_sweep_hop_0 is TRUE, then this means the SM is on the switch, - and we got switchInfo of our local switch. Do not continue - probing through the switch. */ - if (port_num != 0 && sm->p_subn->in_sweep_hop_0 == FALSE) { - switch (ib_port_info_get_port_state(p_pi)) { - case IB_LINK_DOWN: - p_remote_physp = osm_physp_get_remote(p_physp); - if (p_remote_physp) { - p_remote_node = - osm_physp_get_node_ptr(p_remote_physp); - remote_port_num = - osm_physp_get_port_num(p_remote_physp); - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Unlinking local node 0x%" PRIx64 - ", port %u" - "\n\t\t\t\tand remote node 0x%" PRIx64 - ", port %u\n", - cl_ntoh64(osm_node_get_node_guid - (p_node)), port_num, - cl_ntoh64(osm_node_get_node_guid - (p_remote_node)), - remote_port_num); - - if (sm->ucast_mgr.cache_valid) - osm_ucast_cache_add_link(&sm->ucast_mgr, - p_physp, - p_remote_physp); - - osm_node_unlink(p_node, (uint8_t) port_num, - p_remote_node, - (uint8_t) remote_port_num); - - } - break; - - case IB_LINK_INIT: - case IB_LINK_ARMED: - case IB_LINK_ACTIVE: - /* - To avoid looping forever, only probe the port if it - is NOT the port that responded to the SMP. - - Request node info from the other end of this link: - 1) Copy the current path from the parent node. - 2) Extend the path to the next hop thru this port. - 3) Request node info with the new path - - */ - if (p_pi->local_port_num != - osm_physp_get_port_num(p_physp)) { - path = *osm_physp_get_dr_path_ptr(p_physp); - - if (osm_dr_path_extend(&path, - osm_physp_get_port_num - (p_physp))) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 0F08: " - "DR path with hop count %d couldn't be extended\n", - path.hop_count); - break; - } - - memset(&context, 0, sizeof(context)); - context.ni_context.node_guid = - osm_node_get_node_guid(p_node); - context.ni_context.port_num = - osm_physp_get_port_num(p_physp); - - status = osm_req_get(sm, &path, - IB_MAD_ATTR_NODE_INFO, 0, - CL_DISP_MSGID_NONE, - &context); - - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 0F02: " - "Failure initiating NodeInfo request (%s)\n", - ib_get_err_str(status)); - } else - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Skipping SMP responder port %u\n", - p_pi->local_port_num); - break; - - default: - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0F03: " - "Unknown link state = %u, port = %u\n", - ib_port_info_get_port_state(p_pi), - p_pi->local_port_num); - break; - } - } - - if (ib_port_info_get_port_state(p_pi) > IB_LINK_INIT && p_node->sw && - p_node->sw->need_update == 1 && port_num != 0) - p_node->sw->need_update = 0; - - if (p_physp->need_update) - sm->p_subn->ignore_existing_lfts = TRUE; - - if (port_num == 0) - pi_rcv_check_and_fix_lid(sm->p_log, p_pi, p_physp); - - /* - Update the PortInfo attribute. - */ - osm_physp_set_port_info(p_physp, p_pi); - - if (port_num == 0) { - /* Determine if base switch port 0 */ - if (p_node->sw && - !ib_switch_info_is_enhanced_port0(&p_node->sw->switch_info)) - /* PortState is not used on BSP0 but just in case it is DOWN */ - p_physp->port_info = *p_pi; - pi_rcv_process_endport(sm, p_physp, p_pi); - } - - OSM_LOG_EXIT(sm->p_log); -} - -static void pi_rcv_process_ca_or_router_port(IN osm_sm_t * sm, - IN osm_node_t * p_node, - IN osm_physp_t * p_physp, - IN ib_port_info_t * p_pi) -{ - OSM_LOG_ENTER(sm->p_log); - - UNUSED_PARAM(p_node); - - pi_rcv_check_and_fix_lid(sm->p_log, p_pi, p_physp); - - osm_physp_set_port_info(p_physp, p_pi); - - pi_rcv_process_endport(sm, p_physp, p_pi); - - OSM_LOG_EXIT(sm->p_log); -} - -#define IBM_VENDOR_ID (0x5076) -static void get_pkey_table(IN osm_log_t * p_log, IN osm_sm_t * sm, - IN osm_node_t * p_node, IN osm_physp_t * p_physp) -{ - - osm_madw_context_t context; - ib_api_status_t status; - osm_dr_path_t path; - uint8_t port_num; - uint16_t block_num, max_blocks; - uint32_t attr_mod_ho; - - OSM_LOG_ENTER(p_log); - - path = *osm_physp_get_dr_path_ptr(p_physp); - - context.pkey_context.node_guid = osm_node_get_node_guid(p_node); - context.pkey_context.port_guid = osm_physp_get_port_guid(p_physp); - context.pkey_context.set_method = FALSE; - - port_num = p_physp->port_num; - - if (!p_node->sw || port_num == 0) - /* The maximum blocks is defined by the node info partition cap - for CA, router, and switch management ports. */ - max_blocks = - (cl_ntoh16(p_node->node_info.partition_cap) + - IB_NUM_PKEY_ELEMENTS_IN_BLOCK - 1) - / IB_NUM_PKEY_ELEMENTS_IN_BLOCK; - else { - /* This is a switch, and not a management port. The maximum blocks - is defined in the switch info partition enforcement cap. */ - - /* Check for IBM eHCA firmware defect in reporting partition enforcement cap */ - if (cl_ntoh32(ib_node_info_get_vendor_id(&p_node->node_info)) == - IBM_VENDOR_ID) - p_node->sw->switch_info.enforce_cap = 0; - - /* Bail out if this is a switch with no partition enforcement capability */ - if (cl_ntoh16(p_node->sw->switch_info.enforce_cap) == 0) - goto Exit; - - max_blocks = (cl_ntoh16(p_node->sw->switch_info.enforce_cap) + - IB_NUM_PKEY_ELEMENTS_IN_BLOCK - - 1) / IB_NUM_PKEY_ELEMENTS_IN_BLOCK; - } - - for (block_num = 0; block_num < max_blocks; block_num++) { - if (osm_node_get_type(p_node) != IB_NODE_TYPE_SWITCH) - attr_mod_ho = block_num; - else - attr_mod_ho = block_num | (port_num << 16); - status = osm_req_get(sm, &path, IB_MAD_ATTR_P_KEY_TABLE, - cl_hton32(attr_mod_ho), - CL_DISP_MSGID_NONE, &context); - - if (status != IB_SUCCESS) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0F12: " - "Failure initiating PKeyTable request (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - } - -Exit: - OSM_LOG_EXIT(p_log); -} - -static void pi_rcv_get_pkey_slvl_vla_tables(IN osm_sm_t * sm, - IN osm_node_t * p_node, - IN osm_physp_t * p_physp) -{ - OSM_LOG_ENTER(sm->p_log); - - get_pkey_table(sm->p_log, sm, p_node, p_physp); - - OSM_LOG_EXIT(sm->p_log); -} - -static void pi_rcv_process_set(IN osm_sm_t * sm, IN osm_node_t * p_node, - IN uint8_t port_num, IN osm_madw_t * p_madw) -{ - osm_physp_t *p_physp; - ib_net64_t port_guid; - ib_smp_t *p_smp; - ib_port_info_t *p_pi; - osm_pi_context_t *p_context; - osm_log_level_t level; - - OSM_LOG_ENTER(sm->p_log); - - p_context = osm_madw_get_pi_context_ptr(p_madw); - - CL_ASSERT(p_node); - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - CL_ASSERT(p_physp); - - port_guid = osm_physp_get_port_guid(p_physp); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_pi = ib_smp_get_payload_ptr(p_smp); - - /* check for error */ - if (cl_ntoh16(p_smp->status) & 0x7fff) { - /* If port already ACTIVE, don't treat status 7 as error */ - if (p_context->active_transition && - (cl_ntoh16(p_smp->status) & 0x7fff) == 0x1c) { - level = OSM_LOG_INFO; - OSM_LOG(sm->p_log, OSM_LOG_INFO, - "Received error status 0x%x for SetResp() during ACTIVE transition\n", - cl_ntoh16(p_smp->status) & 0x7fff); - /* Should there be a subsequent Get to validate that port is ACTIVE ? */ - } else { - level = OSM_LOG_ERROR; - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0F10: " - "Received error status for SetResp()\n"); - } - osm_dump_port_info(sm->p_log, osm_node_get_node_guid(p_node), - port_guid, port_num, p_pi, level); - } - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Received logical SetResp() for GUID 0x%" PRIx64 - ", port num %u" - "\n\t\t\t\tfor parent node GUID 0x%" PRIx64 - " TID 0x%" PRIx64 "\n", - cl_ntoh64(port_guid), port_num, - cl_ntoh64(osm_node_get_node_guid(p_node)), - cl_ntoh64(p_smp->trans_id)); - - osm_physp_set_port_info(p_physp, p_pi); - - OSM_LOG_EXIT(sm->p_log); -} - -void osm_pi_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_port_info_t *p_pi; - ib_smp_t *p_smp; - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_dr_path_t *p_dr_path; - osm_node_t *p_node; - osm_pi_context_t *p_context; - ib_net64_t port_guid, node_guid; - uint8_t port_num; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(sm); - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_context = osm_madw_get_pi_context_ptr(p_madw); - p_pi = ib_smp_get_payload_ptr(p_smp); - - CL_ASSERT(p_smp->attr_id == IB_MAD_ATTR_PORT_INFO); - - port_num = (uint8_t) cl_ntoh32(p_smp->attr_mod); - - port_guid = p_context->port_guid; - node_guid = p_context->node_guid; - - osm_dump_port_info(sm->p_log, node_guid, port_guid, port_num, p_pi, - OSM_LOG_DEBUG); - - /* On receipt of client reregister, clear the reregister bit so - reregistering won't be sent again and again */ - if (ib_port_info_get_client_rereg(p_pi)) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Client reregister received on response\n"); - ib_port_info_set_client_rereg(p_pi, 0); - } - - /* - we might get a response during a light sweep looking for a change in - the status of a remote port that did not respond in earlier sweeps. - So if the context of the Get was light_sweep - we do not need to - do anything with the response - just flag that we need a heavy sweep - */ - if (p_context->light_sweep == TRUE) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Got light sweep response from remote port of parent node " - "GUID 0x%" PRIx64 " port 0x%016" PRIx64 - ", Commencing heavy sweep\n", - cl_ntoh64(node_guid), cl_ntoh64(port_guid)); - sm->p_subn->force_heavy_sweep = TRUE; - sm->p_subn->ignore_existing_lfts = TRUE; - goto Exit; - } - - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - if (!p_port) { - CL_PLOCK_RELEASE(sm->p_lock); - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0F06: " - "No port object for port with GUID 0x%" PRIx64 - "\n\t\t\t\tfor parent node GUID 0x%" PRIx64 - ", TID 0x%" PRIx64 "\n", - cl_ntoh64(port_guid), - cl_ntoh64(node_guid), cl_ntoh64(p_smp->trans_id)); - goto Exit; - } - - p_node = p_port->p_node; - CL_ASSERT(p_node); - - /* - If we were setting the PortInfo, then receiving - this attribute was not part of sweeping the subnet. - In this case, just update the PortInfo attribute. - - In an unfortunate blunder, the IB spec defines the - return method for Set() as a GetResp(). Thus, we can't - use the method (what would have been SetResp()) to determine - our course of action. So, we have to carry this extra - boolean around to determine if we were doing Get() or Set(). - */ - if (p_context->set_method) - pi_rcv_process_set(sm, p_node, port_num, p_madw); - else { - p_port->discovery_count++; - - /* - This PortInfo arrived because we did a Get() method, - most likely due to a subnet sweep in progress. - */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Discovered port num %u with GUID 0x%" PRIx64 - " for parent node GUID 0x%" PRIx64 - ", TID 0x%" PRIx64 "\n", - port_num, cl_ntoh64(port_guid), - cl_ntoh64(node_guid), cl_ntoh64(p_smp->trans_id)); - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - - CL_ASSERT(p_physp); - - /* Update the directed route path to this port - in case the old path is no longer usable. */ - p_dr_path = osm_physp_get_dr_path_ptr(p_physp); - osm_dr_path_init(p_dr_path, osm_madw_get_bind_handle(p_madw), - p_smp->hop_count, p_smp->initial_path); - - /* if port just inited or reached INIT state (external reset) - request update for port related tables */ - p_physp->need_update = - (ib_port_info_get_port_state(p_pi) == IB_LINK_INIT || - p_physp->need_update > 1) ? 1 : 0; - - switch (osm_node_get_type(p_node)) { - case IB_NODE_TYPE_CA: - case IB_NODE_TYPE_ROUTER: - pi_rcv_process_ca_or_router_port(sm, p_node, p_physp, - p_pi); - break; - case IB_NODE_TYPE_SWITCH: - pi_rcv_process_switch_port(sm, p_node, p_physp, p_pi); - break; - default: - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0F07: " - "Unknown node type %u with GUID 0x%" PRIx64 - "\n", osm_node_get_type(p_node), - cl_ntoh64(node_guid)); - break; - } - - /* - Get the tables on the physp. - */ - if (p_physp->need_update || sm->p_subn->need_update) - pi_rcv_get_pkey_slvl_vla_tables(sm, p_node, p_physp); - - } - - CL_PLOCK_RELEASE(sm->p_lock); - -Exit: - /* - Release the lock before jumping here!! - */ - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_prtn.c b/branches/opensm_3/user/opensm/osm_prtn.c deleted file mode 100644 index f2493ba5..00000000 --- a/branches/opensm_3/user/opensm/osm_prtn.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright (c) 2006-2009 Voltaire, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_prtn_t. - * This object represents an IBA partition. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn, - const char *file_name); - -static uint16_t global_pkey_counter; - -osm_prtn_t *osm_prtn_new(IN const char *name, IN uint16_t pkey) -{ - osm_prtn_t *p = malloc(sizeof(*p)); - if (!p) - return NULL; - - memset(p, 0, sizeof(*p)); - p->pkey = pkey; - p->sl = OSM_DEFAULT_SL; - cl_map_construct(&p->full_guid_tbl); - cl_map_init(&p->full_guid_tbl, 32); - cl_map_construct(&p->part_guid_tbl); - cl_map_init(&p->part_guid_tbl, 32); - - if (name && *name) - strncpy(p->name, name, sizeof(p->name)); - else - snprintf(p->name, sizeof(p->name), "%04x", cl_ntoh16(pkey)); - - return p; -} - -void osm_prtn_delete(IN OUT osm_prtn_t ** pp_prtn) -{ - osm_prtn_t *p = *pp_prtn; - - cl_map_remove_all(&p->full_guid_tbl); - cl_map_destroy(&p->full_guid_tbl); - cl_map_remove_all(&p->part_guid_tbl); - cl_map_destroy(&p->part_guid_tbl); - free(p); - *pp_prtn = NULL; -} - -ib_api_status_t osm_prtn_add_port(osm_log_t * p_log, osm_subn_t * p_subn, - osm_prtn_t * p, ib_net64_t guid, - boolean_t full) -{ - ib_api_status_t status = IB_SUCCESS; - cl_map_t *p_tbl; - osm_port_t *p_port; - osm_physp_t *p_physp; - - p_port = osm_get_port_by_guid(p_subn, guid); - if (!p_port) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "port 0x%" PRIx64 " not found\n", cl_ntoh64(guid)); - return status; - } - - p_physp = p_port->p_physp; - if (!p_physp) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "no physical for port 0x%" PRIx64 "\n", - cl_ntoh64(guid)); - return status; - } - - if (cl_map_remove(&p->part_guid_tbl, guid) || - cl_map_remove(&p->full_guid_tbl, guid)) - OSM_LOG(p_log, OSM_LOG_VERBOSE, "port 0x%" PRIx64 " already " - "in partition \'%s\' (0x%04x). Will overwrite\n", - cl_ntoh64(guid), p->name, cl_ntoh16(p->pkey)); - - p_tbl = (full == TRUE) ? &p->full_guid_tbl : &p->part_guid_tbl; - - if (cl_map_insert(p_tbl, guid, p_physp) == NULL) - return IB_INSUFFICIENT_MEMORY; - - return status; -} - -ib_api_status_t osm_prtn_add_all(osm_log_t * p_log, osm_subn_t * p_subn, - osm_prtn_t * p, unsigned type, boolean_t full) -{ - cl_qmap_t *p_port_tbl = &p_subn->port_guid_tbl; - cl_map_item_t *p_item; - osm_port_t *p_port; - ib_api_status_t status = IB_SUCCESS; - - p_item = cl_qmap_head(p_port_tbl); - while (p_item != cl_qmap_end(p_port_tbl)) { - p_port = (osm_port_t *) p_item; - p_item = cl_qmap_next(p_item); - if (!type || osm_node_get_type(p_port->p_node) == type) { - status = osm_prtn_add_port(p_log, p_subn, p, - osm_port_get_guid(p_port), - full); - if (status != IB_SUCCESS) - goto _err; - } - } - -_err: - return status; -} - -static const ib_gid_t osm_ipoib_mgid = { - { - 0xff, /* multicast field */ - 0x12, /* non-permanent bit, link local scope */ - 0x40, 0x1b, /* IPv4 signature */ - 0xff, 0xff, /* 16 bits of P_Key (to be filled in) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */ - 0xff, 0xff, 0xff, 0xff, /* 32 bit IPv4 broadcast address */ - }, -}; - -/* - * HACK: Until TS resolves their noncompliant join compmask, - * we have to pre-define the MGID - */ -static const ib_gid_t osm_ts_ipoib_mgid = { - { - 0xff, /* multicast field */ - 0x12, /* non-permanent bit, link local scope */ - 0x40, 0x1b, /* IPv4 signature */ - 0xff, 0xff, /* 16 bits of P_Key (to be filled in) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */ - 0x00, 0x00, 0x00, 0x01, /* 32 bit IPv4 broadcast address */ - }, -}; - -ib_api_status_t osm_prtn_add_mcgroup(osm_log_t * p_log, osm_subn_t * p_subn, - osm_prtn_t * p, uint8_t rate, uint8_t mtu, - uint8_t scope) -{ - ib_member_rec_t mc_rec; - ib_net64_t comp_mask; - ib_net16_t pkey; - osm_mgrp_t *p_mgrp = NULL; - osm_sa_t *p_sa = &p_subn->p_osm->sa; - ib_api_status_t status = IB_SUCCESS; - uint8_t hop_limit; - - pkey = p->pkey | cl_hton16(0x8000); - if (!scope) - scope = OSM_DEFAULT_MGRP_SCOPE; - hop_limit = (scope == IB_MC_SCOPE_LINK_LOCAL) ? 0 : IB_HOPLIMIT_MAX; - - memset(&mc_rec, 0, sizeof(mc_rec)); - - mc_rec.mgid = osm_ipoib_mgid; /* ipv4 broadcast group */ - memcpy(&mc_rec.mgid.raw[4], &pkey, sizeof(pkey)); - - mc_rec.qkey = CL_HTON32(0x0b1b); - mc_rec.mtu = (mtu ? mtu : OSM_DEFAULT_MGRP_MTU) | (2 << 6); /* 2048 Bytes */ - mc_rec.tclass = 0; - mc_rec.pkey = pkey; - mc_rec.rate = (rate ? rate : OSM_DEFAULT_MGRP_RATE) | (2 << 6); /* 10Gb/sec */ - mc_rec.pkt_life = p_subn->opt.subnet_timeout; - mc_rec.sl_flow_hop = ib_member_set_sl_flow_hop(p->sl, 0, hop_limit); - /* Scope in MCMemberRecord (if present) needs to be consistent with MGID */ - mc_rec.scope_state = ib_member_set_scope_state(scope, IB_MC_REC_STATE_FULL_MEMBER); - ib_mgid_set_scope(&mc_rec.mgid, scope); - - /* don't update rate, mtu */ - comp_mask = IB_MCR_COMPMASK_MTU | IB_MCR_COMPMASK_MTU_SEL | - IB_MCR_COMPMASK_RATE | IB_MCR_COMPMASK_RATE_SEL; - status = osm_mcmr_rcv_find_or_create_new_mgrp(p_sa, comp_mask, &mc_rec, - &p_mgrp); - if (!p_mgrp || status != IB_SUCCESS) - OSM_LOG(p_log, OSM_LOG_ERROR, - "Failed to create MC group with pkey 0x%04x\n", - cl_ntoh16(pkey)); - if (p_mgrp) { - p_mgrp->well_known = TRUE; - p->mgrp = p_mgrp; - } - - /* workaround for TS */ - /* FIXME: remove this upon TS fixes */ - mc_rec.mgid = osm_ts_ipoib_mgid; - memcpy(&mc_rec.mgid.raw[4], &pkey, sizeof(pkey)); - /* Scope in MCMemberRecord (if present) needs to be consistent with MGID */ - mc_rec.scope_state = ib_member_set_scope_state(scope, IB_MC_REC_STATE_FULL_MEMBER); - ib_mgid_set_scope(&mc_rec.mgid, scope); - - status = osm_mcmr_rcv_find_or_create_new_mgrp(p_sa, comp_mask, &mc_rec, - &p_mgrp); - if (p_mgrp) { - p_mgrp->well_known = TRUE; - if (!p->mgrp) - p->mgrp = p_mgrp; - } - - return status; -} - -static uint16_t generate_pkey(osm_subn_t * p_subn) -{ - uint16_t pkey; - - cl_qmap_t *m = &p_subn->prtn_pkey_tbl; - while (global_pkey_counter < cl_ntoh16(IB_DEFAULT_PARTIAL_PKEY) - 1) { - pkey = ++global_pkey_counter; - pkey = cl_hton16(pkey); - if (cl_qmap_get(m, pkey) == cl_qmap_end(m)) - return pkey; - } - return 0; -} - -osm_prtn_t *osm_prtn_find_by_name(osm_subn_t * p_subn, const char *name) -{ - cl_map_item_t *p_next; - osm_prtn_t *p; - - p_next = cl_qmap_head(&p_subn->prtn_pkey_tbl); - while (p_next != cl_qmap_end(&p_subn->prtn_pkey_tbl)) { - p = (osm_prtn_t *) p_next; - p_next = cl_qmap_next(&p->map_item); - if (!strncmp(p->name, name, sizeof(p->name))) - return p; - } - - return NULL; -} - -osm_prtn_t *osm_prtn_make_new(osm_log_t * p_log, osm_subn_t * p_subn, - const char *name, uint16_t pkey) -{ - osm_prtn_t *p = NULL, *p_check; - - pkey &= cl_hton16((uint16_t) ~ 0x8000); - - if (!pkey) { - if (name && (p = osm_prtn_find_by_name(p_subn, name))) - return p; - if (!(pkey = generate_pkey(p_subn))) - return NULL; - } - - p = osm_prtn_new(name, pkey); - if (!p) { - OSM_LOG(p_log, OSM_LOG_ERROR, "Unable to create" - " partition \'%s\' (0x%04x)\n", name, cl_ntoh16(pkey)); - return NULL; - } - - p_check = (osm_prtn_t *) cl_qmap_insert(&p_subn->prtn_pkey_tbl, - p->pkey, &p->map_item); - if (p != p_check) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, "Duplicated partition" - " definition: \'%s\' (0x%04x) prev name \'%s\'" - ". Will use it\n", - name, cl_ntoh16(pkey), p_check->name); - osm_prtn_delete(&p); - p = p_check; - } - - return p; -} - -static ib_api_status_t prtn_make_default(osm_log_t * p_log, osm_subn_t * p_subn, - boolean_t no_config) -{ - ib_api_status_t status = IB_UNKNOWN_ERROR; - osm_prtn_t *p; - - p = osm_prtn_make_new(p_log, p_subn, "Default", - IB_DEFAULT_PARTIAL_PKEY); - if (!p) - goto _err; - status = osm_prtn_add_all(p_log, p_subn, p, 0, no_config); - if (status != IB_SUCCESS) - goto _err; - cl_map_remove(&p->part_guid_tbl, p_subn->sm_port_guid); - status = - osm_prtn_add_port(p_log, p_subn, p, p_subn->sm_port_guid, TRUE); - - if (no_config) - osm_prtn_add_mcgroup(p_log, p_subn, p, 0, 0, 0); - -_err: - return status; -} - -ib_api_status_t osm_prtn_make_partitions(osm_log_t * p_log, osm_subn_t * p_subn) -{ - struct stat statbuf; - const char *file_name; - boolean_t is_config = TRUE; - ib_api_status_t status = IB_SUCCESS; - cl_map_item_t *p_next; - osm_prtn_t *p; - - file_name = p_subn->opt.partition_config_file ? - p_subn->opt.partition_config_file : OSM_DEFAULT_PARTITION_CONFIG_FILE; - if (stat(file_name, &statbuf)) - is_config = FALSE; - - /* clean up current port maps */ - p_next = cl_qmap_head(&p_subn->prtn_pkey_tbl); - while (p_next != cl_qmap_end(&p_subn->prtn_pkey_tbl)) { - p = (osm_prtn_t *) p_next; - p_next = cl_qmap_next(&p->map_item); - cl_map_remove_all(&p->part_guid_tbl); - cl_map_remove_all(&p->full_guid_tbl); - } - - global_pkey_counter = 0; - - status = prtn_make_default(p_log, p_subn, !is_config); - if (status != IB_SUCCESS) - goto _err; - - if (is_config && osm_prtn_config_parse_file(p_log, p_subn, file_name)) - OSM_LOG(p_log, OSM_LOG_VERBOSE, "Partition configuration " - "was not fully processed\n"); - - /* and now clean up empty partitions */ - p_next = cl_qmap_head(&p_subn->prtn_pkey_tbl); - while (p_next != cl_qmap_end(&p_subn->prtn_pkey_tbl)) { - p = (osm_prtn_t *) p_next; - p_next = cl_qmap_next(&p->map_item); - if (cl_map_count(&p->part_guid_tbl) == 0 && - cl_map_count(&p->full_guid_tbl) == 0) { - cl_qmap_remove_item(&p_subn->prtn_pkey_tbl, - (cl_map_item_t *) p); - osm_prtn_delete(&p); - } - } - -_err: - return status; -} diff --git a/branches/opensm_3/user/opensm/osm_prtn_config.c b/branches/opensm_3/user/opensm/osm_prtn_config.c deleted file mode 100644 index 7f0e6469..00000000 --- a/branches/opensm_3/user/opensm/osm_prtn_config.c +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of opensm partition management configuration - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -struct part_conf { - osm_log_t *p_log; - osm_subn_t *p_subn; - osm_prtn_t *p_prtn; - unsigned is_ipoib, mtu, rate, sl, scope_mask; - boolean_t full; -}; - -extern osm_prtn_t *osm_prtn_make_new(osm_log_t * p_log, osm_subn_t * p_subn, - const char *name, uint16_t pkey); -extern ib_api_status_t osm_prtn_add_all(osm_log_t * p_log, osm_subn_t * p_subn, - osm_prtn_t * p, unsigned type, - boolean_t full); -extern ib_api_status_t osm_prtn_add_port(osm_log_t * p_log, - osm_subn_t * p_subn, osm_prtn_t * p, - ib_net64_t guid, boolean_t full); -extern ib_api_status_t osm_prtn_add_mcgroup(osm_log_t * p_log, - osm_subn_t * p_subn, osm_prtn_t * p, - uint8_t rate, - uint8_t mtu, uint8_t scope); - -static int partition_create(unsigned lineno, struct part_conf *conf, - char *name, char *id, char *flag, char *flag_val) -{ - uint16_t pkey; - unsigned int scope; - - if (!id && name && isdigit(*name)) { - id = name; - name = NULL; - } - - if (id) { - char *end; - - pkey = (uint16_t) strtoul(id, &end, 0); - if (end == id || *end) - return -1; - } else - pkey = 0; - - conf->p_prtn = osm_prtn_make_new(conf->p_log, conf->p_subn, - name, cl_hton16(pkey)); - if (!conf->p_prtn) - return -1; - - if (!conf->p_subn->opt.qos && conf->sl != OSM_DEFAULT_SL) { - OSM_LOG(conf->p_log, OSM_LOG_DEBUG, "Overriding SL %d" - " to default SL %d on partition %s" - " as QoS is not enabled.\n", - conf->sl, OSM_DEFAULT_SL, name); - conf->sl = OSM_DEFAULT_SL; - } - conf->p_prtn->sl = (uint8_t) conf->sl; - - if (!conf->is_ipoib) - return 0; - - if (!conf->scope_mask) { - osm_prtn_add_mcgroup(conf->p_log, conf->p_subn, conf->p_prtn, - (uint8_t) conf->rate, - (uint8_t) conf->mtu, - 0); - return 0; - } - - for (scope = 0; scope < 16; scope++) { - if (((1<scope_mask) == 0) - continue; - - osm_prtn_add_mcgroup(conf->p_log, conf->p_subn, conf->p_prtn, - (uint8_t) conf->rate, - (uint8_t) conf->mtu, - (uint8_t) scope); - } - return 0; -} - -static int partition_add_flag(unsigned lineno, struct part_conf *conf, - char *flag, char *val) -{ - int len = strlen(flag); - if (!strncmp(flag, "ipoib", len)) { - conf->is_ipoib = 1; - } else if (!strncmp(flag, "mtu", len)) { - if (!val || (conf->mtu = strtoul(val, NULL, 0)) == 0) - OSM_LOG(conf->p_log, OSM_LOG_VERBOSE, - "PARSE WARN: line %d: " - "flag \'mtu\' requires valid value" - " - skipped\n", lineno); - } else if (!strncmp(flag, "rate", len)) { - if (!val || (conf->rate = strtoul(val, NULL, 0)) == 0) - OSM_LOG(conf->p_log, OSM_LOG_VERBOSE, - "PARSE WARN: line %d: " - "flag \'rate\' requires valid value" - " - skipped\n", lineno); - } else if (!strncmp(flag, "scope", len)) { - unsigned int scope; - if (!val || (scope = strtoul(val, NULL, 0)) == 0 || scope > 0xF) - OSM_LOG(conf->p_log, OSM_LOG_VERBOSE, - "PARSE WARN: line %d: " - "flag \'scope\' requires valid value" - " - skipped\n", lineno); - else - conf->scope_mask |= (1< 15 || - (*end && !isspace(*end))) - OSM_LOG(conf->p_log, OSM_LOG_VERBOSE, - "PARSE WARN: line %d: " - "flag \'sl\' requires valid value" - " - skipped\n", lineno); - else - conf->sl = sl; - } else if (!strncmp(flag, "defmember", len)) { - if (!val || (strncmp(val, "limited", strlen(val)) - && strncmp(val, "full", strlen(val)))) - OSM_LOG(conf->p_log, OSM_LOG_VERBOSE, - "PARSE WARN: line %d: " - "flag \'defmember\' requires valid value (limited or full)" - " - skipped\n", lineno); - else - conf->full = strncmp(val, "full", strlen(val)) == 0; - } else { - OSM_LOG(conf->p_log, OSM_LOG_VERBOSE, - "PARSE WARN: line %d: " - "unrecognized partition flag \'%s\'" - " - ignored\n", lineno, flag); - } - return 0; -} - -static int partition_add_port(unsigned lineno, struct part_conf *conf, - char *name, char *flag) -{ - osm_prtn_t *p = conf->p_prtn; - ib_net64_t guid; - boolean_t full = conf->full; - - if (!name || !*name || !strncmp(name, "NONE", strlen(name))) - return 0; - - if (flag) { - /* reset default membership to limited */ - full = FALSE; - if (!strncmp(flag, "full", strlen(flag))) - full = TRUE; - else if (strncmp(flag, "limited", strlen(flag))) { - OSM_LOG(conf->p_log, OSM_LOG_VERBOSE, - "PARSE WARN: line %d: " - "unrecognized port flag \'%s\'." - " Assume \'limited\'\n", lineno, flag); - } - } - - if (!strncmp(name, "ALL", strlen(name))) { - return osm_prtn_add_all(conf->p_log, conf->p_subn, p, - 0, full) == IB_SUCCESS ? 0 : -1; - } else if (!strncmp(name, "ALL_CAS", strlen(name))) { - return osm_prtn_add_all(conf->p_log, conf->p_subn, p, - IB_NODE_TYPE_CA, full) == IB_SUCCESS ? 0 : -1; - } else if (!strncmp(name, "ALL_SWITCHES", strlen(name))) { - return osm_prtn_add_all(conf->p_log, conf->p_subn, p, - IB_NODE_TYPE_SWITCH, full) == IB_SUCCESS ? 0 : -1; - } else if (!strncmp(name, "ALL_ROUTERS", strlen(name))) { - return osm_prtn_add_all(conf->p_log, conf->p_subn, p, - IB_NODE_TYPE_ROUTER, full) == IB_SUCCESS ? 0 : -1; - } else if (!strncmp(name, "SELF", strlen(name))) { - guid = cl_ntoh64(conf->p_subn->sm_port_guid); - } else { - char *end; - guid = strtoull(name, &end, 0); - if (!guid || *end) - return -1; - } - - if (osm_prtn_add_port(conf->p_log, conf->p_subn, p, - cl_hton64(guid), full) != IB_SUCCESS) - return -1; - - return 0; -} - -/* conf file parser */ - -#define STRIP_HEAD_SPACES(p) while (*(p) == ' ' || *(p) == '\t' || \ - *(p) == '\n') { (p)++; } -#define STRIP_TAIL_SPACES(p) { char *q = (p) + strlen(p); \ - while ( q != (p) && ( *q == '\0' || \ - *q == ' ' || *q == '\t' || \ - *q == '\n')) { *q-- = '\0'; }; } - -static int parse_name_token(char *str, char **name, char **val) -{ - int len = 0; - char *p, *q; - - *name = *val = NULL; - - p = str; - - while (*p == ' ' || *p == '\t' || *p == '\n') - p++; - - q = strchr(p, '='); - if (q) - *q++ = '\0'; - - len = strlen(str) + 1; - str = q; - - q = p + strlen(p); - while (q != p && (*q == '\0' || *q == ' ' || *q == '\t' || *q == '\n')) - *q-- = '\0'; - - *name = p; - - p = str; - if (!p) - return len; - - while (*p == ' ' || *p == '\t' || *p == '\n') - p++; - - q = p + strlen(p); - len += (int)(q - str) + 1; - while (q != p && (*q == '\0' || *q == ' ' || *q == '\t' || *q == '\n')) - *q-- = '\0'; - *val = p; - - return len; -} - -static struct part_conf *new_part_conf(osm_log_t * p_log, osm_subn_t * p_subn) -{ - static struct part_conf part; - struct part_conf *conf = ∂ - - memset(conf, 0, sizeof(*conf)); - conf->p_log = p_log; - conf->p_subn = p_subn; - conf->p_prtn = NULL; - conf->is_ipoib = 0; - conf->sl = OSM_DEFAULT_SL; - conf->full = FALSE; - return conf; -} - -static int flush_part_conf(struct part_conf *conf) -{ - memset(conf, 0, sizeof(*conf)); - return 0; -} - -static int parse_part_conf(struct part_conf *conf, char *str, int lineno) -{ - int ret, len = 0; - char *name, *id, *flag, *flval; - char *q, *p; - - p = str; - if (*p == '\t' || *p == '\0' || *p == '\n') - p++; - - len += (int)(p - str); - str = p; - - if (conf->p_prtn) - goto skip_header; - - q = strchr(p, ':'); - if (!q) { - OSM_LOG(conf->p_log, OSM_LOG_ERROR, "PARSE ERROR: line %d: " - "no partition definition found\n", lineno); - fprintf(stderr, "\nPARSE ERROR: line %d: " - "no partition definition found\n", lineno); - return -1; - } - - *q++ = '\0'; - str = q; - - name = id = flag = flval = NULL; - - q = strchr(p, ','); - if (q) - *q = '\0'; - - ret = parse_name_token(p, &name, &id); - p += ret; - len += ret; - - while (q) { - flag = flval = NULL; - q = strchr(p, ','); - if (q) - *q++ = '\0'; - ret = parse_name_token(p, &flag, &flval); - if (!flag) { - OSM_LOG(conf->p_log, OSM_LOG_ERROR, - "PARSE ERROR: line %d: " - "bad partition flags\n", lineno); - fprintf(stderr, "\nPARSE ERROR: line %d: " - "bad partition flags\n", lineno); - return -1; - } - p += ret; - len += ret; - partition_add_flag(lineno, conf, flag, flval); - } - - if (p != str || (partition_create(lineno, conf, - name, id, flag, flval) < 0)) { - OSM_LOG(conf->p_log, OSM_LOG_ERROR, "PARSE ERROR: line %d: " - "bad partition definition\n", lineno); - fprintf(stderr, "\nPARSE ERROR: line %d: " - "bad partition definition\n", lineno); - return -1; - } - -skip_header: - do { - name = flag = NULL; - q = strchr(p, ','); - if (q) - *q++ = '\0'; - ret = parse_name_token(p, &name, &flag); - if (partition_add_port(lineno, conf, name, flag) < 0) { - OSM_LOG(conf->p_log, OSM_LOG_ERROR, - "PARSE ERROR: line %d: " - "bad PortGUID\n", lineno); - fprintf(stderr, "PARSE ERROR: line %d: " - "bad PortGUID\n", lineno); - return -1; - } - p += ret; - len += ret; - } while (q); - - return len; -} - -int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn, - const char *file_name) -{ - char line[1024]; - struct part_conf *conf = NULL; - FILE *file; - int lineno; - - file = fopen(file_name, "r"); - if (!file) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Cannot open config file \'%s\': %s\n", - file_name, strerror(errno)); - return -1; - } - - lineno = 0; - - while (fgets(line, sizeof(line) - 1, file) != NULL) { - char *q, *p = line; - - lineno++; - - p = line; - - q = strchr(p, '#'); - if (q) - *q = '\0'; - - do { - int len; - while (*p == ' ' || *p == '\t' || *p == '\n') - p++; - if (*p == '\0') - break; - - if (!conf && !(conf = new_part_conf(p_log, p_subn))) { - OSM_LOG(conf->p_log, OSM_LOG_ERROR, - "PARSE ERROR: line %d: " - "internal: cannot create config\n", - lineno); - fprintf(stderr, - "PARSE ERROR: line %d: " - "internal: cannot create config\n", - lineno); - break; - } - - q = strchr(p, ';'); - if (q) - *q = '\0'; - - len = parse_part_conf(conf, p, lineno); - if (len < 0) { - break; - } - - p += len; - - if (q) { - flush_part_conf(conf); - conf = NULL; - } - } while (q); - } - - fclose(file); - - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_qos.c b/branches/opensm_3/user/opensm/osm_qos.c deleted file mode 100644 index 45991b42..00000000 --- a/branches/opensm_3/user/opensm/osm_qos.c +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (c) 2006-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of OpenSM QoS infrastructure primitives - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -struct qos_config { - uint8_t max_vls; - uint8_t vl_high_limit; - ib_vl_arb_table_t vlarb_high[2]; - ib_vl_arb_table_t vlarb_low[2]; - ib_slvl_table_t sl2vl; -}; - -static void qos_build_config(struct qos_config *cfg, osm_qos_options_t * opt, - osm_qos_options_t * dflt); - -/* - * QoS primitives - */ -static ib_api_status_t vlarb_update_table_block(osm_sm_t * sm, - osm_physp_t * p, - uint8_t port_num, - unsigned force_update, - const ib_vl_arb_table_t * - table_block, - unsigned block_length, - unsigned block_num) -{ - ib_vl_arb_table_t block; - osm_madw_context_t context; - uint32_t attr_mod; - unsigned vl_mask, i; - ib_api_status_t status; - - vl_mask = (1 << (ib_port_info_get_op_vls(&p->port_info) - 1)) - 1; - - memset(&block, 0, sizeof(block)); - memcpy(&block, table_block, block_length * sizeof(block.vl_entry[0])); - for (i = 0; i < block_length; i++) - block.vl_entry[i].vl &= vl_mask; - - if (!force_update && - !memcmp(&p->vl_arb[block_num], &block, - block_length * sizeof(block.vl_entry[0]))) - return IB_SUCCESS; - - context.vla_context.node_guid = - osm_node_get_node_guid(osm_physp_get_node_ptr(p)); - context.vla_context.port_guid = osm_physp_get_port_guid(p); - context.vla_context.set_method = TRUE; - attr_mod = ((block_num + 1) << 16) | port_num; - - status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p), - (uint8_t *) & block, sizeof(block), - IB_MAD_ATTR_VL_ARBITRATION, cl_hton32(attr_mod), - CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 6202 : " - "failed to update VLArbitration tables " - "for port %" PRIx64 " block %u\n", - cl_ntoh64(p->port_guid), block_num); - - return status; -} - -static ib_api_status_t vlarb_update(osm_sm_t * sm, osm_physp_t * p, - uint8_t port_num, unsigned force_update, - const struct qos_config *qcfg) -{ - ib_api_status_t status = IB_SUCCESS; - ib_port_info_t *p_pi = &p->port_info; - unsigned len; - - if (p_pi->vl_arb_low_cap > 0) { - len = p_pi->vl_arb_low_cap < IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK ? - p_pi->vl_arb_low_cap : IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK; - if ((status = vlarb_update_table_block(sm, p, port_num, - force_update, - &qcfg->vlarb_low[0], - len, 0)) != IB_SUCCESS) - return status; - } - if (p_pi->vl_arb_low_cap > IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK) { - len = p_pi->vl_arb_low_cap % IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK; - if ((status = vlarb_update_table_block(sm, p, port_num, - force_update, - &qcfg->vlarb_low[1], - len, 1)) != IB_SUCCESS) - return status; - } - if (p_pi->vl_arb_high_cap > 0) { - len = p_pi->vl_arb_high_cap < IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK ? - p_pi->vl_arb_high_cap : IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK; - if ((status = vlarb_update_table_block(sm, p, port_num, - force_update, - &qcfg->vlarb_high[0], - len, 2)) != IB_SUCCESS) - return status; - } - if (p_pi->vl_arb_high_cap > IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK) { - len = p_pi->vl_arb_high_cap % IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK; - if ((status = vlarb_update_table_block(sm, p, port_num, - force_update, - &qcfg->vlarb_high[1], - len, 3)) != IB_SUCCESS) - return status; - } - - return status; -} - -static ib_api_status_t sl2vl_update_table(osm_sm_t * sm, osm_physp_t * p, - uint8_t in_port, uint32_t attr_mod, - unsigned force_update, - const ib_slvl_table_t * sl2vl_table) -{ - osm_madw_context_t context; - ib_slvl_table_t tbl, *p_tbl; - osm_node_t *p_node = osm_physp_get_node_ptr(p); - ib_api_status_t status; - unsigned vl_mask; - uint8_t vl1, vl2; - int i; - - vl_mask = (1 << (ib_port_info_get_op_vls(&p->port_info) - 1)) - 1; - - for (i = 0; i < IB_MAX_NUM_VLS / 2; i++) { - vl1 = sl2vl_table->raw_vl_by_sl[i] >> 4; - vl2 = sl2vl_table->raw_vl_by_sl[i] & 0xf; - if (vl1 != 15) - vl1 &= vl_mask; - if (vl2 != 15) - vl2 &= vl_mask; - tbl.raw_vl_by_sl[i] = (vl1 << 4) | vl2; - } - - if (!force_update && (p_tbl = osm_physp_get_slvl_tbl(p, in_port)) && - !memcmp(p_tbl, &tbl, sizeof(tbl))) - return IB_SUCCESS; - - context.slvl_context.node_guid = osm_node_get_node_guid(p_node); - context.slvl_context.port_guid = osm_physp_get_port_guid(p); - context.slvl_context.set_method = TRUE; - status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p), - (uint8_t *) & tbl, sizeof(tbl), - IB_MAD_ATTR_SLVL_TABLE, cl_hton32(attr_mod), - CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 6203 : " - "failed to update SL2VLMapping tables " - "for port %" PRIx64 ", attr_mod 0x%x\n", - cl_ntoh64(p->port_guid), attr_mod); - return status; -} - -static int qos_extports_setup(osm_sm_t * sm, osm_node_t *node, - const struct qos_config *qcfg) -{ - osm_physp_t *p0, *p; - unsigned force_update; - unsigned num_ports = osm_node_get_num_physp(node); - int ret = 0; - unsigned i, j; - - for (i = 1; i < num_ports; i++) { - p = osm_node_get_physp_ptr(node, i); - force_update = p->need_update || sm->p_subn->need_update; - p->vl_high_limit = qcfg->vl_high_limit; - if (vlarb_update(sm, p, p->port_num, force_update, qcfg)) - ret = -1; - } - - p0 = osm_node_get_physp_ptr(node, 0); - if (!(p0->port_info.capability_mask & IB_PORT_CAP_HAS_SL_MAP)) - return ret; - - if (ib_switch_info_get_opt_sl2vlmapping(&node->sw->switch_info) && - sm->p_subn->opt.use_optimized_slvl) { - p = osm_node_get_physp_ptr(node, 1); - force_update = p->need_update || sm->p_subn->need_update; - return sl2vl_update_table(sm, p, 1, 0x30000, force_update, - &qcfg->sl2vl); - } - - for (i = 1; i < num_ports; i++) { - p = osm_node_get_physp_ptr(node, i); - force_update = p->need_update || sm->p_subn->need_update; - for (j = 0; j < num_ports; j++) - if (sl2vl_update_table(sm, p, i, i << 8 | j, - force_update, &qcfg->sl2vl)) - ret = -1; - } - - return ret; -} - -static int qos_endport_setup(osm_sm_t * sm, osm_physp_t * p, - const struct qos_config *qcfg) -{ - unsigned force_update = p->need_update || sm->p_subn->need_update; - - p->vl_high_limit = qcfg->vl_high_limit; - if (vlarb_update(sm, p, 0, force_update, qcfg)) - return -1; - - if (!(p->port_info.capability_mask & IB_PORT_CAP_HAS_SL_MAP)) - return 0; - - if (sl2vl_update_table(sm, p, 0, 0, force_update, &qcfg->sl2vl)) - return -1; - - return 0; -} - -int osm_qos_setup(osm_opensm_t * p_osm) -{ - struct qos_config ca_config, sw0_config, swe_config, rtr_config; - struct qos_config *cfg; - cl_qmap_t *p_tbl; - cl_map_item_t *p_next; - osm_port_t *p_port; - osm_node_t *p_node; - int ret = 0; - - if (!p_osm->subn.opt.qos) - return 0; - - OSM_LOG_ENTER(&p_osm->log); - - qos_build_config(&ca_config, &p_osm->subn.opt.qos_ca_options, - &p_osm->subn.opt.qos_options); - qos_build_config(&sw0_config, &p_osm->subn.opt.qos_sw0_options, - &p_osm->subn.opt.qos_options); - qos_build_config(&swe_config, &p_osm->subn.opt.qos_swe_options, - &p_osm->subn.opt.qos_options); - qos_build_config(&rtr_config, &p_osm->subn.opt.qos_rtr_options, - &p_osm->subn.opt.qos_options); - - cl_plock_excl_acquire(&p_osm->lock); - - /* read QoS policy config file */ - osm_qos_parse_policy_file(&p_osm->subn); - - p_tbl = &p_osm->subn.port_guid_tbl; - p_next = cl_qmap_head(p_tbl); - while (p_next != cl_qmap_end(p_tbl)) { - p_port = (osm_port_t *) p_next; - p_next = cl_qmap_next(p_next); - - p_node = p_port->p_node; - if (p_node->sw) { - if (qos_extports_setup(&p_osm->sm, p_node, &swe_config)) - ret = -1; - - /* skip base port 0 */ - if (!ib_switch_info_is_enhanced_port0 - (&p_node->sw->switch_info)) - continue; - - cfg = &sw0_config; - } else if (osm_node_get_type(p_node) == IB_NODE_TYPE_ROUTER) - cfg = &rtr_config; - else - cfg = &ca_config; - - if (qos_endport_setup(&p_osm->sm, p_port->p_physp, cfg)) - ret = -1; - } - - cl_plock_release(&p_osm->lock); - OSM_LOG_EXIT(&p_osm->log); - - return ret; -} - -/* - * QoS config stuff - */ -static int parse_one_unsigned(char *str, char delim, unsigned *val) -{ - char *end; - *val = strtoul(str, &end, 0); - if (*end) - end++; - return (int)(end - str); -} - -static int parse_vlarb_entry(char *str, ib_vl_arb_element_t * e) -{ - unsigned val; - char *p = str; - p += parse_one_unsigned(p, ':', &val); - e->vl = val % 15; - p += parse_one_unsigned(p, ',', &val); - e->weight = (uint8_t) val; - return (int)(p - str); -} - -static int parse_sl2vl_entry(char *str, uint8_t * raw) -{ - unsigned val1, val2; - char *p = str; - p += parse_one_unsigned(p, ',', &val1); - p += parse_one_unsigned(p, ',', &val2); - *raw = (val1 << 4) | (val2 & 0xf); - return (int)(p - str); -} - -static void qos_build_config(struct qos_config *cfg, osm_qos_options_t * opt, - osm_qos_options_t * dflt) -{ - int i; - char *p; - - memset(cfg, 0, sizeof(*cfg)); - - cfg->max_vls = opt->max_vls > 0 ? opt->max_vls : dflt->max_vls; - - if (opt->high_limit >= 0) - cfg->vl_high_limit = (uint8_t) opt->high_limit; - else - cfg->vl_high_limit = (uint8_t) dflt->high_limit; - - p = opt->vlarb_high ? opt->vlarb_high : dflt->vlarb_high; - for (i = 0; i < 2 * IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK; i++) { - p += parse_vlarb_entry(p, - &cfg->vlarb_high[i / - IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK]. - vl_entry[i % - IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK]); - } - - p = opt->vlarb_low ? opt->vlarb_low : dflt->vlarb_low; - for (i = 0; i < 2 * IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK; i++) { - p += parse_vlarb_entry(p, - &cfg->vlarb_low[i / - IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK]. - vl_entry[i % - IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK]); - } - - p = opt->sl2vl ? opt->sl2vl : dflt->sl2vl; - for (i = 0; i < IB_MAX_NUM_VLS / 2; i++) - p += parse_sl2vl_entry(p, &cfg->sl2vl.raw_vl_by_sl[i]); -} diff --git a/branches/opensm_3/user/opensm/osm_qos_parser_l.c b/branches/opensm_3/user/opensm/osm_qos_parser_l.c deleted file mode 100644 index e7526615..00000000 --- a/branches/opensm_3/user/opensm/osm_qos_parser_l.c +++ /dev/null @@ -1,2679 +0,0 @@ - -#line 3 "osm_qos_parser_l.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#ifdef __WIN__ -#include -#include -#define isatty _isatty -#endif -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - -/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. - */ -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 -#endif - -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; -#endif /* ! C99 */ - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767-1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN (yy_start) = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START (((yy_start) - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#define YY_BUF_SIZE 16384 -#endif - -/* The state buf must be large enough to hold one state per character in the main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif - -extern int yyleng; - -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp = (yy_hold_char); \ - YY_RESTORE_YY_MORE_OFFSET \ - (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, (yytext_ptr) ) - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* Stack of input buffers. */ -static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ -static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ - ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ - : NULL) - -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart (FILE *input_file ); -void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); -void yy_delete_buffer (YY_BUFFER_STATE b ); -void yy_flush_buffer (YY_BUFFER_STATE b ); -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); -void yypop_buffer_state (void ); - -static void yyensure_buffer_stack (void ); -static void yy_load_buffer_state (void ); -static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); - -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); - -void *yyalloc (yy_size_t ); -void *yyrealloc (void *,yy_size_t ); -void yyfree (void * ); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; - -typedef int yy_state_type; - -extern int yylineno; - -int yylineno = 1; - -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - yyleng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 82 -#define YY_END_OF_BUFFER 83 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static yyconst flex_int16_t yy_accept[551] = - { 0, - 0, 0, 83, 81, 3, 4, 81, 81, 79, 78, - 76, 75, 75, 77, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 3, 2, 0, 80, 0, 1, - 75, 0, 0, 0, 57, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 74, 60, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 45, 0, 0, 39, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, - 0, 65, 59, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 45, 0, 39, 0, 34, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, - 0, 67, 0, 0, 0, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 54, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, - - 0, 0, 0, 0, 0, 0, 72, 0, 0, 69, - 0, 56, 0, 0, 58, 0, 0, 0, 0, 0, - 0, 40, 0, 35, 0, 33, 0, 0, 0, 0, - 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 0, 0, 0, 0, 0, 0, 43, 0, 0, - 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 51, 0, 0, 0, 0, 0, 63, 0, - 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, - - 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, - 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, - 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 0, 11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 73, 0, 0, 0, 0, 0, 0, 41, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 46, 0, 32, - 0, 0, 31, 0, 49, 9, 0, 29, 0, 30, - - 0, 50, 0, 21, 0, 0, 0, 0, 0, 0, - 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 46, 32, 0, 31, 49, 7, 29, - 30, 50, 0, 0, 0, 47, 0, 53, 19, 0, - 0, 0, 36, 37, 15, 0, 0, 0, 0, 68, - 66, 0, 0, 42, 0, 52, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 48, 0, 0, 47, - 53, 0, 44, 17, 0, 36, 13, 0, 0, 70, - 0, 42, 52, 0, 24, 0, 12, 0, 0, 0, - - 0, 48, 0, 0, 44, 0, 62, 0, 0, 10, - 22, 0, 0, 0, 0, 0, 0, 27, 0, 38, - 0, 0, 8, 0, 20, 0, 16, 0, 0, 55, - 25, 38, 0, 0, 0, 18, 14, 55, 0, 0, - 0, 0, 0, 28, 0, 0, 26, 64, 71, 0 - } ; - -static yyconst flex_int32_t yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 4, 5, 1, 1, 1, 1, 1, - 1, 6, 1, 7, 8, 1, 1, 9, 10, 11, - 10, 10, 10, 10, 10, 10, 10, 12, 1, 1, - 1, 1, 1, 1, 13, 14, 15, 16, 17, 18, - 1, 19, 20, 1, 1, 21, 1, 22, 23, 24, - 1, 25, 26, 27, 28, 1, 29, 30, 31, 1, - 1, 1, 1, 1, 1, 1, 32, 33, 34, 35, - - 36, 37, 38, 39, 40, 1, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 30, - 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst flex_int32_t yy_meta[55] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, - 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1 - } ; - -static yyconst flex_int16_t yy_base[554] = - { 0, - 0, 0, 759, 760, 53, 760, 754, 754, 760, 760, - 760, 48, 51, 760, 42, 53, 51, 43, 56, 77, - 54, 54, 712, 707, 706, 703, 38, 63, 707, 84, - 115, 706, 701, 707, 71, 760, 744, 760, 744, 760, - 71, 0, 76, 68, 760, 87, 88, 92, 77, 86, - 93, 94, 96, 101, 698, 109, 710, 699, 698, 691, - 698, 705, 104, 703, 690, 688, 686, 113, 154, 684, - 133, 698, 115, 0, 760, 141, 140, 129, 134, 168, - 135, 169, 146, 171, 140, 688, 682, 723, 687, 678, - 720, 691, 690, 684, 674, 684, 668, 671, 712, 683, - - 666, 172, 665, 714, 667, 175, 712, 177, 674, 664, - 184, 186, 164, 179, 192, 193, 194, 709, 180, 196, - 199, 708, 760, 200, 204, 194, 660, 668, 171, 209, - 661, 664, 212, 697, 668, 663, 694, 217, 693, 188, - 692, 659, 656, 695, 662, 693, 231, 692, 653, 659, - 211, 650, 654, 657, 204, 240, 246, 224, 686, 225, - 642, 684, 216, 232, 640, 682, 236, 651, 230, 633, - 637, 635, 634, 636, 635, 253, 674, 254, 635, 260, - 672, 623, 622, 621, 637, 261, 667, 206, 626, 631, - 634, 629, 622, 621, 628, 653, 624, 657, 620, 649, - - 620, 607, 606, 224, 273, 257, 651, 265, 607, 649, - 602, 760, 601, 600, 760, 275, 615, 598, 596, 633, - 611, 640, 277, 639, 597, 637, 584, 629, 596, 595, - 632, 233, 601, 600, 579, 580, 579, 582, 587, 590, - 241, 280, 586, 255, 570, 571, 584, 286, 266, 580, - 618, 571, 568, 567, 578, 294, 258, 613, 564, 563, - 604, 559, 562, 607, 568, 561, 564, 560, 554, 558, - 562, 558, 551, 563, 564, 546, 547, 552, 586, 559, - 560, 297, 589, 582, 549, 543, 553, 554, 760, 545, - 548, 298, 581, 546, 531, 572, 571, 542, 529, 531, - - 573, 534, 565, 271, 530, 538, 520, 533, 528, 523, - 517, 514, 529, 527, 513, 519, 521, 513, 760, 518, - 517, 511, 522, 552, 511, 514, 498, 505, 516, 514, - 497, 544, 491, 536, 499, 498, 491, 495, 305, 494, - 500, 501, 504, 499, 492, 525, 524, 313, 314, 494, - 316, 317, 484, 319, 321, 322, 293, 521, 760, 478, - 492, 480, 483, 484, 484, 325, 476, 479, 484, 511, - 760, 474, 466, 465, 507, 471, 328, 511, 468, 463, - 458, 459, 458, 461, 286, 289, 339, 504, 341, 503, - 468, 342, 501, 343, 500, 452, 344, 498, 345, 497, - - 346, 496, 453, 760, 448, 347, 348, 459, 458, 450, - 350, 359, 490, 455, 454, 481, 442, 436, 443, 442, - 438, 361, 481, 362, 437, 445, 446, 428, 429, 443, - 444, 441, 442, 471, 470, 363, 469, 468, 760, 467, - 466, 465, 434, 414, 364, 462, 365, 461, 760, 366, - 422, 367, 459, 458, 760, 410, 418, 412, 413, 760, - 760, 410, 368, 452, 370, 451, 401, 409, 411, 403, - 760, 403, 414, 401, 412, 379, 442, 400, 400, 439, - 438, 381, 437, 760, 388, 435, 760, 401, 387, 760, - 386, 431, 430, 385, 381, 421, 760, 382, 385, 380, - - 383, 422, 387, 386, 419, 382, 760, 370, 364, 364, - 760, 364, 375, 374, 373, 372, 383, 358, 384, 404, - 397, 396, 760, 352, 760, 353, 760, 352, 385, 398, - 760, 397, 360, 354, 348, 760, 760, 387, 337, 281, - 266, 253, 236, 161, 75, 42, 760, 760, 760, 760, - 415, 417, 63 - } ; - -static yyconst flex_int16_t yy_def[554] = - { 0, - 550, 1, 550, 550, 550, 550, 551, 552, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 551, 550, 552, 550, - 550, 553, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 553, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 0, - 550, 550, 550 - } ; - -static yyconst flex_int16_t yy_nxt[815] = - { 0, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 13, 14, 15, 4, 16, 17, 4, 4, 4, 18, - 4, 4, 4, 4, 19, 20, 4, 4, 4, 4, - 4, 21, 4, 16, 22, 23, 24, 25, 4, 18, - 4, 4, 26, 27, 4, 28, 29, 30, 31, 32, - 33, 34, 4, 4, 35, 36, 41, 41, 41, 41, - 41, 41, 43, 44, 74, 45, 47, 46, 48, 61, - 46, 49, 35, 36, 43, 44, 549, 42, 50, 41, - 41, 41, 62, 43, 45, 44, 46, 55, 47, 56, - 49, 48, 51, 52, 63, 43, 75, 44, 76, 49, - - 50, 53, 80, 64, 77, 54, 50, 65, 79, 548, - 78, 51, 52, 81, 83, 67, 82, 75, 49, 84, - 85, 76, 109, 77, 53, 80, 77, 79, 50, 54, - 51, 52, 78, 83, 106, 83, 81, 94, 82, 53, - 85, 84, 111, 54, 107, 77, 110, 112, 114, 51, - 68, 95, 113, 96, 83, 102, 69, 87, 115, 70, - 101, 119, 53, 123, 103, 104, 126, 54, 114, 116, - 120, 113, 124, 102, 117, 121, 106, 125, 147, 118, - 122, 115, 123, 104, 119, 111, 107, 151, 148, 126, - 112, 155, 156, 157, 116, 160, 163, 120, 158, 117, - - 164, 124, 121, 159, 118, 167, 125, 122, 169, 547, - 176, 156, 151, 180, 155, 163, 172, 173, 186, 174, - 177, 189, 175, 181, 204, 208, 160, 169, 187, 190, - 191, 152, 147, 164, 153, 154, 192, 167, 193, 161, - 212, 205, 148, 232, 165, 204, 206, 157, 215, 233, - 248, 207, 158, 168, 176, 223, 152, 159, 249, 153, - 154, 180, 186, 212, 177, 224, 208, 249, 215, 209, - 161, 181, 187, 248, 205, 546, 256, 165, 223, 206, - 270, 282, 257, 271, 207, 168, 258, 292, 224, 280, - 281, 283, 545, 285, 299, 256, 286, 293, 282, 292, - - 403, 544, 250, 287, 288, 258, 377, 300, 283, 293, - 209, 250, 342, 343, 387, 389, 378, 392, 394, 344, - 397, 345, 399, 401, 388, 390, 412, 393, 395, 377, - 398, 543, 400, 402, 430, 431, 413, 432, 433, 378, - 387, 404, 389, 392, 394, 397, 399, 401, 445, 447, - 388, 452, 390, 393, 395, 398, 400, 402, 446, 448, - 412, 453, 463, 465, 476, 445, 447, 482, 452, 463, - 413, 465, 464, 466, 477, 446, 448, 483, 453, 464, - 476, 466, 482, 519, 529, 519, 529, 542, 538, 541, - 477, 540, 483, 520, 530, 520, 530, 539, 532, 538, - - 537, 536, 535, 534, 533, 532, 531, 528, 527, 526, - 525, 524, 523, 522, 484, 37, 37, 39, 39, 521, - 505, 518, 517, 502, 516, 515, 514, 513, 512, 511, - 510, 493, 492, 509, 508, 507, 486, 506, 505, 481, - 480, 504, 503, 502, 501, 500, 499, 498, 497, 496, - 495, 494, 493, 492, 491, 490, 489, 488, 487, 454, - 486, 485, 481, 480, 479, 478, 442, 441, 440, 438, - 437, 435, 434, 475, 474, 473, 472, 471, 470, 469, - 468, 467, 423, 462, 461, 460, 459, 458, 457, 456, - 455, 454, 451, 450, 449, 444, 443, 442, 441, 440, - - 439, 438, 437, 436, 435, 434, 429, 428, 427, 426, - 425, 424, 423, 422, 421, 420, 419, 418, 417, 416, - 415, 414, 411, 410, 409, 408, 407, 406, 405, 396, - 391, 386, 385, 384, 383, 382, 381, 380, 379, 376, - 375, 374, 373, 372, 371, 332, 370, 369, 368, 367, - 366, 365, 364, 324, 363, 362, 361, 360, 359, 358, - 357, 356, 355, 354, 353, 352, 351, 350, 349, 348, - 347, 346, 341, 340, 301, 339, 338, 337, 336, 335, - 334, 333, 332, 331, 330, 329, 328, 327, 326, 325, - 324, 323, 322, 321, 320, 319, 318, 317, 316, 315, - - 314, 313, 312, 311, 310, 309, 308, 307, 264, 306, - 305, 304, 303, 302, 301, 298, 297, 296, 295, 251, - 294, 291, 290, 289, 284, 279, 278, 277, 276, 275, - 274, 273, 272, 231, 269, 268, 267, 266, 226, 265, - 264, 222, 263, 262, 261, 260, 259, 255, 254, 253, - 210, 252, 251, 247, 246, 245, 244, 243, 198, 242, - 241, 240, 239, 238, 237, 236, 235, 234, 231, 230, - 229, 228, 227, 226, 225, 222, 221, 220, 219, 218, - 217, 216, 214, 166, 213, 162, 211, 210, 203, 202, - 201, 200, 199, 198, 146, 197, 144, 196, 195, 194, - - 188, 185, 184, 183, 182, 179, 178, 171, 170, 166, - 162, 150, 149, 146, 145, 144, 143, 142, 141, 140, - 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, - 129, 128, 127, 108, 105, 100, 99, 98, 97, 93, - 92, 91, 90, 89, 88, 86, 40, 38, 73, 72, - 71, 66, 60, 59, 58, 57, 40, 38, 550, 3, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550 - } ; - -static yyconst flex_int16_t yy_chk[815] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 5, 5, 12, 12, 12, 13, - 13, 13, 15, 15, 553, 16, 18, 17, 18, 27, - 22, 19, 35, 35, 21, 21, 546, 12, 19, 41, - 41, 41, 27, 15, 16, 15, 17, 21, 18, 22, - 19, 18, 20, 20, 28, 21, 43, 21, 44, 30, - - 19, 20, 49, 28, 46, 20, 30, 28, 48, 545, - 47, 20, 20, 50, 52, 30, 51, 43, 30, 53, - 54, 44, 73, 46, 20, 49, 56, 48, 30, 20, - 31, 31, 47, 68, 71, 52, 50, 63, 51, 31, - 54, 53, 76, 31, 71, 56, 73, 76, 78, 31, - 31, 63, 77, 63, 68, 69, 31, 56, 79, 31, - 68, 81, 31, 83, 69, 69, 85, 31, 78, 80, - 82, 77, 84, 102, 80, 82, 106, 84, 108, 80, - 82, 79, 83, 102, 81, 111, 106, 112, 108, 85, - 111, 113, 114, 115, 116, 117, 119, 120, 115, 116, - - 121, 124, 120, 115, 116, 125, 124, 120, 126, 544, - 130, 114, 151, 133, 113, 119, 129, 129, 138, 129, - 130, 140, 129, 133, 155, 158, 160, 126, 138, 140, - 140, 112, 147, 164, 112, 112, 140, 167, 140, 117, - 163, 156, 147, 188, 121, 155, 156, 157, 169, 188, - 204, 156, 157, 125, 176, 178, 151, 157, 206, 151, - 151, 180, 186, 163, 176, 178, 208, 249, 169, 158, - 160, 180, 186, 204, 205, 543, 216, 164, 223, 205, - 232, 242, 216, 232, 205, 167, 216, 248, 223, 241, - 241, 242, 542, 244, 257, 256, 244, 248, 282, 292, - - 357, 541, 206, 244, 244, 256, 339, 257, 282, 292, - 208, 249, 304, 304, 348, 349, 339, 351, 352, 304, - 354, 304, 355, 356, 348, 349, 366, 351, 352, 377, - 354, 540, 355, 356, 385, 385, 366, 386, 386, 377, - 387, 357, 389, 392, 394, 397, 399, 401, 406, 407, - 387, 411, 389, 392, 394, 397, 399, 401, 406, 407, - 412, 411, 422, 424, 436, 445, 447, 450, 452, 463, - 412, 465, 422, 424, 436, 445, 447, 450, 452, 463, - 476, 465, 482, 506, 517, 519, 529, 539, 538, 535, - 476, 534, 482, 506, 517, 519, 529, 533, 532, 530, - - 528, 526, 524, 522, 521, 520, 518, 516, 515, 514, - 513, 512, 510, 509, 450, 551, 551, 552, 552, 508, - 505, 504, 503, 502, 501, 500, 499, 498, 496, 495, - 494, 493, 492, 491, 489, 488, 486, 485, 483, 481, - 480, 479, 478, 477, 475, 474, 473, 472, 470, 469, - 468, 467, 466, 464, 462, 459, 458, 457, 456, 454, - 453, 451, 448, 446, 444, 443, 442, 441, 440, 438, - 437, 435, 434, 433, 432, 431, 430, 429, 428, 427, - 426, 425, 423, 421, 420, 419, 418, 417, 416, 415, - 414, 413, 410, 409, 408, 405, 403, 402, 400, 398, - - 396, 395, 393, 391, 390, 388, 384, 383, 382, 381, - 380, 379, 378, 376, 375, 374, 373, 372, 370, 369, - 368, 367, 365, 364, 363, 362, 361, 360, 358, 353, - 350, 347, 346, 345, 344, 343, 342, 341, 340, 338, - 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, - 327, 326, 325, 324, 323, 322, 321, 320, 318, 317, - 316, 315, 314, 313, 312, 311, 310, 309, 308, 307, - 306, 305, 303, 302, 301, 300, 299, 298, 297, 296, - 295, 294, 293, 291, 290, 288, 287, 286, 285, 284, - 283, 281, 280, 279, 278, 277, 276, 275, 274, 273, - - 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, - 262, 261, 260, 259, 258, 255, 254, 253, 252, 251, - 250, 247, 246, 245, 243, 240, 239, 238, 237, 236, - 235, 234, 233, 231, 230, 229, 228, 227, 226, 225, - 224, 222, 221, 220, 219, 218, 217, 214, 213, 211, - 210, 209, 207, 203, 202, 201, 200, 199, 198, 197, - 196, 195, 194, 193, 192, 191, 190, 189, 187, 185, - 184, 183, 182, 181, 179, 177, 175, 174, 173, 172, - 171, 170, 168, 166, 165, 162, 161, 159, 154, 153, - 152, 150, 149, 148, 146, 145, 144, 143, 142, 141, - - 139, 137, 136, 135, 134, 132, 131, 128, 127, 122, - 118, 110, 109, 107, 105, 104, 103, 101, 100, 99, - 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, - 88, 87, 86, 72, 70, 67, 66, 65, 64, 62, - 61, 60, 59, 58, 57, 55, 39, 37, 34, 33, - 32, 29, 26, 25, 24, 23, 8, 7, 3, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int yy_flex_debug; -int yy_flex_debug = 0; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -#line 1 "osm_qos_parser_l.l" -#line 2 "osm_qos_parser_l.l" -/* - * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Lexer of OSM QoS parser. - * - * Environment: - * Linux User Mode - * - * Author: - * Yevgeny Kliteynik, Mellanox - */ - -#include -#include "osm_qos_parser_y.h" - -#define HANDLE_IF_IN_DESCRIPTION if (in_description) { yylval = strdup(yytext); return TK_TEXT; } - -#define SAVE_POS save_pos() -static void save_pos(); - -extern int column_num; -extern int line_num; -extern FILE * yyin; -extern YYSTYPE yylval; - -boolean_t in_description = FALSE; -boolean_t in_list_of_hex_num_ranges = FALSE; -boolean_t in_node_type = FALSE; -boolean_t in_list_of_numbers = FALSE; -boolean_t in_list_of_strings = FALSE; -boolean_t in_list_of_num_pairs = FALSE; -boolean_t in_asterisk_or_list_of_numbers = FALSE; -boolean_t in_list_of_num_ranges = FALSE; -boolean_t in_single_string = FALSE; -boolean_t in_single_number = FALSE; - -static void reset_new_line_flags(); -#define RESET_NEW_LINE_FLAGS reset_new_line_flags() - -#define START_USE {in_description = TRUE;} /* list of strings including whitespace (description) */ -#define START_PORT_GUID {in_list_of_hex_num_ranges = TRUE;} /* comma-separated list of hex num ranges */ -#define START_PORT_NAME {in_list_of_strings = TRUE;} /* comma-separated list of following strings: ../../.. */ -#define START_PARTITION {in_single_string = TRUE;} /* single string w/o whitespaces (partition name) */ -#define START_NAME {in_single_string = TRUE;} /* single string w/o whitespaces (port group name) */ -#define START_QOS_LEVEL_NAME {in_single_string = TRUE;} /* single string w/o whitespaces (qos level name in match rule) */ - -#define START_NODE_TYPE {in_node_type = TRUE;} /* comma-separated list of node types (ROUTER,CA,...) */ -#define START_SL2VL_TABLE {in_list_of_numbers = TRUE;} /* comma-separated list of hex or dec numbers */ - -#define START_GROUP {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_ACROSS {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_ACROSS_TO {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_ACROSS_FROM {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_SOURCE {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_DESTINATION {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ - -#define START_VLARB_HIGH {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */ -#define START_VLARB_LOW {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */ - -#define START_TO {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */ -#define START_FROM {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */ - -#define START_PATH_BITS {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_QOS_CLASS {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_SERVICE_ID {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_PKEY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ - -#define START_SL {in_single_number = TRUE;} /* single number */ -#define START_VLARB_HIGH_LIMIT {in_single_number = TRUE;} /* single number */ -#define START_MTU_LIMIT {in_single_number = TRUE;} /* single number */ -#define START_RATE_LIMIT {in_single_number = TRUE;} /* single number */ -#define START_PACKET_LIFE {in_single_number = TRUE;} /* single number */ - -#define START_ULP_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_ANY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_SDP_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_SDP_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_RDS_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_RDS_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_ISER_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_ISER_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_SRP_GUID {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_IPOIB_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_IPOIB_PKEY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ - - -#define YY_NO_INPUT 1 -#line 933 "osm_qos_parser_l.c" - -#define INITIAL 0 - -#ifndef YY_NO_UNISTD_H -/* Special case for "unistd.h", since it is non-ANSI. We include it way - * down here because we want the user's section 1 to have been scanned first. - * The user has a chance to override it with an option. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -static int yy_init_globals (void ); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int yylex_destroy (void ); - -int yyget_debug (void ); - -void yyset_debug (int debug_flag ); - -YY_EXTRA_TYPE yyget_extra (void ); - -void yyset_extra (YY_EXTRA_TYPE user_defined ); - -FILE *yyget_in (void ); - -void yyset_in (FILE * in_str ); - -FILE *yyget_out (void ); - -void yyset_out (FILE * out_str ); - -int yyget_leng (void ); - -char *yyget_text (void ); - -int yyget_lineno (void ); - -void yyset_lineno (int line_number ); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap (void ); -#else -extern int yywrap (void ); -#endif -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); -#endif - -#ifndef YY_NO_INPUT - -#ifdef __cplusplus -static int yyinput (void ); -#else -static int input (void ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO fwrite( yytext, yyleng, 1, yyout ) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - int n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - }\ -\ - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex (void); - -#define YY_DECL int yylex (void) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 201 "osm_qos_parser_l.l" - - - -#line 1117 "osm_qos_parser_l.c" - - if ( !(yy_init) ) - { - (yy_init) = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of yytext. */ - *yy_cp = (yy_hold_char); - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = (yy_start); -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 551 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 760 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = (yy_hold_char); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - goto yy_find_action; - -case 1: -/* rule 1 can match eol */ -YY_RULE_SETUP -#line 204 "osm_qos_parser_l.l" -{ SAVE_POS; RESET_NEW_LINE_FLAGS; } /* swallow comment */ - YY_BREAK -case 2: -/* rule 2 can match eol */ -YY_RULE_SETUP -#line 205 "osm_qos_parser_l.l" -{ SAVE_POS; RESET_NEW_LINE_FLAGS; } /* trailing blanks with new line */ - YY_BREAK -case 3: -YY_RULE_SETUP -#line 206 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; } - YY_BREAK -case 4: -/* rule 4 can match eol */ -YY_RULE_SETUP -#line 207 "osm_qos_parser_l.l" -{ SAVE_POS; RESET_NEW_LINE_FLAGS; } - YY_BREAK -case 5: -YY_RULE_SETUP -#line 209 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_START; } - YY_BREAK -case 6: -YY_RULE_SETUP -#line 210 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_END; } - YY_BREAK -case 7: -YY_RULE_SETUP -#line 212 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_START; } - YY_BREAK -case 8: -YY_RULE_SETUP -#line 213 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_END; } - YY_BREAK -case 9: -YY_RULE_SETUP -#line 214 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_START; } - YY_BREAK -case 10: -YY_RULE_SETUP -#line 215 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_END; } - YY_BREAK -case 11: -YY_RULE_SETUP -#line 217 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_START; } - YY_BREAK -case 12: -YY_RULE_SETUP -#line 218 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_END; } - YY_BREAK -case 13: -YY_RULE_SETUP -#line 219 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_START; } - YY_BREAK -case 14: -YY_RULE_SETUP -#line 220 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_END; } - YY_BREAK -case 15: -YY_RULE_SETUP -#line 221 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_START; } - YY_BREAK -case 16: -YY_RULE_SETUP -#line 222 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_END; } - YY_BREAK -case 17: -YY_RULE_SETUP -#line 224 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_START; } - YY_BREAK -case 18: -YY_RULE_SETUP -#line 225 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_END; } - YY_BREAK -case 19: -YY_RULE_SETUP -#line 226 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_START; } - YY_BREAK -case 20: -YY_RULE_SETUP -#line 227 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_END; } - YY_BREAK -case 21: -YY_RULE_SETUP -#line 229 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_START; } - YY_BREAK -case 22: -YY_RULE_SETUP -#line 230 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_END; } - YY_BREAK -case 23: -YY_RULE_SETUP -#line 231 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_START; } - YY_BREAK -case 24: -YY_RULE_SETUP -#line 232 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_END; } - YY_BREAK -case 25: -YY_RULE_SETUP -#line 234 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_START; } - YY_BREAK -case 26: -YY_RULE_SETUP -#line 235 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_END; } - YY_BREAK -case 27: -YY_RULE_SETUP -#line 236 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_START; } - YY_BREAK -case 28: -YY_RULE_SETUP -#line 237 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_END; } - YY_BREAK -case 29: -YY_RULE_SETUP -#line 239 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_GUID; return TK_PORT_GUID; } - YY_BREAK -case 30: -YY_RULE_SETUP -#line 240 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_NAME; return TK_PORT_NAME; } - YY_BREAK -case 31: -YY_RULE_SETUP -#line 241 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PARTITION; return TK_PARTITION; } - YY_BREAK -case 32: -YY_RULE_SETUP -#line 242 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NODE_TYPE; return TK_NODE_TYPE; } - YY_BREAK -case 33: -YY_RULE_SETUP -#line 243 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NAME; return TK_NAME; } - YY_BREAK -case 34: -YY_RULE_SETUP -#line 244 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_USE; return TK_USE; } - YY_BREAK -case 35: -YY_RULE_SETUP -#line 245 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_GROUP; return TK_GROUP; } - YY_BREAK -case 36: -YY_RULE_SETUP -#line 246 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH; return TK_VLARB_HIGH; } - YY_BREAK -case 37: -YY_RULE_SETUP -#line 247 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_LOW; return TK_VLARB_LOW; } - YY_BREAK -case 38: -YY_RULE_SETUP -#line 248 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH_LIMIT; return TK_VLARB_HIGH_LIMIT;} - YY_BREAK -case 39: -YY_RULE_SETUP -#line 249 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_TO; return TK_TO; } - YY_BREAK -case 40: -YY_RULE_SETUP -#line 250 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_FROM; return TK_FROM; } - YY_BREAK -case 41: -YY_RULE_SETUP -#line 251 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_TO; return TK_ACROSS_TO; } - YY_BREAK -case 42: -YY_RULE_SETUP -#line 252 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_FROM; return TK_ACROSS_FROM;} - YY_BREAK -case 43: -YY_RULE_SETUP -#line 253 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS; return TK_ACROSS; } - YY_BREAK -case 44: -YY_RULE_SETUP -#line 254 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL2VL_TABLE; return TK_SL2VL_TABLE;} - YY_BREAK -case 45: -YY_RULE_SETUP -#line 255 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL; return TK_SL; } - YY_BREAK -case 46: -YY_RULE_SETUP -#line 256 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_MTU_LIMIT; return TK_MTU_LIMIT; } - YY_BREAK -case 47: -YY_RULE_SETUP -#line 257 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_RATE_LIMIT; return TK_RATE_LIMIT; } - YY_BREAK -case 48: -YY_RULE_SETUP -#line 258 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PACKET_LIFE; return TK_PACKET_LIFE;} - YY_BREAK -case 49: -YY_RULE_SETUP -#line 259 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PATH_BITS; return TK_PATH_BITS; } - YY_BREAK -case 50: -YY_RULE_SETUP -#line 260 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_CLASS; return TK_QOS_CLASS; } - YY_BREAK -case 51: -YY_RULE_SETUP -#line 261 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SOURCE; return TK_SOURCE; } - YY_BREAK -case 52: -YY_RULE_SETUP -#line 262 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_DESTINATION; return TK_DESTINATION;} - YY_BREAK -case 53: -YY_RULE_SETUP -#line 263 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SERVICE_ID; return TK_SERVICE_ID; } - YY_BREAK -case 54: -YY_RULE_SETUP -#line 264 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PKEY; return TK_PKEY; } - YY_BREAK -case 55: -YY_RULE_SETUP -#line 265 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_LEVEL_NAME; return TK_QOS_LEVEL_NAME;} - YY_BREAK -case 56: -YY_RULE_SETUP -#line 267 "osm_qos_parser_l.l" -{ SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ROUTER; yylval = strdup(yytext); return TK_TEXT; } - YY_BREAK -case 57: -YY_RULE_SETUP -#line 268 "osm_qos_parser_l.l" -{ SAVE_POS; if (in_node_type) return TK_NODE_TYPE_CA; yylval = strdup(yytext); return TK_TEXT; } - YY_BREAK -case 58: -YY_RULE_SETUP -#line 269 "osm_qos_parser_l.l" -{ SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SWITCH; yylval = strdup(yytext); return TK_TEXT; } - YY_BREAK -case 59: -YY_RULE_SETUP -#line 270 "osm_qos_parser_l.l" -{ SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SELF; yylval = strdup(yytext); return TK_TEXT; } - YY_BREAK -case 60: -YY_RULE_SETUP -#line 271 "osm_qos_parser_l.l" -{ SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ALL; yylval = strdup(yytext); return TK_TEXT; } - YY_BREAK -case 61: -YY_RULE_SETUP -#line 273 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_DEFAULT; return TK_ULP_DEFAULT; } - YY_BREAK -case 62: -YY_RULE_SETUP -#line 274 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_SERVICE_ID; } - YY_BREAK -case 63: -YY_RULE_SETUP -#line 275 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_PKEY; } - YY_BREAK -case 64: -YY_RULE_SETUP -#line 276 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_TARGET_PORT_GUID; } - YY_BREAK -case 65: -YY_RULE_SETUP -#line 278 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_SDP_DEFAULT; } - YY_BREAK -case 66: -YY_RULE_SETUP -#line 279 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_SDP_PORT; } - YY_BREAK -case 67: -YY_RULE_SETUP -#line 281 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_DEFAULT; return TK_ULP_RDS_DEFAULT; } - YY_BREAK -case 68: -YY_RULE_SETUP -#line 282 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_PORT; return TK_ULP_RDS_PORT; } - YY_BREAK -case 69: -YY_RULE_SETUP -#line 284 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_ISER_DEFAULT; } - YY_BREAK -case 70: -YY_RULE_SETUP -#line 285 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_ISER_PORT; } - YY_BREAK -case 71: -YY_RULE_SETUP -#line 287 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SRP_GUID; return TK_ULP_SRP_GUID; } - YY_BREAK -case 72: -YY_RULE_SETUP -#line 289 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_DEFAULT; return TK_ULP_IPOIB_DEFAULT; } - YY_BREAK -case 73: -YY_RULE_SETUP -#line 290 "osm_qos_parser_l.l" -{ SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_PKEY; return TK_ULP_IPOIB_PKEY; } - YY_BREAK -case 74: -YY_RULE_SETUP -#line 292 "osm_qos_parser_l.l" -{ - SAVE_POS; - yylval = strdup(yytext); - if (in_description || in_list_of_strings || in_single_string) - return TK_TEXT; - return TK_NUMBER; - } - YY_BREAK -case 75: -YY_RULE_SETUP -#line 300 "osm_qos_parser_l.l" -{ - SAVE_POS; - yylval = strdup(yytext); - if (in_description || in_list_of_strings || in_single_string) - return TK_TEXT; - return TK_NUMBER; - } - YY_BREAK -case 76: -YY_RULE_SETUP -#line 309 "osm_qos_parser_l.l" -{ - SAVE_POS; - if (in_description || in_list_of_strings || in_single_string) - { - yylval = strdup(yytext); - return TK_TEXT; - } - return TK_DASH; - } - YY_BREAK -case 77: -YY_RULE_SETUP -#line 319 "osm_qos_parser_l.l" -{ - SAVE_POS; - if (in_description || in_list_of_strings || in_single_string) - { - yylval = strdup(yytext); - return TK_TEXT; - } - return TK_DOTDOT; - } - YY_BREAK -case 78: -YY_RULE_SETUP -#line 329 "osm_qos_parser_l.l" -{ - SAVE_POS; - if (in_description) - { - yylval = strdup(yytext); - return TK_TEXT; - } - return TK_COMMA; - } - YY_BREAK -case 79: -YY_RULE_SETUP -#line 339 "osm_qos_parser_l.l" -{ - SAVE_POS; - if (in_description || in_list_of_strings || in_single_string) - { - yylval = strdup(yytext); - return TK_TEXT; - } - return TK_ASTERISK; - } - YY_BREAK -case 80: -/* rule 80 can match eol */ -YY_RULE_SETUP -#line 349 "osm_qos_parser_l.l" -{ - SAVE_POS; - yylval = strdup(&yytext[1]); - yylval[strlen(yylval)-1] = '\0'; - return TK_TEXT; - } - YY_BREAK -case 81: -YY_RULE_SETUP -#line 356 "osm_qos_parser_l.l" -{ SAVE_POS; yylval = strdup(yytext); return TK_TEXT;} - YY_BREAK -case 82: -YY_RULE_SETUP -#line 358 "osm_qos_parser_l.l" -ECHO; - YY_BREAK -#line 1663 "osm_qos_parser_l.c" -case YY_STATE_EOF(INITIAL): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = (yy_c_buf_p); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( yywrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ -} /* end of yylex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer (void) -{ - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register int number_to_move, i; - int ret_val; - - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; - - else - { - int num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; - - int yy_c_buf_p_offset = - (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), (size_t) num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - if ( (yy_n_chars) == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } - - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; - - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - - static yy_state_type yy_get_previous_state (void) -{ - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = (yy_start); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 551 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -{ - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); - - register YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 551 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 550); - - return yy_is_jam ? 0 : yy_current_state; -} - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) -#else - static int input (void) -#endif - -{ - int c; - - *(yy_c_buf_p) = (yy_hold_char); - - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; - - else - { /* need more input */ - int offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart(yyin ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap( ) ) - return EOF; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; - break; - } - } - } - - c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve yytext */ - (yy_hold_char) = *++(yy_c_buf_p); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * - * @note This function does not reset the start condition to @c INITIAL . - */ - void yyrestart (FILE * input_file ) -{ - - if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - - /* TODO. We should be able to replace this entire function body - * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); - */ - yyensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; -} - -static void yy_load_buffer_state (void) -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * - * @return the allocated buffer state. - */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - * - */ - void yy_delete_buffer (YY_BUFFER_STATE b ) -{ - - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); - - yyfree((void *) b ); -} - -#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ -#ifdef __cplusplus -extern "C" { -#endif -#ifndef __WIN__ -#ifdef __THROW /* this is a gnuism */ -extern int isatty (int ) __THROW; -#else -extern int isatty (int ); -#endif -#endif -#ifdef __cplusplus -} -#endif -#endif - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. - */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) - -{ - int oerrno = errno; - - yy_flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - errno = oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * - */ - void yy_flush_buffer (YY_BUFFER_STATE b ) -{ - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * - */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - if (new_buffer == NULL) - return; - - yyensure_buffer_stack(); - - /* This block is copied from yy_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void yypop_buffer_state (void) -{ - if (!YY_CURRENT_BUFFER) - return; - - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack (void) -{ - int num_to_alloc; - - if (!(yy_buffer_stack)) { - - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ - num_to_alloc = 1; - (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; - } - - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - /* zero only the new slots.*/ - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) -{ - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to yylex() will - * scan from a @e copy of @a str. - * @param yystr a NUL-terminated string to scan - * - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. - */ -YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) -{ - - return yy_scan_bytes(yystr,strlen(yystr) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to yylex() will - * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) yyalloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - yytext[yyleng] = (yy_hold_char); \ - (yy_c_buf_p) = yytext + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - yyleng = yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - * - */ -int yyget_lineno (void) -{ - - return yylineno; -} - -/** Get the input stream. - * - */ -FILE *yyget_in (void) -{ - return yyin; -} - -/** Get the output stream. - * - */ -FILE *yyget_out (void) -{ - return yyout; -} - -/** Get the length of the current token. - * - */ -int yyget_leng (void) -{ - return yyleng; -} - -/** Get the current token. - * - */ - -char *yyget_text (void) -{ - return yytext; -} - -/** Set the current line number. - * @param line_number - * - */ -void yyset_lineno (int line_number ) -{ - - yylineno = line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param in_str A readable stream. - * - * @see yy_switch_to_buffer - */ -void yyset_in (FILE * in_str ) -{ - yyin = in_str ; -} - -void yyset_out (FILE * out_str ) -{ - yyout = out_str ; -} - -int yyget_debug (void) -{ - return yy_flex_debug; -} - -void yyset_debug (int bdebug ) -{ - yy_flex_debug = bdebug ; -} - -static int yy_init_globals (void) -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate here. - */ - - (yy_buffer_stack) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = (FILE *) 0; - yyout = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * yylex_init() - */ - return 0; -} - -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy (void) -{ - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(); - } - - /* Destroy the stack itself. */ - yyfree((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * yylex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *yyalloc (yy_size_t size ) -{ - return (void *) malloc( size ); -} - -void *yyrealloc (void * ptr, yy_size_t size ) -{ - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); -} - -void yyfree (void * ptr ) -{ - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 358 "osm_qos_parser_l.l" - - - - -/********************************************* - *********************************************/ - -static void save_pos() -{ - int i; - for (i = 0; i < yyleng; i++) - { - if (yytext[i] == '\n') - { - line_num ++; - column_num = 1; - } - else - column_num ++; - } -} - -/********************************************* - *********************************************/ - -static void reset_new_line_flags() -{ - in_description = FALSE; - in_list_of_hex_num_ranges = FALSE; - in_node_type = FALSE; - in_list_of_numbers = FALSE; - in_list_of_strings = FALSE; - in_list_of_num_pairs = FALSE; - in_asterisk_or_list_of_numbers = FALSE; - in_list_of_num_ranges = FALSE; - in_single_string = FALSE; - in_single_number = FALSE; -} - diff --git a/branches/opensm_3/user/opensm/osm_qos_parser_l.l b/branches/opensm_3/user/opensm/osm_qos_parser_l.l deleted file mode 100644 index a31c79ee..00000000 --- a/branches/opensm_3/user/opensm/osm_qos_parser_l.l +++ /dev/null @@ -1,394 +0,0 @@ -%{ -/* - * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Lexer of OSM QoS parser. - * - * Environment: - * Linux User Mode - * - * Author: - * Yevgeny Kliteynik, Mellanox - */ - -#include -#include "osm_qos_parser_y.h" - -#define HANDLE_IF_IN_DESCRIPTION if (in_description) { yylval = strdup(yytext); return TK_TEXT; } - -#define SAVE_POS save_pos() -static void save_pos(); - -extern int column_num; -extern int line_num; -extern FILE * yyin; -extern YYSTYPE yylval; - -boolean_t in_description = FALSE; -boolean_t in_list_of_hex_num_ranges = FALSE; -boolean_t in_node_type = FALSE; -boolean_t in_list_of_numbers = FALSE; -boolean_t in_list_of_strings = FALSE; -boolean_t in_list_of_num_pairs = FALSE; -boolean_t in_asterisk_or_list_of_numbers = FALSE; -boolean_t in_list_of_num_ranges = FALSE; -boolean_t in_single_string = FALSE; -boolean_t in_single_number = FALSE; - -static void reset_new_line_flags(); -#define RESET_NEW_LINE_FLAGS reset_new_line_flags() - -#define START_USE {in_description = TRUE;} /* list of strings including whitespace (description) */ -#define START_PORT_GUID {in_list_of_hex_num_ranges = TRUE;} /* comma-separated list of hex num ranges */ -#define START_PORT_NAME {in_list_of_strings = TRUE;} /* comma-separated list of following strings: ../../.. */ -#define START_PARTITION {in_single_string = TRUE;} /* single string w/o whitespaces (partition name) */ -#define START_NAME {in_single_string = TRUE;} /* single string w/o whitespaces (port group name) */ -#define START_QOS_LEVEL_NAME {in_single_string = TRUE;} /* single string w/o whitespaces (qos level name in match rule) */ - -#define START_NODE_TYPE {in_node_type = TRUE;} /* comma-separated list of node types (ROUTER,CA,...) */ -#define START_SL2VL_TABLE {in_list_of_numbers = TRUE;} /* comma-separated list of hex or dec numbers */ - -#define START_GROUP {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_ACROSS {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_ACROSS_TO {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_ACROSS_FROM {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_SOURCE {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ -#define START_DESTINATION {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ - -#define START_VLARB_HIGH {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */ -#define START_VLARB_LOW {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */ - -#define START_TO {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */ -#define START_FROM {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */ - -#define START_PATH_BITS {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_QOS_CLASS {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_SERVICE_ID {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_PKEY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ - -#define START_SL {in_single_number = TRUE;} /* single number */ -#define START_VLARB_HIGH_LIMIT {in_single_number = TRUE;} /* single number */ -#define START_MTU_LIMIT {in_single_number = TRUE;} /* single number */ -#define START_RATE_LIMIT {in_single_number = TRUE;} /* single number */ -#define START_PACKET_LIFE {in_single_number = TRUE;} /* single number */ - -#define START_ULP_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_ANY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_SDP_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_SDP_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_RDS_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_RDS_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_ISER_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_ISER_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_SRP_GUID {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ -#define START_ULP_IPOIB_DEFAULT {in_single_number = TRUE;} /* single number */ -#define START_ULP_IPOIB_PKEY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ - - -%} - -%option nounput noinput - -QOS_ULPS_START qos\-ulps -QOS_ULPS_END end\-qos\-ulps -PORT_GROUPS_START port\-groups -PORT_GROUPS_END end\-port\-groups -PORT_GROUP_START port\-group -PORT_GROUP_END end\-port\-group -PORT_NUM port\-num -NAME name -USE use -PORT_GUID port\-guid -TARGET_PORT_GUID target\-port\-guid -PORT_NAME port\-name -PARTITION partition -NODE_TYPE node\-type -QOS_SETUP_START qos\-setup -QOS_SETUP_END end\-qos\-setup -VLARB_TABLES_START vlarb\-tables -VLARB_TABLES_END end\-vlarb\-tables -VLARB_SCOPE_START vlarb\-scope -VLARB_SCOPE_END end\-vlarb\-scope -GROUP group -ACROSS across -VLARB_HIGH vlarb\-high -VLARB_LOW vlarb\-low -VLARB_HIGH_LIMIT vl\-high\-limit -SL2VL_TABLES_START sl2vl\-tables -SL2VL_TABLES_END end\-sl2vl\-tables -SL2VL_SCOPE_START sl2vl\-scope -SL2VL_SCOPE_END end\-sl2vl\-scope -TO to -FROM from -ACROSS_TO across\-to -ACROSS_FROM across\-from -SL2VL_TABLE sl2vl\-table -QOS_LEVELS_START qos\-levels -QOS_LEVELS_END end\-qos\-levels -QOS_LEVEL_START qos\-level -QOS_LEVEL_END end\-qos\-level -SL sl -MTU_LIMIT mtu\-limit -RATE_LIMIT rate\-limit -PACKET_LIFE packet\-life -PATH_BITS path\-bits -QOS_MATCH_RULES_START qos\-match\-rules -QOS_MATCH_RULES_END end\-qos\-match\-rules -QOS_MATCH_RULE_START qos\-match\-rule -QOS_MATCH_RULE_END end\-qos\-match\-rule -QOS_CLASS qos\-class -SOURCE source -DESTINATION destination -SERVICE_ID service\-id -PKEY pkey -QOS_LEVEL_NAME qos\-level\-name - -ROUTER [Rr][Oo][Uu][Tt][Ee][Rr] -CA [Cc][Aa] -SWITCH [Ss][Ww][Ii][Tt][Cc][Hh] -SELF [Ss][Ee][Ll][Ff] -ALL [Aa][Ll][Ll] - -ULP_SDP [Ss][Dd][Pp] -ULP_SRP [Ss][Rr][Pp] -ULP_RDS [Rr][Dd][Ss] -ULP_IPOIB [Ii][Pp][Oo][Ii][Bb] -ULP_ISER [Ii][Ss][Ee][Rr] -ULP_ANY [Aa][Nn][Yy] -ULP_DEFAULT [Dd][Ee][Ff][Aa][Uu][Ll][Tt] - -WHITE [ \t]+ -NEW_LINE \n -COMMENT \#.*\n -WHITE_DOTDOT_WHITE [ \t]*:[ \t]* -WHITE_COMMA_WHITE [ \t]*,[ \t]* -QUOTED_TEXT \"[^\"]*\" - -%% - - -{COMMENT} { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* swallow comment */ -{WHITE}{NEW_LINE} { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* trailing blanks with new line */ -{WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; } -{NEW_LINE} { SAVE_POS; RESET_NEW_LINE_FLAGS; } - -{QOS_ULPS_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_START; } -{QOS_ULPS_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_END; } - -{PORT_GROUPS_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_START; } -{PORT_GROUPS_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_END; } -{PORT_GROUP_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_START; } -{PORT_GROUP_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_END; } - -{QOS_SETUP_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_START; } -{QOS_SETUP_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_END; } -{VLARB_TABLES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_START; } -{VLARB_TABLES_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_END; } -{VLARB_SCOPE_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_START; } -{VLARB_SCOPE_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_END; } - -{SL2VL_TABLES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_START; } -{SL2VL_TABLES_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_END; } -{SL2VL_SCOPE_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_START; } -{SL2VL_SCOPE_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_END; } - -{QOS_LEVELS_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_START; } -{QOS_LEVELS_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_END; } -{QOS_LEVEL_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_START; } -{QOS_LEVEL_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_END; } - -{QOS_MATCH_RULES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_START; } -{QOS_MATCH_RULES_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_END; } -{QOS_MATCH_RULE_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_START; } -{QOS_MATCH_RULE_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_END; } - -{PORT_GUID}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_GUID; return TK_PORT_GUID; } -{PORT_NAME}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_NAME; return TK_PORT_NAME; } -{PARTITION}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PARTITION; return TK_PARTITION; } -{NODE_TYPE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NODE_TYPE; return TK_NODE_TYPE; } -{NAME}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NAME; return TK_NAME; } -{USE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_USE; return TK_USE; } -{GROUP}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_GROUP; return TK_GROUP; } -{VLARB_HIGH}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH; return TK_VLARB_HIGH; } -{VLARB_LOW}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_LOW; return TK_VLARB_LOW; } -{VLARB_HIGH_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH_LIMIT; return TK_VLARB_HIGH_LIMIT;} -{TO}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_TO; return TK_TO; } -{FROM}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_FROM; return TK_FROM; } -{ACROSS_TO}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_TO; return TK_ACROSS_TO; } -{ACROSS_FROM}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_FROM; return TK_ACROSS_FROM;} -{ACROSS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS; return TK_ACROSS; } -{SL2VL_TABLE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL2VL_TABLE; return TK_SL2VL_TABLE;} -{SL}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL; return TK_SL; } -{MTU_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_MTU_LIMIT; return TK_MTU_LIMIT; } -{RATE_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_RATE_LIMIT; return TK_RATE_LIMIT; } -{PACKET_LIFE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PACKET_LIFE; return TK_PACKET_LIFE;} -{PATH_BITS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PATH_BITS; return TK_PATH_BITS; } -{QOS_CLASS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_CLASS; return TK_QOS_CLASS; } -{SOURCE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SOURCE; return TK_SOURCE; } -{DESTINATION}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_DESTINATION; return TK_DESTINATION;} -{SERVICE_ID}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SERVICE_ID; return TK_SERVICE_ID; } -{PKEY}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PKEY; return TK_PKEY; } -{QOS_LEVEL_NAME}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_LEVEL_NAME; return TK_QOS_LEVEL_NAME;} - -{ROUTER} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ROUTER; yylval = strdup(yytext); return TK_TEXT; } -{CA} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_CA; yylval = strdup(yytext); return TK_TEXT; } -{SWITCH} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SWITCH; yylval = strdup(yytext); return TK_TEXT; } -{SELF} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SELF; yylval = strdup(yytext); return TK_TEXT; } -{ALL} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ALL; yylval = strdup(yytext); return TK_TEXT; } - -{ULP_DEFAULT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_DEFAULT; return TK_ULP_DEFAULT; } -{ULP_ANY}{WHITE_COMMA_WHITE}{SERVICE_ID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_SERVICE_ID; } -{ULP_ANY}{WHITE_COMMA_WHITE}{PKEY} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_PKEY; } -{ULP_ANY}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_TARGET_PORT_GUID; } - -{ULP_SDP}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_SDP_DEFAULT; } -{ULP_SDP}{WHITE_COMMA_WHITE}{PORT_NUM} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_SDP_PORT; } - -{ULP_RDS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_DEFAULT; return TK_ULP_RDS_DEFAULT; } -{ULP_RDS}{WHITE_COMMA_WHITE}{PORT_NUM} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_PORT; return TK_ULP_RDS_PORT; } - -{ULP_ISER}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_ISER_DEFAULT; } -{ULP_ISER}{WHITE_COMMA_WHITE}{PORT_NUM} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_ISER_PORT; } - -{ULP_SRP}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SRP_GUID; return TK_ULP_SRP_GUID; } - -{ULP_IPOIB}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_DEFAULT; return TK_ULP_IPOIB_DEFAULT; } -{ULP_IPOIB}{WHITE_COMMA_WHITE}{PKEY} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_PKEY; return TK_ULP_IPOIB_PKEY; } - -0[xX][0-9a-fA-F]+ { - SAVE_POS; - yylval = strdup(yytext); - if (in_description || in_list_of_strings || in_single_string) - return TK_TEXT; - return TK_NUMBER; - } - -[0-9]+ { - SAVE_POS; - yylval = strdup(yytext); - if (in_description || in_list_of_strings || in_single_string) - return TK_TEXT; - return TK_NUMBER; - } - - -- { - SAVE_POS; - if (in_description || in_list_of_strings || in_single_string) - { - yylval = strdup(yytext); - return TK_TEXT; - } - return TK_DASH; - } - -: { - SAVE_POS; - if (in_description || in_list_of_strings || in_single_string) - { - yylval = strdup(yytext); - return TK_TEXT; - } - return TK_DOTDOT; - } - -, { - SAVE_POS; - if (in_description) - { - yylval = strdup(yytext); - return TK_TEXT; - } - return TK_COMMA; - } - -\* { - SAVE_POS; - if (in_description || in_list_of_strings || in_single_string) - { - yylval = strdup(yytext); - return TK_TEXT; - } - return TK_ASTERISK; - } - -{QUOTED_TEXT} { - SAVE_POS; - yylval = strdup(&yytext[1]); - yylval[strlen(yylval)-1] = '\0'; - return TK_TEXT; - } - -. { SAVE_POS; yylval = strdup(yytext); return TK_TEXT;} - -%% - - -/********************************************* - *********************************************/ - -static void save_pos() -{ - int i; - for (i = 0; i < yyleng; i++) - { - if (yytext[i] == '\n') - { - line_num ++; - column_num = 1; - } - else - column_num ++; - } -} - -/********************************************* - *********************************************/ - -static void reset_new_line_flags() -{ - in_description = FALSE; - in_list_of_hex_num_ranges = FALSE; - in_node_type = FALSE; - in_list_of_numbers = FALSE; - in_list_of_strings = FALSE; - in_list_of_num_pairs = FALSE; - in_asterisk_or_list_of_numbers = FALSE; - in_list_of_num_ranges = FALSE; - in_single_string = FALSE; - in_single_number = FALSE; -} diff --git a/branches/opensm_3/user/opensm/osm_qos_parser_y.c b/branches/opensm_3/user/opensm/osm_qos_parser_y.c deleted file mode 100644 index 68c32556..00000000 --- a/branches/opensm_3/user/opensm/osm_qos_parser_y.c +++ /dev/null @@ -1,5181 +0,0 @@ - -/* A Bison parser, made by GNU Bison 2.4.1. */ - -/* Skeleton implementation for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.4.1" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - -/* Using locations. */ -#define YYLSP_NEEDED 0 - - - -/* Copy the first part of user declarations. */ - -/* Line 189 of yacc.c */ -#line 1 "osm_qos_parser_y.y" - -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Grammar of OSM QoS parser. - * - * Environment: - * Linux User Mode - * - * Author: - * Yevgeny Kliteynik, Mellanox - */ - -#ifdef __WIN__ -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef __WIN__ -#define malloc -#define free -#define fopen Fopen -#endif - -#define OSM_QOS_POLICY_MAX_LINE_LEN 1024*10 -#define OSM_QOS_POLICY_SL2VL_TABLE_LEN IB_MAX_NUM_VLS -#define OSM_QOS_POLICY_MAX_VL_NUM IB_MAX_NUM_VLS - -typedef struct tmp_parser_struct_t_ { - char str[OSM_QOS_POLICY_MAX_LINE_LEN]; - uint64_t num_pair[2]; - cl_list_t str_list; - cl_list_t num_list; - cl_list_t num_pair_list; -} tmp_parser_struct_t; - -static void __parser_tmp_struct_init(); -static void __parser_tmp_struct_reset(); -static void __parser_tmp_struct_destroy(); - -static char * __parser_strip_white(char * str); - -static void __parser_str2uint64(uint64_t * p_val, char * str); - -static void __parser_port_group_start(); -static int __parser_port_group_end(); - -static void __parser_sl2vl_scope_start(); -static int __parser_sl2vl_scope_end(); - -static void __parser_vlarb_scope_start(); -static int __parser_vlarb_scope_end(); - -static void __parser_qos_level_start(); -static int __parser_qos_level_end(); - -static void __parser_match_rule_start(); -static int __parser_match_rule_end(); - -static void __parser_ulp_match_rule_start(); -static int __parser_ulp_match_rule_end(); - -static void __pkey_rangelist2rangearr( - cl_list_t * p_list, - uint64_t ** * p_arr, - unsigned * p_arr_len); - -static void __rangelist2rangearr( - cl_list_t * p_list, - uint64_t ** * p_arr, - unsigned * p_arr_len); - -static void __merge_rangearr( - uint64_t ** range_arr_1, - unsigned range_len_1, - uint64_t ** range_arr_2, - unsigned range_len_2, - uint64_t ** * p_arr, - unsigned * p_arr_len ); - -static void __parser_add_port_to_port_map( - cl_qmap_t * p_map, - osm_physp_t * p_physp); - -static void __parser_add_guid_range_to_port_map( - cl_qmap_t * p_map, - uint64_t ** range_arr, - unsigned range_len); - -static void __parser_add_pkey_range_to_port_map( - cl_qmap_t * p_map, - uint64_t ** range_arr, - unsigned range_len); - -static void __parser_add_partition_list_to_port_map( - cl_qmap_t * p_map, - cl_list_t * p_list); - -static void __parser_add_map_to_port_map( - cl_qmap_t * p_dmap, - cl_map_t * p_smap); - -static int __validate_pkeys( - uint64_t ** range_arr, - unsigned range_len, - boolean_t is_ipoib); - -static void __setup_simple_qos_levels(); -static void __clear_simple_qos_levels(); -static void __setup_ulp_match_rules(); -static void __process_ulp_match_rules(); -static void yyerror(const char *format, ...); - -extern char * yytext; -extern int yylex (void); -extern FILE * yyin; -#ifndef __WIN__ -extern int errno; -#endif -int yyparse(); - -#define RESET_BUFFER __parser_tmp_struct_reset() - -tmp_parser_struct_t tmp_parser_struct; - -int column_num; -int line_num; - -osm_qos_policy_t * p_qos_policy = NULL; -osm_qos_port_group_t * p_current_port_group = NULL; -osm_qos_sl2vl_scope_t * p_current_sl2vl_scope = NULL; -osm_qos_vlarb_scope_t * p_current_vlarb_scope = NULL; -osm_qos_level_t * p_current_qos_level = NULL; -osm_qos_match_rule_t * p_current_qos_match_rule = NULL; -osm_log_t * p_qos_parser_osm_log; - -/* 16 Simple QoS Levels - one for each SL */ -static osm_qos_level_t osm_qos_policy_simple_qos_levels[16]; - -/* Default Simple QoS Level */ -osm_qos_level_t __default_simple_qos_level; - -/* - * List of match rules that will be generated by the - * qos-ulp section. These rules are concatenated to - * the end of the usual matching rules list at the - * end of parsing. - */ -static cl_list_t __ulp_match_rules; - -/***************************************************/ - - - -/* Line 189 of yacc.c */ -#line 260 "osm_qos_parser_y.c" - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TK_NUMBER = 258, - TK_DASH = 259, - TK_DOTDOT = 260, - TK_COMMA = 261, - TK_ASTERISK = 262, - TK_TEXT = 263, - TK_QOS_ULPS_START = 264, - TK_QOS_ULPS_END = 265, - TK_PORT_GROUPS_START = 266, - TK_PORT_GROUPS_END = 267, - TK_PORT_GROUP_START = 268, - TK_PORT_GROUP_END = 269, - TK_QOS_SETUP_START = 270, - TK_QOS_SETUP_END = 271, - TK_VLARB_TABLES_START = 272, - TK_VLARB_TABLES_END = 273, - TK_VLARB_SCOPE_START = 274, - TK_VLARB_SCOPE_END = 275, - TK_SL2VL_TABLES_START = 276, - TK_SL2VL_TABLES_END = 277, - TK_SL2VL_SCOPE_START = 278, - TK_SL2VL_SCOPE_END = 279, - TK_QOS_LEVELS_START = 280, - TK_QOS_LEVELS_END = 281, - TK_QOS_LEVEL_START = 282, - TK_QOS_LEVEL_END = 283, - TK_QOS_MATCH_RULES_START = 284, - TK_QOS_MATCH_RULES_END = 285, - TK_QOS_MATCH_RULE_START = 286, - TK_QOS_MATCH_RULE_END = 287, - TK_NAME = 288, - TK_USE = 289, - TK_PORT_GUID = 290, - TK_PORT_NAME = 291, - TK_PARTITION = 292, - TK_NODE_TYPE = 293, - TK_GROUP = 294, - TK_ACROSS = 295, - TK_VLARB_HIGH = 296, - TK_VLARB_LOW = 297, - TK_VLARB_HIGH_LIMIT = 298, - TK_TO = 299, - TK_FROM = 300, - TK_ACROSS_TO = 301, - TK_ACROSS_FROM = 302, - TK_SL2VL_TABLE = 303, - TK_SL = 304, - TK_MTU_LIMIT = 305, - TK_RATE_LIMIT = 306, - TK_PACKET_LIFE = 307, - TK_PATH_BITS = 308, - TK_QOS_CLASS = 309, - TK_SOURCE = 310, - TK_DESTINATION = 311, - TK_SERVICE_ID = 312, - TK_QOS_LEVEL_NAME = 313, - TK_PKEY = 314, - TK_NODE_TYPE_ROUTER = 315, - TK_NODE_TYPE_CA = 316, - TK_NODE_TYPE_SWITCH = 317, - TK_NODE_TYPE_SELF = 318, - TK_NODE_TYPE_ALL = 319, - TK_ULP_DEFAULT = 320, - TK_ULP_ANY_SERVICE_ID = 321, - TK_ULP_ANY_PKEY = 322, - TK_ULP_ANY_TARGET_PORT_GUID = 323, - TK_ULP_SDP_DEFAULT = 324, - TK_ULP_SDP_PORT = 325, - TK_ULP_RDS_DEFAULT = 326, - TK_ULP_RDS_PORT = 327, - TK_ULP_ISER_DEFAULT = 328, - TK_ULP_ISER_PORT = 329, - TK_ULP_SRP_GUID = 330, - TK_ULP_IPOIB_DEFAULT = 331, - TK_ULP_IPOIB_PKEY = 332 - }; -#endif -/* Tokens. */ -#define TK_NUMBER 258 -#define TK_DASH 259 -#define TK_DOTDOT 260 -#define TK_COMMA 261 -#define TK_ASTERISK 262 -#define TK_TEXT 263 -#define TK_QOS_ULPS_START 264 -#define TK_QOS_ULPS_END 265 -#define TK_PORT_GROUPS_START 266 -#define TK_PORT_GROUPS_END 267 -#define TK_PORT_GROUP_START 268 -#define TK_PORT_GROUP_END 269 -#define TK_QOS_SETUP_START 270 -#define TK_QOS_SETUP_END 271 -#define TK_VLARB_TABLES_START 272 -#define TK_VLARB_TABLES_END 273 -#define TK_VLARB_SCOPE_START 274 -#define TK_VLARB_SCOPE_END 275 -#define TK_SL2VL_TABLES_START 276 -#define TK_SL2VL_TABLES_END 277 -#define TK_SL2VL_SCOPE_START 278 -#define TK_SL2VL_SCOPE_END 279 -#define TK_QOS_LEVELS_START 280 -#define TK_QOS_LEVELS_END 281 -#define TK_QOS_LEVEL_START 282 -#define TK_QOS_LEVEL_END 283 -#define TK_QOS_MATCH_RULES_START 284 -#define TK_QOS_MATCH_RULES_END 285 -#define TK_QOS_MATCH_RULE_START 286 -#define TK_QOS_MATCH_RULE_END 287 -#define TK_NAME 288 -#define TK_USE 289 -#define TK_PORT_GUID 290 -#define TK_PORT_NAME 291 -#define TK_PARTITION 292 -#define TK_NODE_TYPE 293 -#define TK_GROUP 294 -#define TK_ACROSS 295 -#define TK_VLARB_HIGH 296 -#define TK_VLARB_LOW 297 -#define TK_VLARB_HIGH_LIMIT 298 -#define TK_TO 299 -#define TK_FROM 300 -#define TK_ACROSS_TO 301 -#define TK_ACROSS_FROM 302 -#define TK_SL2VL_TABLE 303 -#define TK_SL 304 -#define TK_MTU_LIMIT 305 -#define TK_RATE_LIMIT 306 -#define TK_PACKET_LIFE 307 -#define TK_PATH_BITS 308 -#define TK_QOS_CLASS 309 -#define TK_SOURCE 310 -#define TK_DESTINATION 311 -#define TK_SERVICE_ID 312 -#define TK_QOS_LEVEL_NAME 313 -#define TK_PKEY 314 -#define TK_NODE_TYPE_ROUTER 315 -#define TK_NODE_TYPE_CA 316 -#define TK_NODE_TYPE_SWITCH 317 -#define TK_NODE_TYPE_SELF 318 -#define TK_NODE_TYPE_ALL 319 -#define TK_ULP_DEFAULT 320 -#define TK_ULP_ANY_SERVICE_ID 321 -#define TK_ULP_ANY_PKEY 322 -#define TK_ULP_ANY_TARGET_PORT_GUID 323 -#define TK_ULP_SDP_DEFAULT 324 -#define TK_ULP_SDP_PORT 325 -#define TK_ULP_RDS_DEFAULT 326 -#define TK_ULP_RDS_PORT 327 -#define TK_ULP_ISER_DEFAULT 328 -#define TK_ULP_ISER_PORT 329 -#define TK_ULP_SRP_GUID 330 -#define TK_ULP_IPOIB_DEFAULT 331 -#define TK_ULP_IPOIB_PKEY 332 - - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - - -/* Copy the second part of user declarations. */ - - -/* Line 264 of yacc.c */ -#line 456 "osm_qos_parser_y.c" - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) -# endif -# endif -# ifndef YY_ -# define YY_(msgid) msgid -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int yyi) -#else -static int -YYID (yyi) - int yyi; -#endif -{ - return yyi; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) - -#endif - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 3 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 262 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 78 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 165 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 238 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 328 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 332 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77 -}; - -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 5, 6, 9, 11, 13, 15, 17, - 19, 23, 25, 28, 32, 34, 37, 41, 43, 45, - 46, 49, 51, 53, 55, 57, 59, 61, 63, 67, - 68, 71, 74, 78, 79, 82, 86, 88, 90, 91, - 94, 96, 98, 100, 102, 104, 108, 109, 112, 116, - 118, 120, 121, 124, 126, 128, 130, 132, 134, 136, - 138, 142, 143, 146, 150, 152, 154, 155, 158, 160, - 162, 164, 166, 168, 170, 172, 174, 178, 179, 182, - 186, 188, 190, 191, 194, 196, 198, 200, 202, 204, - 206, 208, 211, 212, 218, 219, 225, 226, 232, 233, - 237, 238, 244, 245, 249, 250, 256, 257, 261, 262, - 268, 269, 275, 276, 280, 281, 287, 289, 291, 293, - 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, - 316, 318, 321, 323, 326, 328, 331, 333, 336, 338, - 341, 343, 346, 348, 350, 354, 356, 358, 360, 362, - 364, 366, 368, 370, 372, 374, 377, 379, 382, 384, - 387, 389, 392, 394, 397, 399, 402, 404, 407, 409, - 412, 414, 417, 419, 422, 424, 427, 429, 431, 433, - 435, 437, 439, 441, 443, 445, 448, 450, 453, 455, - 458, 460, 463, 465, 468, 470, 473, 475, 478, 480, - 483, 485, 488, 490, 493, 495, 498, 500, 503, 505, - 508, 510, 513, 515, 518, 520, 523, 525, 527, 529, - 532, 534, 536, 540, 542, 544, 548, 550, 554, 560, - 562, 564, 566, 568, 572, 578, 582, 584, 586 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int16 yyrhs[] = -{ - 79, 0, -1, 80, -1, -1, 80, 81, -1, 82, - -1, 84, -1, 91, -1, 107, -1, 114, -1, 9, - 83, 10, -1, 121, -1, 83, 121, -1, 11, 85, - 12, -1, 86, -1, 85, 86, -1, 87, 89, 88, - -1, 13, -1, 14, -1, -1, 89, 90, -1, 147, - -1, 149, -1, 153, -1, 151, -1, 155, -1, 157, - -1, 159, -1, 15, 92, 16, -1, -1, 92, 93, - -1, 92, 100, -1, 17, 94, 18, -1, -1, 94, - 95, -1, 96, 98, 97, -1, 19, -1, 20, -1, - -1, 98, 99, -1, 168, -1, 170, -1, 174, -1, - 176, -1, 172, -1, 21, 101, 22, -1, -1, 101, - 102, -1, 103, 105, 104, -1, 23, -1, 24, -1, - -1, 105, 106, -1, 178, -1, 180, -1, 182, -1, - 184, -1, 186, -1, 188, -1, 196, -1, 25, 108, - 26, -1, -1, 108, 109, -1, 110, 112, 111, -1, - 27, -1, 28, -1, -1, 112, 113, -1, 198, -1, - 200, -1, 202, -1, 204, -1, 206, -1, 208, -1, - 210, -1, 212, -1, 29, 115, 30, -1, -1, 115, - 116, -1, 117, 119, 118, -1, 31, -1, 32, -1, - -1, 119, 120, -1, 214, -1, 216, -1, 222, -1, - 218, -1, 220, -1, 224, -1, 226, -1, 65, 232, - -1, -1, 134, 238, 5, 122, 146, -1, -1, 135, - 238, 5, 123, 146, -1, -1, 136, 238, 5, 124, - 146, -1, -1, 137, 125, 146, -1, -1, 138, 238, - 5, 126, 146, -1, -1, 139, 127, 146, -1, -1, - 140, 238, 5, 128, 146, -1, -1, 141, 129, 146, - -1, -1, 142, 238, 5, 130, 146, -1, -1, 143, - 238, 5, 131, 146, -1, -1, 144, 132, 146, -1, - -1, 145, 238, 5, 133, 146, -1, 66, -1, 67, - -1, 68, -1, 69, -1, 70, -1, 71, -1, 72, - -1, 73, -1, 74, -1, 75, -1, 76, -1, 77, - -1, 232, -1, 148, 228, -1, 33, -1, 150, 228, - -1, 34, -1, 152, 231, -1, 36, -1, 154, 238, - -1, 35, -1, 156, 238, -1, 59, -1, 158, 231, - -1, 37, -1, 160, 161, -1, 38, -1, 162, -1, - 161, 6, 162, -1, 163, -1, 164, -1, 165, -1, - 166, -1, 167, -1, 61, -1, 62, -1, 60, -1, - 64, -1, 63, -1, 169, 231, -1, 39, -1, 171, - 231, -1, 40, -1, 173, 232, -1, 43, -1, 175, - 235, -1, 41, -1, 177, 235, -1, 42, -1, 179, - 231, -1, 39, -1, 181, 231, -1, 40, -1, 183, - 231, -1, 47, -1, 185, 231, -1, 46, -1, 187, - 190, -1, 45, -1, 189, 192, -1, 44, -1, 191, - -1, 194, -1, 7, -1, 193, -1, 195, -1, 7, - -1, 238, -1, 238, -1, 197, 233, -1, 48, -1, - 199, 228, -1, 33, -1, 201, 228, -1, 34, -1, - 203, 232, -1, 49, -1, 205, 232, -1, 50, -1, - 207, 232, -1, 51, -1, 209, 232, -1, 52, -1, - 211, 238, -1, 53, -1, 213, 238, -1, 59, -1, - 215, 228, -1, 34, -1, 217, 238, -1, 54, -1, - 219, 231, -1, 55, -1, 221, 231, -1, 56, -1, - 223, 228, -1, 58, -1, 225, 238, -1, 57, -1, - 227, 238, -1, 59, -1, 229, -1, 230, -1, 229, - 230, -1, 8, -1, 228, -1, 231, 6, 228, -1, - 234, -1, 234, -1, 233, 6, 234, -1, 3, -1, - 236, 5, 237, -1, 235, 6, 236, 5, 237, -1, - 3, -1, 3, -1, 239, -1, 240, -1, 241, 4, - 242, -1, 239, 6, 241, 4, 242, -1, 239, 6, - 240, -1, 3, -1, 3, -1, 3, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 276, 276, 279, 280, 283, 284, 285, 286, 287, - 311, 314, 315, 344, 347, 348, 351, 354, 359, 365, - 366, 369, 370, 371, 372, 373, 374, 375, 402, 405, - 406, 407, 412, 415, 416, 419, 422, 427, 433, 434, - 449, 450, 451, 452, 453, 458, 461, 462, 465, 468, - 473, 479, 480, 499, 500, 501, 502, 503, 504, 505, - 529, 532, 533, 536, 539, 544, 550, 551, 554, 555, - 556, 557, 558, 559, 560, 561, 583, 586, 587, 590, - 593, 598, 604, 605, 608, 609, 610, 611, 612, 613, - 614, 636, 654, 654, 675, 675, 696, 696, 731, 731, - 744, 744, 777, 777, 790, 790, 823, 823, 836, 836, - 869, 869, 905, 905, 925, 925, 956, 959, 962, 965, - 968, 971, 974, 977, 980, 983, 986, 989, 993, 1032, - 1055, 1060, 1083, 1088, 1154, 1159, 1179, 1184, 1204, 1209, - 1217, 1222, 1227, 1232, 1233, 1236, 1237, 1238, 1239, 1240, - 1243, 1249, 1255, 1261, 1269, 1291, 1308, 1313, 1330, 1335, - 1353, 1358, 1375, 1380, 1397, 1413, 1430, 1435, 1454, 1459, - 1476, 1481, 1499, 1504, 1509, 1514, 1519, 1524, 1525, 1528, - 1535, 1536, 1539, 1546, 1578, 1611, 1654, 1671, 1694, 1699, - 1722, 1727, 1747, 1752, 1772, 1778, 1798, 1804, 1824, 1830, - 1865, 1870, 1903, 1920, 1943, 1948, 1982, 1987, 2004, 2009, - 2026, 2031, 2054, 2059, 2092, 2097, 2130, 2141, 2148, 2149, - 2152, 2159, 2160, 2165, 2168, 2169, 2172, 2180, 2186, 2194, - 2200, 2206, 2209, 2215, 2227, 2239, 2247, 2254, 2260 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "TK_NUMBER", "TK_DASH", "TK_DOTDOT", - "TK_COMMA", "TK_ASTERISK", "TK_TEXT", "TK_QOS_ULPS_START", - "TK_QOS_ULPS_END", "TK_PORT_GROUPS_START", "TK_PORT_GROUPS_END", - "TK_PORT_GROUP_START", "TK_PORT_GROUP_END", "TK_QOS_SETUP_START", - "TK_QOS_SETUP_END", "TK_VLARB_TABLES_START", "TK_VLARB_TABLES_END", - "TK_VLARB_SCOPE_START", "TK_VLARB_SCOPE_END", "TK_SL2VL_TABLES_START", - "TK_SL2VL_TABLES_END", "TK_SL2VL_SCOPE_START", "TK_SL2VL_SCOPE_END", - "TK_QOS_LEVELS_START", "TK_QOS_LEVELS_END", "TK_QOS_LEVEL_START", - "TK_QOS_LEVEL_END", "TK_QOS_MATCH_RULES_START", "TK_QOS_MATCH_RULES_END", - "TK_QOS_MATCH_RULE_START", "TK_QOS_MATCH_RULE_END", "TK_NAME", "TK_USE", - "TK_PORT_GUID", "TK_PORT_NAME", "TK_PARTITION", "TK_NODE_TYPE", - "TK_GROUP", "TK_ACROSS", "TK_VLARB_HIGH", "TK_VLARB_LOW", - "TK_VLARB_HIGH_LIMIT", "TK_TO", "TK_FROM", "TK_ACROSS_TO", - "TK_ACROSS_FROM", "TK_SL2VL_TABLE", "TK_SL", "TK_MTU_LIMIT", - "TK_RATE_LIMIT", "TK_PACKET_LIFE", "TK_PATH_BITS", "TK_QOS_CLASS", - "TK_SOURCE", "TK_DESTINATION", "TK_SERVICE_ID", "TK_QOS_LEVEL_NAME", - "TK_PKEY", "TK_NODE_TYPE_ROUTER", "TK_NODE_TYPE_CA", - "TK_NODE_TYPE_SWITCH", "TK_NODE_TYPE_SELF", "TK_NODE_TYPE_ALL", - "TK_ULP_DEFAULT", "TK_ULP_ANY_SERVICE_ID", "TK_ULP_ANY_PKEY", - "TK_ULP_ANY_TARGET_PORT_GUID", "TK_ULP_SDP_DEFAULT", "TK_ULP_SDP_PORT", - "TK_ULP_RDS_DEFAULT", "TK_ULP_RDS_PORT", "TK_ULP_ISER_DEFAULT", - "TK_ULP_ISER_PORT", "TK_ULP_SRP_GUID", "TK_ULP_IPOIB_DEFAULT", - "TK_ULP_IPOIB_PKEY", "$accept", "head", "qos_policy_entries", - "qos_policy_entry", "qos_ulps_section", "qos_ulps", - "port_groups_section", "port_groups", "port_group", "port_group_start", - "port_group_end", "port_group_entries", "port_group_entry", - "qos_setup_section", "qos_setup_items", "vlarb_tables", - "vlarb_scope_items", "vlarb_scope", "vlarb_scope_start", - "vlarb_scope_end", "vlarb_scope_entries", "vlarb_scope_entry", - "sl2vl_tables", "sl2vl_scope_items", "sl2vl_scope", "sl2vl_scope_start", - "sl2vl_scope_end", "sl2vl_scope_entries", "sl2vl_scope_entry", - "qos_levels_section", "qos_levels", "qos_level", "qos_level_start", - "qos_level_end", "qos_level_entries", "qos_level_entry", - "qos_match_rules_section", "qos_match_rules", "qos_match_rule", - "qos_match_rule_start", "qos_match_rule_end", "qos_match_rule_entries", - "qos_match_rule_entry", "qos_ulp", "$@1", "$@2", "$@3", "$@4", "$@5", - "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", - "qos_ulp_type_any_service", "qos_ulp_type_any_pkey", - "qos_ulp_type_any_target_port_guid", "qos_ulp_type_sdp_default", - "qos_ulp_type_sdp_port", "qos_ulp_type_rds_default", - "qos_ulp_type_rds_port", "qos_ulp_type_iser_default", - "qos_ulp_type_iser_port", "qos_ulp_type_srp_guid", - "qos_ulp_type_ipoib_default", "qos_ulp_type_ipoib_pkey", "qos_ulp_sl", - "port_group_name", "port_group_name_start", "port_group_use", - "port_group_use_start", "port_group_port_name", - "port_group_port_name_start", "port_group_port_guid", - "port_group_port_guid_start", "port_group_pkey", "port_group_pkey_start", - "port_group_partition", "port_group_partition_start", - "port_group_node_type", "port_group_node_type_start", - "port_group_node_type_list", "node_type_item", "node_type_ca", - "node_type_switch", "node_type_router", "node_type_all", - "node_type_self", "vlarb_scope_group", "vlarb_scope_group_start", - "vlarb_scope_across", "vlarb_scope_across_start", - "vlarb_scope_vlarb_high_limit", "vlarb_scope_vlarb_high_limit_start", - "vlarb_scope_vlarb_high", "vlarb_scope_vlarb_high_start", - "vlarb_scope_vlarb_low", "vlarb_scope_vlarb_low_start", - "sl2vl_scope_group", "sl2vl_scope_group_start", "sl2vl_scope_across", - "sl2vl_scope_across_start", "sl2vl_scope_across_from", - "sl2vl_scope_across_from_start", "sl2vl_scope_across_to", - "sl2vl_scope_across_to_start", "sl2vl_scope_from", - "sl2vl_scope_from_start", "sl2vl_scope_to", "sl2vl_scope_to_start", - "sl2vl_scope_from_list_or_asterisk", "sl2vl_scope_from_asterisk", - "sl2vl_scope_to_list_or_asterisk", "sl2vl_scope_to_asterisk", - "sl2vl_scope_from_list_of_ranges", "sl2vl_scope_to_list_of_ranges", - "sl2vl_scope_sl2vl_table", "sl2vl_scope_sl2vl_table_start", - "qos_level_name", "qos_level_name_start", "qos_level_use", - "qos_level_use_start", "qos_level_sl", "qos_level_sl_start", - "qos_level_mtu_limit", "qos_level_mtu_limit_start", - "qos_level_rate_limit", "qos_level_rate_limit_start", - "qos_level_packet_life", "qos_level_packet_life_start", - "qos_level_path_bits", "qos_level_path_bits_start", "qos_level_pkey", - "qos_level_pkey_start", "qos_match_rule_use", "qos_match_rule_use_start", - "qos_match_rule_qos_class", "qos_match_rule_qos_class_start", - "qos_match_rule_source", "qos_match_rule_source_start", - "qos_match_rule_destination", "qos_match_rule_destination_start", - "qos_match_rule_qos_level_name", "qos_match_rule_qos_level_name_start", - "qos_match_rule_service_id", "qos_match_rule_service_id_start", - "qos_match_rule_pkey", "qos_match_rule_pkey_start", "single_string", - "single_string_elems", "single_string_element", "string_list", - "single_number", "num_list", "number", "num_list_with_dotdot", - "number_from_pair_1", "number_from_pair_2", "list_of_ranges", - "num_list_with_dash", "single_number_from_range", "number_from_range_1", - "number_from_range_2", 0 -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 78, 79, 80, 80, 81, 81, 81, 81, 81, - 82, 83, 83, 84, 85, 85, 86, 87, 88, 89, - 89, 90, 90, 90, 90, 90, 90, 90, 91, 92, - 92, 92, 93, 94, 94, 95, 96, 97, 98, 98, - 99, 99, 99, 99, 99, 100, 101, 101, 102, 103, - 104, 105, 105, 106, 106, 106, 106, 106, 106, 106, - 107, 108, 108, 109, 110, 111, 112, 112, 113, 113, - 113, 113, 113, 113, 113, 113, 114, 115, 115, 116, - 117, 118, 119, 119, 120, 120, 120, 120, 120, 120, - 120, 121, 122, 121, 123, 121, 124, 121, 125, 121, - 126, 121, 127, 121, 128, 121, 129, 121, 130, 121, - 131, 121, 132, 121, 133, 121, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 161, 162, 162, 162, 162, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, - 192, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 229, - 230, 231, 231, 232, 233, 233, 234, 235, 235, 236, - 237, 238, 239, 239, 239, 239, 240, 241, 242 -}; - -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 1, 0, 2, 1, 1, 1, 1, 1, - 3, 1, 2, 3, 1, 2, 3, 1, 1, 0, - 2, 1, 1, 1, 1, 1, 1, 1, 3, 0, - 2, 2, 3, 0, 2, 3, 1, 1, 0, 2, - 1, 1, 1, 1, 1, 3, 0, 2, 3, 1, - 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, - 3, 0, 2, 3, 1, 1, 0, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 0, 2, 3, - 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, - 1, 2, 0, 5, 0, 5, 0, 5, 0, 3, - 0, 5, 0, 3, 0, 5, 0, 3, 0, 5, - 0, 5, 0, 3, 0, 5, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, - 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, - 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, - 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, - 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, - 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, - 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, - 1, 1, 3, 1, 1, 3, 1, 3, 5, 1, - 1, 1, 1, 3, 5, 3, 1, 1, 1 -}; - -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 3, 0, 2, 1, 0, 0, 29, 61, 77, 4, - 5, 6, 7, 8, 9, 0, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 0, 11, - 0, 0, 0, 98, 0, 102, 0, 106, 0, 0, - 112, 0, 17, 0, 14, 19, 0, 0, 0, 226, - 91, 223, 10, 12, 236, 0, 231, 232, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 15, 0, 28, 33, 46, 30, 31, 60, 64, - 62, 66, 76, 80, 78, 82, 92, 0, 0, 94, - 96, 99, 128, 100, 103, 104, 107, 108, 110, 113, - 114, 18, 130, 132, 136, 134, 140, 142, 138, 16, - 20, 21, 0, 22, 0, 24, 0, 23, 0, 25, - 0, 26, 0, 27, 0, 0, 0, 0, 0, 0, - 235, 0, 238, 233, 0, 0, 0, 0, 0, 0, - 0, 220, 129, 217, 218, 131, 221, 133, 135, 137, - 139, 152, 150, 151, 154, 153, 141, 143, 145, 146, - 147, 148, 149, 32, 36, 34, 38, 45, 49, 47, - 51, 65, 188, 190, 192, 194, 196, 198, 200, 202, - 63, 67, 68, 0, 69, 0, 70, 0, 71, 0, - 72, 0, 73, 0, 74, 0, 75, 0, 81, 204, - 206, 208, 210, 214, 212, 216, 79, 83, 84, 0, - 85, 0, 87, 0, 88, 0, 86, 0, 89, 0, - 90, 0, 93, 0, 95, 97, 101, 105, 109, 111, - 115, 219, 0, 0, 0, 0, 187, 189, 191, 193, - 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, - 215, 234, 222, 144, 37, 156, 158, 162, 164, 160, - 35, 39, 40, 0, 41, 0, 44, 0, 42, 0, - 43, 0, 50, 166, 168, 176, 174, 172, 170, 186, - 48, 52, 53, 0, 54, 0, 55, 0, 56, 0, - 57, 0, 58, 0, 59, 0, 155, 157, 159, 229, - 161, 0, 163, 165, 167, 169, 171, 179, 173, 177, - 178, 183, 182, 175, 180, 181, 184, 185, 224, 0, - 0, 0, 0, 230, 227, 225, 0, 228 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 1, 2, 9, 10, 28, 11, 43, 44, 45, - 109, 72, 110, 12, 46, 76, 125, 165, 166, 260, - 234, 261, 77, 126, 169, 170, 280, 235, 281, 13, - 47, 80, 81, 180, 127, 181, 14, 48, 84, 85, - 206, 128, 207, 29, 129, 134, 135, 61, 136, 63, - 137, 65, 138, 139, 68, 140, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 91, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 156, 157, 158, 159, 160, 161, 162, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 308, 309, 313, 314, 310, 315, 294, 295, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 146, 143, 144, 147, 92, 317, 51, 300, 301, 324, - 55, 56, 57, 58, 133 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -279 -static const yytype_int16 yypact[] = -{ - -279, 19, 5, -279, 63, 9, -279, -279, -279, -279, - -279, -279, -279, -279, -279, 21, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, 45, -279, - 29, 29, 29, -279, 29, -279, 29, -279, 29, 29, - -279, 29, -279, 0, -279, -279, 36, 33, -4, -279, - -279, -279, -279, -279, 31, 61, 62, -279, 70, 71, - 79, 21, 80, 21, 81, 21, 83, 85, 21, 86, - -279, -279, 4, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, 29, 64, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, 84, -279, 84, -279, 84, -279, 29, -279, - 29, -279, 84, -279, 91, 32, 39, -5, 24, 21, - -279, 90, -279, -279, 21, 21, 21, 21, 21, 21, - 21, -279, -279, 84, -279, -279, -279, 92, -279, -279, - 92, -279, -279, -279, -279, -279, 93, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, 84, -279, 84, -279, 21, -279, 21, - -279, 21, -279, 21, -279, 29, -279, 29, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, 84, - -279, 29, -279, 84, -279, 84, -279, 84, -279, 29, - -279, 29, -279, 64, -279, -279, -279, -279, -279, -279, - -279, -279, 84, 91, 107, 25, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, 92, 92, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, 84, -279, 84, -279, 21, -279, 97, - -279, 97, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, 84, -279, 84, -279, 84, -279, 84, - -279, 8, -279, 18, -279, 21, 92, 92, -279, -279, - 117, 120, 117, 92, 92, 92, 92, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, 135, -279, 97, - 123, 21, 137, -279, -279, -279, 123, -279 -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -279, -279, -279, -279, -279, -279, -279, -279, 53, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, 116, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -32, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -77, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, - -108, -279, 14, -120, -6, -279, -278, -113, -160, -166, - -31, -279, 74, 75, -55 -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -238 -static const yytype_int16 yytable[] = -{ - 59, 60, 150, 62, 142, 64, 145, 66, 67, 50, - 69, 54, 70, 42, 4, 307, 5, 318, 101, 3, - 6, 54, 42, 171, 49, 312, 82, 83, 172, 173, - 7, 94, 54, 96, 8, -237, 99, 102, 103, 104, - 105, 106, 107, 325, 174, 175, 176, 177, 178, 272, - 163, 164, 73, 74, 179, 52, 198, 75, 199, 78, - 79, 167, 168, 108, 273, 274, 86, 132, 87, 275, - 276, 277, 278, 279, 88, 236, 89, 237, 200, 201, - 202, 203, 204, 205, 90, 93, 95, 148, 97, 149, - 98, 100, 141, 246, 223, 247, 71, 222, 232, 233, - 299, 244, 224, 225, 226, 227, 228, 229, 230, 248, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 319, 252, 320, 323, 254, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 321, 326, 296, 53, 297, 255, 256, 257, 258, - 259, 151, 152, 153, 154, 155, 253, 231, 302, 322, - 327, 130, 131, 303, 242, 304, 243, 305, 251, 306, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 245, 238, 0, 239, 0, 240, 0, 241, 249, 0, - 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 311, 298, 316 -}; - -static const yytype_int16 yycheck[] = -{ - 31, 32, 122, 34, 112, 36, 114, 38, 39, 15, - 41, 3, 12, 13, 9, 7, 11, 295, 14, 0, - 15, 3, 13, 28, 3, 7, 30, 31, 33, 34, - 25, 63, 3, 65, 29, 4, 68, 33, 34, 35, - 36, 37, 38, 321, 49, 50, 51, 52, 53, 24, - 18, 19, 16, 17, 59, 10, 32, 21, 34, 26, - 27, 22, 23, 59, 39, 40, 5, 3, 6, 44, - 45, 46, 47, 48, 4, 183, 5, 185, 54, 55, - 56, 57, 58, 59, 5, 5, 5, 118, 5, 120, - 5, 5, 8, 213, 4, 215, 43, 129, 6, 6, - 3, 209, 134, 135, 136, 137, 138, 139, 140, 217, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 6, 232, 5, 3, 20, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 6, 5, 263, 28, 265, 39, 40, 41, 42, - 43, 60, 61, 62, 63, 64, 233, 143, 271, 319, - 326, 87, 87, 283, 195, 285, 197, 287, 223, 289, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 211, 187, -1, 189, -1, 191, -1, 193, 219, -1, - 221, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 291, 267, 293 -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 79, 80, 0, 9, 11, 15, 25, 29, 81, - 82, 84, 91, 107, 114, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 83, 121, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 13, 85, 86, 87, 92, 108, 115, 3, - 232, 234, 10, 121, 3, 238, 239, 240, 241, 238, - 238, 125, 238, 127, 238, 129, 238, 238, 132, 238, - 12, 86, 89, 16, 17, 21, 93, 100, 26, 27, - 109, 110, 30, 31, 116, 117, 5, 6, 4, 5, - 5, 146, 232, 5, 146, 5, 146, 5, 5, 146, - 5, 14, 33, 34, 35, 36, 37, 38, 59, 88, - 90, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 94, 101, 112, 119, 122, - 240, 241, 3, 242, 123, 124, 126, 128, 130, 131, - 133, 8, 228, 229, 230, 228, 228, 231, 238, 238, - 231, 60, 61, 62, 63, 64, 161, 162, 163, 164, - 165, 166, 167, 18, 19, 95, 96, 22, 23, 102, - 103, 28, 33, 34, 49, 50, 51, 52, 53, 59, - 111, 113, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 32, 34, - 54, 55, 56, 57, 58, 59, 118, 120, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 146, 4, 146, 146, 146, 146, 146, 146, - 146, 230, 6, 6, 98, 105, 228, 228, 232, 232, - 232, 232, 238, 238, 228, 238, 231, 231, 228, 238, - 238, 242, 228, 162, 20, 39, 40, 41, 42, 43, - 97, 99, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 24, 39, 40, 44, 45, 46, 47, 48, - 104, 106, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 196, 197, 231, 231, 232, 3, - 235, 236, 235, 231, 231, 231, 231, 7, 190, 191, - 194, 238, 7, 192, 193, 195, 238, 233, 234, 6, - 5, 6, 236, 3, 237, 234, 5, 237 -}; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -#else -static void -yy_stack_print (yybottom, yytop) - yytype_int16 *yybottom; - yytype_int16 *yytop; -#endif -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} - -/* Prevent warnings from -Wmissing-prototypes. */ -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; - -/* Number of syntax errors so far. */ -int yynerrs; - - - -/*-------------------------. -| yyparse or yypush_parse. | -`-------------------------*/ - -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () - -#endif -#endif -{ - - - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - `yyss': related to states. - `yyvs': related to semantic values. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yytoken = 0; - yyss = yyssa; - yyvs = yyvsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - yyssp = yyss; - yyvsp = yyvs; - - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - - yystate = yyn; - *++yyvsp = yylval; - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 17: - -/* Line 1455 of yacc.c */ -#line 354 "osm_qos_parser_y.y" - { - __parser_port_group_start(); - } - break; - - case 18: - -/* Line 1455 of yacc.c */ -#line 359 "osm_qos_parser_y.y" - { - if ( __parser_port_group_end() ) - return 1; - } - break; - - case 36: - -/* Line 1455 of yacc.c */ -#line 422 "osm_qos_parser_y.y" - { - __parser_vlarb_scope_start(); - } - break; - - case 37: - -/* Line 1455 of yacc.c */ -#line 427 "osm_qos_parser_y.y" - { - if ( __parser_vlarb_scope_end() ) - return 1; - } - break; - - case 49: - -/* Line 1455 of yacc.c */ -#line 468 "osm_qos_parser_y.y" - { - __parser_sl2vl_scope_start(); - } - break; - - case 50: - -/* Line 1455 of yacc.c */ -#line 473 "osm_qos_parser_y.y" - { - if ( __parser_sl2vl_scope_end() ) - return 1; - } - break; - - case 64: - -/* Line 1455 of yacc.c */ -#line 539 "osm_qos_parser_y.y" - { - __parser_qos_level_start(); - } - break; - - case 65: - -/* Line 1455 of yacc.c */ -#line 544 "osm_qos_parser_y.y" - { - if ( __parser_qos_level_end() ) - return 1; - } - break; - - case 80: - -/* Line 1455 of yacc.c */ -#line 593 "osm_qos_parser_y.y" - { - __parser_match_rule_start(); - } - break; - - case 81: - -/* Line 1455 of yacc.c */ -#line 598 "osm_qos_parser_y.y" - { - if ( __parser_match_rule_end() ) - return 1; - } - break; - - case 91: - -/* Line 1455 of yacc.c */ -#line 636 "osm_qos_parser_y.y" - { - /* parsing default ulp rule: "default: num" */ - cl_list_iterator_t list_iterator; - uint64_t * p_tmp_num; - - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_tmp_num = (uint64_t*)cl_list_obj(list_iterator); - if (*p_tmp_num > 15) - { - yyerror("illegal SL value"); - return 1; - } - __default_simple_qos_level.sl = (uint8_t)(*p_tmp_num); - __default_simple_qos_level.sl_set = TRUE; - free(p_tmp_num); - cl_list_remove_all(&tmp_parser_struct.num_list); - } - break; - - case 92: - -/* Line 1455 of yacc.c */ -#line 654 "osm_qos_parser_y.y" - { - /* "any, service-id ... : sl" - one instance of list of ranges */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("ULP rule doesn't have service ids"); - return 1; - } - - /* get all the service id ranges */ - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - - } - break; - - case 94: - -/* Line 1455 of yacc.c */ -#line 675 "osm_qos_parser_y.y" - { - /* "any, pkey ... : sl" - one instance of list of ranges */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("ULP rule doesn't have pkeys"); - return 1; - } - - /* get all the pkey ranges */ - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - p_current_qos_match_rule->pkey_range_arr = range_arr; - p_current_qos_match_rule->pkey_range_len = range_len; - - } - break; - - case 96: - -/* Line 1455 of yacc.c */ -#line 696 "osm_qos_parser_y.y" - { - /* any, target-port-guid ... : sl */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("ULP rule doesn't have port guids"); - return 1; - } - - /* create a new port group with these ports */ - __parser_port_group_start(); - - p_current_port_group->name = strdup("_ULP_Targets_"); - p_current_port_group->use = strdup("Generated from ULP rules"); - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - __parser_add_guid_range_to_port_map( - &p_current_port_group->port_map, - range_arr, - range_len); - - /* add this port group to the destination - groups of the current match rule */ - cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list, - p_current_port_group); - - __parser_port_group_end(); - - } - break; - - case 98: - -/* Line 1455 of yacc.c */ -#line 731 "osm_qos_parser_y.y" - { - /* "sdp : sl" - default SL for SDP */ - uint64_t ** range_arr = - (uint64_t **)malloc(sizeof(uint64_t *)); - range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t)); - range_arr[0][0] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID; - range_arr[0][1] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID + 0xFFFF; - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = 1; - - } - break; - - case 100: - -/* Line 1455 of yacc.c */ -#line 744 "osm_qos_parser_y.y" - { - /* sdp with port numbers */ - uint64_t ** range_arr; - unsigned range_len; - unsigned i; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("SDP ULP rule doesn't have port numbers"); - return 1; - } - - /* get all the port ranges */ - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - /* now translate these port numbers into service ids */ - for (i = 0; i < range_len; i++) - { - if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF) - { - yyerror("SDP port number out of range"); - return 1; - } - range_arr[i][0] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID; - range_arr[i][1] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID; - } - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - - } - break; - - case 102: - -/* Line 1455 of yacc.c */ -#line 777 "osm_qos_parser_y.y" - { - /* "rds : sl" - default SL for RDS */ - uint64_t ** range_arr = - (uint64_t **)malloc(sizeof(uint64_t *)); - range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t)); - range_arr[0][0] = range_arr[0][1] = - OSM_QOS_POLICY_ULP_RDS_SERVICE_ID + OSM_QOS_POLICY_ULP_RDS_PORT; - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = 1; - - } - break; - - case 104: - -/* Line 1455 of yacc.c */ -#line 790 "osm_qos_parser_y.y" - { - /* rds with port numbers */ - uint64_t ** range_arr; - unsigned range_len; - unsigned i; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("RDS ULP rule doesn't have port numbers"); - return 1; - } - - /* get all the port ranges */ - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - /* now translate these port numbers into service ids */ - for (i = 0; i < range_len; i++) - { - if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF) - { - yyerror("SDP port number out of range"); - return 1; - } - range_arr[i][0] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID; - range_arr[i][1] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID; - } - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - - } - break; - - case 106: - -/* Line 1455 of yacc.c */ -#line 823 "osm_qos_parser_y.y" - { - /* "iSER : sl" - default SL for iSER */ - uint64_t ** range_arr = - (uint64_t **)malloc(sizeof(uint64_t *)); - range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t)); - range_arr[0][0] = range_arr[0][1] = - OSM_QOS_POLICY_ULP_ISER_SERVICE_ID + OSM_QOS_POLICY_ULP_ISER_PORT; - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = 1; - - } - break; - - case 108: - -/* Line 1455 of yacc.c */ -#line 836 "osm_qos_parser_y.y" - { - /* iser with port numbers */ - uint64_t ** range_arr; - unsigned range_len; - unsigned i; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("iSER ULP rule doesn't have port numbers"); - return 1; - } - - /* get all the port ranges */ - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - /* now translate these port numbers into service ids */ - for (i = 0; i < range_len; i++) - { - if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF) - { - yyerror("SDP port number out of range"); - return 1; - } - range_arr[i][0] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID; - range_arr[i][1] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID; - } - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - - } - break; - - case 110: - -/* Line 1455 of yacc.c */ -#line 869 "osm_qos_parser_y.y" - { - /* srp with target guids - this rule is similar - to writing 'any' ulp with target port guids */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("SRP ULP rule doesn't have port guids"); - return 1; - } - - /* create a new port group with these ports */ - __parser_port_group_start(); - - p_current_port_group->name = strdup("_SRP_Targets_"); - p_current_port_group->use = strdup("Generated from ULP rules"); - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - __parser_add_guid_range_to_port_map( - &p_current_port_group->port_map, - range_arr, - range_len); - - /* add this port group to the destination - groups of the current match rule */ - cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list, - p_current_port_group); - - __parser_port_group_end(); - - } - break; - - case 112: - -/* Line 1455 of yacc.c */ -#line 905 "osm_qos_parser_y.y" - { - /* ipoib w/o any pkeys (default pkey) */ - uint64_t ** range_arr = - (uint64_t **)malloc(sizeof(uint64_t *)); - range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t)); - range_arr[0][0] = range_arr[0][1] = 0x7fff; - - /* - * Although we know that the default partition exists, - * we still need to validate it by checking that it has - * at least two full members. Otherwise IPoIB won't work. - */ - if (__validate_pkeys(range_arr, 1, TRUE)) - return 1; - - p_current_qos_match_rule->pkey_range_arr = range_arr; - p_current_qos_match_rule->pkey_range_len = 1; - - } - break; - - case 114: - -/* Line 1455 of yacc.c */ -#line 925 "osm_qos_parser_y.y" - { - /* ipoib with pkeys */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("IPoIB ULP rule doesn't have pkeys"); - return 1; - } - - /* get all the pkey ranges */ - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - /* - * Validate pkeys. - * For IPoIB pkeys the validation is strict. - * If some problem would be found, parsing will - * be aborted with a proper error messages. - */ - if (__validate_pkeys(range_arr, range_len, TRUE)) - return 1; - - p_current_qos_match_rule->pkey_range_arr = range_arr; - p_current_qos_match_rule->pkey_range_len = range_len; - - } - break; - - case 116: - -/* Line 1455 of yacc.c */ -#line 957 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 117: - -/* Line 1455 of yacc.c */ -#line 960 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 118: - -/* Line 1455 of yacc.c */ -#line 963 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 119: - -/* Line 1455 of yacc.c */ -#line 966 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 120: - -/* Line 1455 of yacc.c */ -#line 969 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 121: - -/* Line 1455 of yacc.c */ -#line 972 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 122: - -/* Line 1455 of yacc.c */ -#line 975 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 123: - -/* Line 1455 of yacc.c */ -#line 978 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 124: - -/* Line 1455 of yacc.c */ -#line 981 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 125: - -/* Line 1455 of yacc.c */ -#line 984 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 126: - -/* Line 1455 of yacc.c */ -#line 987 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 127: - -/* Line 1455 of yacc.c */ -#line 990 "osm_qos_parser_y.y" - { __parser_ulp_match_rule_start(); } - break; - - case 128: - -/* Line 1455 of yacc.c */ -#line 993 "osm_qos_parser_y.y" - { - /* get the SL for ULP rules */ - cl_list_iterator_t list_iterator; - uint64_t * p_tmp_num; - uint8_t sl; - - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_tmp_num = (uint64_t*)cl_list_obj(list_iterator); - if (*p_tmp_num > 15) - { - yyerror("illegal SL value"); - return 1; - } - - sl = (uint8_t)(*p_tmp_num); - free(p_tmp_num); - cl_list_remove_all(&tmp_parser_struct.num_list); - - p_current_qos_match_rule->p_qos_level = - &osm_qos_policy_simple_qos_levels[sl]; - p_current_qos_match_rule->qos_level_name = - strdup(osm_qos_policy_simple_qos_levels[sl].name); - - if (__parser_ulp_match_rule_end()) - return 1; - } - break; - - case 129: - -/* Line 1455 of yacc.c */ -#line 1032 "osm_qos_parser_y.y" - { - /* 'name' of 'port-group' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_port_group->name) - { - yyerror("port-group has multiple 'name' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_port_group->name = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 130: - -/* Line 1455 of yacc.c */ -#line 1055 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 131: - -/* Line 1455 of yacc.c */ -#line 1060 "osm_qos_parser_y.y" - { - /* 'use' of 'port-group' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_port_group->use) - { - yyerror("port-group has multiple 'use' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_port_group->use = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 132: - -/* Line 1455 of yacc.c */ -#line 1083 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 133: - -/* Line 1455 of yacc.c */ -#line 1088 "osm_qos_parser_y.y" - { - /* 'port-name' in 'port-group' - any num of instances */ - cl_list_iterator_t list_iterator; - osm_node_t * p_node; - osm_physp_t * p_physp; - unsigned port_num; - char * tmp_str; - char * port_str; - - /* parsing port name strings */ - for (list_iterator = cl_list_head(&tmp_parser_struct.str_list); - list_iterator != cl_list_end(&tmp_parser_struct.str_list); - list_iterator = cl_list_next(list_iterator)) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - { - /* last slash in port name string is a separator - between node name and port number */ - port_str = strrchr(tmp_str, '/'); - if (!port_str || (strlen(port_str) < 3) || - (port_str[1] != 'p' && port_str[1] != 'P')) { - yyerror("'%s' - illegal port name", - tmp_str); - free(tmp_str); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - if (!(port_num = strtoul(&port_str[2],NULL,0))) { - yyerror( - "'%s' - illegal port number in port name", - tmp_str); - free(tmp_str); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - /* separate node name from port number */ - port_str[0] = '\0'; - - if (st_lookup(p_qos_policy->p_node_hash, - (st_data_t)tmp_str, - (void *)&p_node)) - { - /* we found the node, now get the right port */ - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_physp) { - yyerror( - "'%s' - port number out of range in port name", - tmp_str); - free(tmp_str); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - /* we found the port, now add it to guid table */ - __parser_add_port_to_port_map(&p_current_port_group->port_map, - p_physp); - } - free(tmp_str); - } - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 134: - -/* Line 1455 of yacc.c */ -#line 1154 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 135: - -/* Line 1455 of yacc.c */ -#line 1159 "osm_qos_parser_y.y" - { - /* 'port-guid' in 'port-group' - any num of instances */ - /* list of guid ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - __parser_add_guid_range_to_port_map( - &p_current_port_group->port_map, - range_arr, - range_len); - } - } - break; - - case 136: - -/* Line 1455 of yacc.c */ -#line 1179 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 137: - -/* Line 1455 of yacc.c */ -#line 1184 "osm_qos_parser_y.y" - { - /* 'pkey' in 'port-group' - any num of instances */ - /* list of pkey ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - __parser_add_pkey_range_to_port_map( - &p_current_port_group->port_map, - range_arr, - range_len); - } - } - break; - - case 138: - -/* Line 1455 of yacc.c */ -#line 1204 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 139: - -/* Line 1455 of yacc.c */ -#line 1209 "osm_qos_parser_y.y" - { - /* 'partition' in 'port-group' - any num of instances */ - __parser_add_partition_list_to_port_map( - &p_current_port_group->port_map, - &tmp_parser_struct.str_list); - } - break; - - case 140: - -/* Line 1455 of yacc.c */ -#line 1217 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 141: - -/* Line 1455 of yacc.c */ -#line 1222 "osm_qos_parser_y.y" - { - /* 'node-type' in 'port-group' - any num of instances */ - } - break; - - case 142: - -/* Line 1455 of yacc.c */ -#line 1227 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 150: - -/* Line 1455 of yacc.c */ -#line 1243 "osm_qos_parser_y.y" - { - p_current_port_group->node_types |= - OSM_QOS_POLICY_NODE_TYPE_CA; - } - break; - - case 151: - -/* Line 1455 of yacc.c */ -#line 1249 "osm_qos_parser_y.y" - { - p_current_port_group->node_types |= - OSM_QOS_POLICY_NODE_TYPE_SWITCH; - } - break; - - case 152: - -/* Line 1455 of yacc.c */ -#line 1255 "osm_qos_parser_y.y" - { - p_current_port_group->node_types |= - OSM_QOS_POLICY_NODE_TYPE_ROUTER; - } - break; - - case 153: - -/* Line 1455 of yacc.c */ -#line 1261 "osm_qos_parser_y.y" - { - p_current_port_group->node_types |= - (OSM_QOS_POLICY_NODE_TYPE_CA | - OSM_QOS_POLICY_NODE_TYPE_SWITCH | - OSM_QOS_POLICY_NODE_TYPE_ROUTER); - } - break; - - case 154: - -/* Line 1455 of yacc.c */ -#line 1269 "osm_qos_parser_y.y" - { - osm_port_t * p_osm_port = - osm_get_port_by_guid(p_qos_policy->p_subn, - p_qos_policy->p_subn->sm_port_guid); - if (p_osm_port) - __parser_add_port_to_port_map( - &p_current_port_group->port_map, - p_osm_port->p_physp); - } - break; - - case 155: - -/* Line 1455 of yacc.c */ -#line 1291 "osm_qos_parser_y.y" - { - /* 'group' in 'vlarb-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_vlarb_scope->group_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 156: - -/* Line 1455 of yacc.c */ -#line 1308 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 157: - -/* Line 1455 of yacc.c */ -#line 1313 "osm_qos_parser_y.y" - { - /* 'across' in 'vlarb-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_vlarb_scope->across_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 158: - -/* Line 1455 of yacc.c */ -#line 1330 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 159: - -/* Line 1455 of yacc.c */ -#line 1335 "osm_qos_parser_y.y" - { - /* 'vl-high-limit' in 'vlarb-scope' - one instance of one number */ - cl_list_iterator_t list_iterator; - uint64_t * p_tmp_num; - - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_tmp_num = (uint64_t*)cl_list_obj(list_iterator); - if (p_tmp_num) - { - p_current_vlarb_scope->vl_high_limit = (uint32_t)(*p_tmp_num); - p_current_vlarb_scope->vl_high_limit_set = TRUE; - free(p_tmp_num); - } - - cl_list_remove_all(&tmp_parser_struct.num_list); - } - break; - - case 160: - -/* Line 1455 of yacc.c */ -#line 1353 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 161: - -/* Line 1455 of yacc.c */ -#line 1358 "osm_qos_parser_y.y" - { - /* 'vlarb-high' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */ - cl_list_iterator_t list_iterator; - uint64_t * num_pair; - - list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) ) - { - num_pair = (uint64_t*)cl_list_obj(list_iterator); - if (num_pair) - cl_list_insert_tail(&p_current_vlarb_scope->vlarb_high_list,num_pair); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - } - break; - - case 162: - -/* Line 1455 of yacc.c */ -#line 1375 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 163: - -/* Line 1455 of yacc.c */ -#line 1380 "osm_qos_parser_y.y" - { - /* 'vlarb-low' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */ - cl_list_iterator_t list_iterator; - uint64_t * num_pair; - - list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) ) - { - num_pair = (uint64_t*)cl_list_obj(list_iterator); - if (num_pair) - cl_list_insert_tail(&p_current_vlarb_scope->vlarb_low_list,num_pair); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - } - break; - - case 164: - -/* Line 1455 of yacc.c */ -#line 1397 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 165: - -/* Line 1455 of yacc.c */ -#line 1413 "osm_qos_parser_y.y" - { - /* 'group' in 'sl2vl-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_sl2vl_scope->group_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 166: - -/* Line 1455 of yacc.c */ -#line 1430 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 167: - -/* Line 1455 of yacc.c */ -#line 1435 "osm_qos_parser_y.y" - { - /* 'across' in 'sl2vl-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) { - cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str); - cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,strdup(tmp_str)); - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 168: - -/* Line 1455 of yacc.c */ -#line 1454 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 169: - -/* Line 1455 of yacc.c */ -#line 1459 "osm_qos_parser_y.y" - { - /* 'across-from' in 'sl2vl-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 170: - -/* Line 1455 of yacc.c */ -#line 1476 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 171: - -/* Line 1455 of yacc.c */ -#line 1481 "osm_qos_parser_y.y" - { - /* 'across-to' in 'sl2vl-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) { - cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,tmp_str); - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 172: - -/* Line 1455 of yacc.c */ -#line 1499 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 173: - -/* Line 1455 of yacc.c */ -#line 1504 "osm_qos_parser_y.y" - { - /* 'from' in 'sl2vl-scope' - any num of instances */ - } - break; - - case 174: - -/* Line 1455 of yacc.c */ -#line 1509 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 175: - -/* Line 1455 of yacc.c */ -#line 1514 "osm_qos_parser_y.y" - { - /* 'to' in 'sl2vl-scope' - any num of instances */ - } - break; - - case 176: - -/* Line 1455 of yacc.c */ -#line 1519 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 179: - -/* Line 1455 of yacc.c */ -#line 1528 "osm_qos_parser_y.y" - { - int i; - for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++) - p_current_sl2vl_scope->from[i] = TRUE; - } - break; - - case 182: - -/* Line 1455 of yacc.c */ -#line 1539 "osm_qos_parser_y.y" - { - int i; - for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++) - p_current_sl2vl_scope->to[i] = TRUE; - } - break; - - case 183: - -/* Line 1455 of yacc.c */ -#line 1546 "osm_qos_parser_y.y" - { - int i; - cl_list_iterator_t list_iterator; - uint64_t * num_pair; - uint8_t num1, num2; - - list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) ) - { - num_pair = (uint64_t*)cl_list_obj(list_iterator); - if (num_pair) - { - if ( (int64_t)num_pair[0] < 0 || - num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH ) - { - yyerror("port number out of range 'from' list"); - free(num_pair); - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - return 1; - } - num1 = (uint8_t)num_pair[0]; - num2 = (uint8_t)num_pair[1]; - free(num_pair); - for (i = num1; i <= num2; i++) - p_current_sl2vl_scope->from[i] = TRUE; - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - } - break; - - case 184: - -/* Line 1455 of yacc.c */ -#line 1578 "osm_qos_parser_y.y" - { - int i; - cl_list_iterator_t list_iterator; - uint64_t * num_pair; - uint8_t num1, num2; - - list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) ) - { - num_pair = (uint64_t*)cl_list_obj(list_iterator); - if (num_pair) - { - if ( (int64_t)num_pair[0] < 0 || - num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH ) - { - yyerror("port number out of range 'to' list"); - free(num_pair); - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - return 1; - } - num1 = (uint8_t)num_pair[0]; - num2 = (uint8_t)num_pair[1]; - free(num_pair); - for (i = num1; i <= num2; i++) - p_current_sl2vl_scope->to[i] = TRUE; - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - } - break; - - case 185: - -/* Line 1455 of yacc.c */ -#line 1611 "osm_qos_parser_y.y" - { - /* 'sl2vl-table' - one instance of exactly - OSM_QOS_POLICY_SL2VL_TABLE_LEN numbers */ - cl_list_iterator_t list_iterator; - uint64_t num; - uint64_t * p_num; - int i = 0; - - if (p_current_sl2vl_scope->sl2vl_table_set) - { - yyerror("sl2vl-scope has more than one sl2vl-table"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - - if (cl_list_count(&tmp_parser_struct.num_list) != OSM_QOS_POLICY_SL2VL_TABLE_LEN) - { - yyerror("wrong number of values in 'sl2vl-table' (should be 16)"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_list) ) - { - p_num = (uint64_t*)cl_list_obj(list_iterator); - num = *p_num; - free(p_num); - if (num >= OSM_QOS_POLICY_MAX_VL_NUM) - { - yyerror("wrong VL value in 'sl2vl-table' (should be 0 to 15)"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - - p_current_sl2vl_scope->sl2vl_table[i++] = (uint8_t)num; - list_iterator = cl_list_next(list_iterator); - } - p_current_sl2vl_scope->sl2vl_table_set = TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - break; - - case 186: - -/* Line 1455 of yacc.c */ -#line 1654 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 187: - -/* Line 1455 of yacc.c */ -#line 1671 "osm_qos_parser_y.y" - { - /* 'name' of 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_qos_level->name) - { - yyerror("qos-level has multiple 'name' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_qos_level->name = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 188: - -/* Line 1455 of yacc.c */ -#line 1694 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 189: - -/* Line 1455 of yacc.c */ -#line 1699 "osm_qos_parser_y.y" - { - /* 'use' of 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_qos_level->use) - { - yyerror("qos-level has multiple 'use' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_qos_level->use = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 190: - -/* Line 1455 of yacc.c */ -#line 1722 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 191: - -/* Line 1455 of yacc.c */ -#line 1727 "osm_qos_parser_y.y" - { - /* 'sl' in 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - uint64_t * p_num; - - if (p_current_qos_level->sl_set) - { - yyerror("'qos-level' has multiple 'sl' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_num = (uint64_t*)cl_list_obj(list_iterator); - p_current_qos_level->sl = (uint8_t)(*p_num); - free(p_num); - p_current_qos_level->sl_set = TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - break; - - case 192: - -/* Line 1455 of yacc.c */ -#line 1747 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 193: - -/* Line 1455 of yacc.c */ -#line 1752 "osm_qos_parser_y.y" - { - /* 'mtu-limit' in 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - uint64_t * p_num; - - if (p_current_qos_level->mtu_limit_set) - { - yyerror("'qos-level' has multiple 'mtu-limit' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_num = (uint64_t*)cl_list_obj(list_iterator); - p_current_qos_level->mtu_limit = (uint8_t)(*p_num); - free(p_num); - p_current_qos_level->mtu_limit_set = TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - break; - - case 194: - -/* Line 1455 of yacc.c */ -#line 1772 "osm_qos_parser_y.y" - { - /* 'mtu-limit' in 'qos-level' - one instance */ - RESET_BUFFER; - } - break; - - case 195: - -/* Line 1455 of yacc.c */ -#line 1778 "osm_qos_parser_y.y" - { - /* 'rate-limit' in 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - uint64_t * p_num; - - if (p_current_qos_level->rate_limit_set) - { - yyerror("'qos-level' has multiple 'rate-limit' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_num = (uint64_t*)cl_list_obj(list_iterator); - p_current_qos_level->rate_limit = (uint8_t)(*p_num); - free(p_num); - p_current_qos_level->rate_limit_set = TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - break; - - case 196: - -/* Line 1455 of yacc.c */ -#line 1798 "osm_qos_parser_y.y" - { - /* 'rate-limit' in 'qos-level' - one instance */ - RESET_BUFFER; - } - break; - - case 197: - -/* Line 1455 of yacc.c */ -#line 1804 "osm_qos_parser_y.y" - { - /* 'packet-life' in 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - uint64_t * p_num; - - if (p_current_qos_level->pkt_life_set) - { - yyerror("'qos-level' has multiple 'packet-life' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_num = (uint64_t*)cl_list_obj(list_iterator); - p_current_qos_level->pkt_life = (uint8_t)(*p_num); - free(p_num); - p_current_qos_level->pkt_life_set= TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - break; - - case 198: - -/* Line 1455 of yacc.c */ -#line 1824 "osm_qos_parser_y.y" - { - /* 'packet-life' in 'qos-level' - one instance */ - RESET_BUFFER; - } - break; - - case 199: - -/* Line 1455 of yacc.c */ -#line 1830 "osm_qos_parser_y.y" - { - /* 'path-bits' in 'qos-level' - any num of instances */ - /* list of path bit ranges */ - - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_level->path_bits_range_len ) - { - p_current_qos_level->path_bits_range_arr = range_arr; - p_current_qos_level->path_bits_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_level->path_bits_range_arr, - p_current_qos_level->path_bits_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_level->path_bits_range_arr = new_range_arr; - p_current_qos_level->path_bits_range_len = new_range_len; - } - } - } - break; - - case 200: - -/* Line 1455 of yacc.c */ -#line 1865 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 201: - -/* Line 1455 of yacc.c */ -#line 1870 "osm_qos_parser_y.y" - { - /* 'pkey' in 'qos-level' - num of instances of list of ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_level->pkey_range_len ) - { - p_current_qos_level->pkey_range_arr = range_arr; - p_current_qos_level->pkey_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_level->pkey_range_arr, - p_current_qos_level->pkey_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_level->pkey_range_arr = new_range_arr; - p_current_qos_level->pkey_range_len = new_range_len; - } - } - } - break; - - case 202: - -/* Line 1455 of yacc.c */ -#line 1903 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 203: - -/* Line 1455 of yacc.c */ -#line 1920 "osm_qos_parser_y.y" - { - /* 'use' of 'qos-match-rule' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_qos_match_rule->use) - { - yyerror("'qos-match-rule' has multiple 'use' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_qos_match_rule->use = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 204: - -/* Line 1455 of yacc.c */ -#line 1943 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 205: - -/* Line 1455 of yacc.c */ -#line 1948 "osm_qos_parser_y.y" - { - /* 'qos-class' in 'qos-match-rule' - num of instances of list of ranges */ - /* list of class ranges (QoS Class is 12-bit value) */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_match_rule->qos_class_range_len ) - { - p_current_qos_match_rule->qos_class_range_arr = range_arr; - p_current_qos_match_rule->qos_class_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_match_rule->qos_class_range_arr, - p_current_qos_match_rule->qos_class_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_match_rule->qos_class_range_arr = new_range_arr; - p_current_qos_match_rule->qos_class_range_len = new_range_len; - } - } - } - break; - - case 206: - -/* Line 1455 of yacc.c */ -#line 1982 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 207: - -/* Line 1455 of yacc.c */ -#line 1987 "osm_qos_parser_y.y" - { - /* 'source' in 'qos-match-rule' - text */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_qos_match_rule->source_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 208: - -/* Line 1455 of yacc.c */ -#line 2004 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 209: - -/* Line 1455 of yacc.c */ -#line 2009 "osm_qos_parser_y.y" - { - /* 'destination' in 'qos-match-rule' - text */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_qos_match_rule->destination_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 210: - -/* Line 1455 of yacc.c */ -#line 2026 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 211: - -/* Line 1455 of yacc.c */ -#line 2031 "osm_qos_parser_y.y" - { - /* 'qos-level-name' in 'qos-match-rule' - single string */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_qos_match_rule->qos_level_name) - { - yyerror("qos-match-rule has multiple 'qos-level-name' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_qos_match_rule->qos_level_name = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - break; - - case 212: - -/* Line 1455 of yacc.c */ -#line 2054 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 213: - -/* Line 1455 of yacc.c */ -#line 2059 "osm_qos_parser_y.y" - { - /* 'service-id' in 'qos-match-rule' - num of instances of list of ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_match_rule->service_id_range_len ) - { - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_match_rule->service_id_range_arr, - p_current_qos_match_rule->service_id_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_match_rule->service_id_range_arr = new_range_arr; - p_current_qos_match_rule->service_id_range_len = new_range_len; - } - } - } - break; - - case 214: - -/* Line 1455 of yacc.c */ -#line 2092 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 215: - -/* Line 1455 of yacc.c */ -#line 2097 "osm_qos_parser_y.y" - { - /* 'pkey' in 'qos-match-rule' - num of instances of list of ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_match_rule->pkey_range_len ) - { - p_current_qos_match_rule->pkey_range_arr = range_arr; - p_current_qos_match_rule->pkey_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_match_rule->pkey_range_arr, - p_current_qos_match_rule->pkey_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_match_rule->pkey_range_arr = new_range_arr; - p_current_qos_match_rule->pkey_range_len = new_range_len; - } - } - } - break; - - case 216: - -/* Line 1455 of yacc.c */ -#line 2130 "osm_qos_parser_y.y" - { - RESET_BUFFER; - } - break; - - case 217: - -/* Line 1455 of yacc.c */ -#line 2141 "osm_qos_parser_y.y" - { - cl_list_insert_tail(&tmp_parser_struct.str_list, - strdup(__parser_strip_white(tmp_parser_struct.str))); - tmp_parser_struct.str[0] = '\0'; - } - break; - - case 220: - -/* Line 1455 of yacc.c */ -#line 2152 "osm_qos_parser_y.y" - { - strcat(tmp_parser_struct.str,(yyvsp[(1) - (1)])); - free((yyvsp[(1) - (1)])); - } - break; - - case 226: - -/* Line 1455 of yacc.c */ -#line 2172 "osm_qos_parser_y.y" - { - uint64_t * p_num = (uint64_t*)malloc(sizeof(uint64_t)); - __parser_str2uint64(p_num,(yyvsp[(1) - (1)])); - free((yyvsp[(1) - (1)])); - cl_list_insert_tail(&tmp_parser_struct.num_list, p_num); - } - break; - - case 227: - -/* Line 1455 of yacc.c */ -#line 2180 "osm_qos_parser_y.y" - { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - break; - - case 228: - -/* Line 1455 of yacc.c */ -#line 2186 "osm_qos_parser_y.y" - { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - break; - - case 229: - -/* Line 1455 of yacc.c */ -#line 2194 "osm_qos_parser_y.y" - { - __parser_str2uint64(&tmp_parser_struct.num_pair[0],(yyvsp[(1) - (1)])); - free((yyvsp[(1) - (1)])); - } - break; - - case 230: - -/* Line 1455 of yacc.c */ -#line 2200 "osm_qos_parser_y.y" - { - __parser_str2uint64(&tmp_parser_struct.num_pair[1],(yyvsp[(1) - (1)])); - free((yyvsp[(1) - (1)])); - } - break; - - case 232: - -/* Line 1455 of yacc.c */ -#line 2209 "osm_qos_parser_y.y" - { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - break; - - case 233: - -/* Line 1455 of yacc.c */ -#line 2215 "osm_qos_parser_y.y" - { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) { - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - } - else { - num_pair[1] = tmp_parser_struct.num_pair[0]; - num_pair[0] = tmp_parser_struct.num_pair[1]; - } - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - break; - - case 234: - -/* Line 1455 of yacc.c */ -#line 2227 "osm_qos_parser_y.y" - { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) { - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - } - else { - num_pair[1] = tmp_parser_struct.num_pair[0]; - num_pair[0] = tmp_parser_struct.num_pair[1]; - } - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - break; - - case 235: - -/* Line 1455 of yacc.c */ -#line 2239 "osm_qos_parser_y.y" - { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - break; - - case 236: - -/* Line 1455 of yacc.c */ -#line 2247 "osm_qos_parser_y.y" - { - __parser_str2uint64(&tmp_parser_struct.num_pair[0],(yyvsp[(1) - (1)])); - __parser_str2uint64(&tmp_parser_struct.num_pair[1],(yyvsp[(1) - (1)])); - free((yyvsp[(1) - (1)])); - } - break; - - case 237: - -/* Line 1455 of yacc.c */ -#line 2254 "osm_qos_parser_y.y" - { - __parser_str2uint64(&tmp_parser_struct.num_pair[0],(yyvsp[(1) - (1)])); - free((yyvsp[(1) - (1)])); - } - break; - - case 238: - -/* Line 1455 of yacc.c */ -#line 2260 "osm_qos_parser_y.y" - { - __parser_str2uint64(&tmp_parser_struct.num_pair[1],(yyvsp[(1) - (1)])); - free((yyvsp[(1) - (1)])); - } - break; - - - -/* Line 1455 of yacc.c */ -#line 4167 "osm_qos_parser_y.c" - default: break; - } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - *++yyvsp = yylval; - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#if !defined(yyoverflow) || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} - - - -/* Line 1675 of yacc.c */ -#line 2266 "osm_qos_parser_y.y" - - -/*************************************************** - ***************************************************/ - -int osm_qos_parse_policy_file(IN osm_subn_t * p_subn) -{ - int res = 0; - static boolean_t first_time = TRUE; - p_qos_parser_osm_log = &p_subn->p_osm->log; - - OSM_LOG_ENTER(p_qos_parser_osm_log); - - osm_qos_policy_destroy(p_subn->p_qos_policy); - p_subn->p_qos_policy = NULL; - - yyin = fopen (p_subn->opt.qos_policy_file, "r"); - if (!yyin) - { - if (strcmp(p_subn->opt.qos_policy_file,OSM_DEFAULT_QOS_POLICY_FILE)) { - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC01: " - "Failed opening QoS policy file %s - %s\n", - p_subn->opt.qos_policy_file, strerror(errno)); - res = 1; - } - else - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_VERBOSE, - "QoS policy file not found (%s)\n", - p_subn->opt.qos_policy_file); - - goto Exit; - } - - if (first_time) - { - first_time = FALSE; - __setup_simple_qos_levels(); - __setup_ulp_match_rules(); - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_INFO, - "Loading QoS policy file (%s)\n", - p_subn->opt.qos_policy_file); - } - else - /* - * ULP match rules list was emptied at the end of - * previous parsing iteration. - * What's left is to clear simple QoS levels. - */ - __clear_simple_qos_levels(); - - column_num = 1; - line_num = 1; - - p_subn->p_qos_policy = osm_qos_policy_create(p_subn); - - __parser_tmp_struct_init(); - p_qos_policy = p_subn->p_qos_policy; - - res = yyparse(); - - __parser_tmp_struct_destroy(); - - if (res != 0) - { - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC03: " - "Failed parsing QoS policy file (%s)\n", - p_subn->opt.qos_policy_file); - osm_qos_policy_destroy(p_subn->p_qos_policy); - p_subn->p_qos_policy = NULL; - res = 1; - goto Exit; - } - - /* add generated ULP match rules to the usual match rules */ - __process_ulp_match_rules(); - - if (osm_qos_policy_validate(p_subn->p_qos_policy,p_qos_parser_osm_log)) - { - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC04: " - "Error(s) in QoS policy file (%s)\n", - p_subn->opt.qos_policy_file); - fprintf(stderr, "Error(s) in QoS policy file (%s)\n", - p_subn->opt.qos_policy_file); - osm_qos_policy_destroy(p_subn->p_qos_policy); - p_subn->p_qos_policy = NULL; - res = 1; - goto Exit; - } - - Exit: - if (yyin) - fclose(yyin); - OSM_LOG_EXIT(p_qos_parser_osm_log); - return res; -} - -/*************************************************** - ***************************************************/ - -int yywrap() -{ - return(1); -} - -/*************************************************** - ***************************************************/ - -static void yyerror(const char *format, ...) -{ - char s[256]; - va_list pvar; - - OSM_LOG_ENTER(p_qos_parser_osm_log); - - va_start(pvar, format); - vsnprintf(s, sizeof(s), format, pvar); - va_end(pvar); - - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC05: " - "Syntax error (line %d:%d): %s\n", - line_num, column_num, s); - fprintf(stderr, "Error in QoS Policy File (line %d:%d): %s.\n", - line_num, column_num, s); - OSM_LOG_EXIT(p_qos_parser_osm_log); -} - -/*************************************************** - ***************************************************/ - -static char * __parser_strip_white(char * str) -{ - char *p; - - while (isspace(*str)) - str++; - if (!*str) - return str; - p = str + strlen(str) - 1; - while (isspace(*p)) - *p-- = '\0'; - - return str; -} - -/*************************************************** - ***************************************************/ - -static void __parser_str2uint64(uint64_t * p_val, char * str) -{ - *p_val = strtoull(str, NULL, 0); -} - -/*************************************************** - ***************************************************/ - -static void __parser_port_group_start() -{ - p_current_port_group = osm_qos_policy_port_group_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_port_group_end() -{ - if(!p_current_port_group->name) - { - yyerror("port-group validation failed - no port group name specified"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->port_groups, - p_current_port_group); - p_current_port_group = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_vlarb_scope_start() -{ - p_current_vlarb_scope = osm_qos_policy_vlarb_scope_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_vlarb_scope_end() -{ - if ( !cl_list_count(&p_current_vlarb_scope->group_list) && - !cl_list_count(&p_current_vlarb_scope->across_list) ) - { - yyerror("vlarb-scope validation failed - no port groups specified by 'group' or by 'across'"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->vlarb_tables, - p_current_vlarb_scope); - p_current_vlarb_scope = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_sl2vl_scope_start() -{ - p_current_sl2vl_scope = osm_qos_policy_sl2vl_scope_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_sl2vl_scope_end() -{ - if (!p_current_sl2vl_scope->sl2vl_table_set) - { - yyerror("sl2vl-scope validation failed - no sl2vl table specified"); - return -1; - } - if ( !cl_list_count(&p_current_sl2vl_scope->group_list) && - !cl_list_count(&p_current_sl2vl_scope->across_to_list) && - !cl_list_count(&p_current_sl2vl_scope->across_from_list) ) - { - yyerror("sl2vl-scope validation failed - no port groups specified by 'group', 'across-to' or 'across-from'"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->sl2vl_tables, - p_current_sl2vl_scope); - p_current_sl2vl_scope = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_qos_level_start() -{ - p_current_qos_level = osm_qos_policy_qos_level_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_qos_level_end() -{ - if (!p_current_qos_level->sl_set) - { - yyerror("qos-level validation failed - no 'sl' specified"); - return -1; - } - if (!p_current_qos_level->name) - { - yyerror("qos-level validation failed - no 'name' specified"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->qos_levels, - p_current_qos_level); - p_current_qos_level = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_match_rule_start() -{ - p_current_qos_match_rule = osm_qos_policy_match_rule_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_match_rule_end() -{ - if (!p_current_qos_match_rule->qos_level_name) - { - yyerror("match-rule validation failed - no 'qos-level-name' specified"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->qos_match_rules, - p_current_qos_match_rule); - p_current_qos_match_rule = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_ulp_match_rule_start() -{ - p_current_qos_match_rule = osm_qos_policy_match_rule_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_ulp_match_rule_end() -{ - CL_ASSERT(p_current_qos_match_rule->p_qos_level); - cl_list_insert_tail(&__ulp_match_rules, - p_current_qos_match_rule); - p_current_qos_match_rule = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_tmp_struct_init() -{ - tmp_parser_struct.str[0] = '\0'; - cl_list_construct(&tmp_parser_struct.str_list); - cl_list_init(&tmp_parser_struct.str_list, 10); - cl_list_construct(&tmp_parser_struct.num_list); - cl_list_init(&tmp_parser_struct.num_list, 10); - cl_list_construct(&tmp_parser_struct.num_pair_list); - cl_list_init(&tmp_parser_struct.num_pair_list, 10); -} - -/*************************************************** - ***************************************************/ - -/* - * Do NOT free objects from the temp struct. - * Either they are inserted into the parse tree data - * structure, or they are already freed when copying - * their values to the parse tree data structure. - */ -static void __parser_tmp_struct_reset() -{ - tmp_parser_struct.str[0] = '\0'; - cl_list_remove_all(&tmp_parser_struct.str_list); - cl_list_remove_all(&tmp_parser_struct.num_list); - cl_list_remove_all(&tmp_parser_struct.num_pair_list); -} - -/*************************************************** - ***************************************************/ - -static void __parser_tmp_struct_destroy() -{ - __parser_tmp_struct_reset(); - cl_list_destroy(&tmp_parser_struct.str_list); - cl_list_destroy(&tmp_parser_struct.num_list); - cl_list_destroy(&tmp_parser_struct.num_pair_list); -} - -/*************************************************** - ***************************************************/ - -#define __SIMPLE_QOS_LEVEL_NAME "SimpleQoSLevel_SL" -#define __SIMPLE_QOS_LEVEL_DEFAULT_NAME "SimpleQoSLevel_DEFAULT" - -static void __setup_simple_qos_levels() -{ - uint8_t i; - char tmp_buf[30]; - memset(osm_qos_policy_simple_qos_levels, 0, - sizeof(osm_qos_policy_simple_qos_levels)); - for (i = 0; i < 16; i++) - { - osm_qos_policy_simple_qos_levels[i].sl = i; - osm_qos_policy_simple_qos_levels[i].sl_set = TRUE; - sprintf(tmp_buf, "%s%u", __SIMPLE_QOS_LEVEL_NAME, i); - osm_qos_policy_simple_qos_levels[i].name = strdup(tmp_buf); - } - - memset(&__default_simple_qos_level, 0, - sizeof(__default_simple_qos_level)); - __default_simple_qos_level.name = - strdup(__SIMPLE_QOS_LEVEL_DEFAULT_NAME); -} - -/*************************************************** - ***************************************************/ - -static void __clear_simple_qos_levels() -{ - /* - * Simple QoS levels are static. - * What's left is to invalidate default simple QoS level. - */ - __default_simple_qos_level.sl_set = FALSE; -} - -/*************************************************** - ***************************************************/ - -static void __setup_ulp_match_rules() -{ - cl_list_construct(&__ulp_match_rules); - cl_list_init(&__ulp_match_rules, 10); -} - -/*************************************************** - ***************************************************/ - -static void __process_ulp_match_rules() -{ - cl_list_iterator_t list_iterator; - osm_qos_match_rule_t *p_qos_match_rule = NULL; - - list_iterator = cl_list_head(&__ulp_match_rules); - while (list_iterator != cl_list_end(&__ulp_match_rules)) - { - p_qos_match_rule = (osm_qos_match_rule_t *) cl_list_obj(list_iterator); - if (p_qos_match_rule) - cl_list_insert_tail(&p_qos_policy->qos_match_rules, - p_qos_match_rule); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&__ulp_match_rules); -} - -/*************************************************** - ***************************************************/ - -static int __cdecl __cmp_num_range(const void * p1, const void * p2) -{ - uint64_t * pair1 = *((uint64_t **)p1); - uint64_t * pair2 = *((uint64_t **)p2); - - if (pair1[0] < pair2[0]) - return -1; - if (pair1[0] > pair2[0]) - return 1; - - if (pair1[1] < pair2[1]) - return -1; - if (pair1[1] > pair2[1]) - return 1; - - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __sort_reduce_rangearr( - uint64_t ** arr, - unsigned arr_len, - uint64_t ** * p_res_arr, - unsigned * p_res_arr_len ) -{ - unsigned i = 0; - unsigned j = 0; - unsigned last_valid_ind = 0; - unsigned valid_cnt = 0; - uint64_t ** res_arr; - boolean_t * is_valid_arr; - - *p_res_arr = NULL; - *p_res_arr_len = 0; - - qsort(arr, arr_len, sizeof(uint64_t*), __cmp_num_range); - - is_valid_arr = (boolean_t *)malloc(arr_len * sizeof(boolean_t)); - is_valid_arr[last_valid_ind] = TRUE; - valid_cnt++; - for (i = 1; i < arr_len; i++) - { - if (arr[i][0] <= arr[last_valid_ind][1]) - { - if (arr[i][1] > arr[last_valid_ind][1]) - arr[last_valid_ind][1] = arr[i][1]; - free(arr[i]); - arr[i] = NULL; - is_valid_arr[i] = FALSE; - } - else if ((arr[i][0] - 1) == arr[last_valid_ind][1]) - { - arr[last_valid_ind][1] = arr[i][1]; - free(arr[i]); - arr[i] = NULL; - is_valid_arr[i] = FALSE; - } - else - { - is_valid_arr[i] = TRUE; - last_valid_ind = i; - valid_cnt++; - } - } - - res_arr = (uint64_t **)malloc(valid_cnt * sizeof(uint64_t *)); - for (i = 0; i < arr_len; i++) - { - if (is_valid_arr[i]) - res_arr[j++] = arr[i]; - } - free(is_valid_arr); - free(arr); - - *p_res_arr = res_arr; - *p_res_arr_len = valid_cnt; -} - -/*************************************************** - ***************************************************/ - -static void __pkey_rangelist2rangearr( - cl_list_t * p_list, - uint64_t ** * p_arr, - unsigned * p_arr_len) -{ - uint64_t tmp_pkey; - uint64_t * p_pkeys; - cl_list_iterator_t list_iterator; - - list_iterator= cl_list_head(p_list); - while( list_iterator != cl_list_end(p_list) ) - { - p_pkeys = (uint64_t *)cl_list_obj(list_iterator); - p_pkeys[0] &= 0x7fff; - p_pkeys[1] &= 0x7fff; - if (p_pkeys[0] > p_pkeys[1]) - { - tmp_pkey = p_pkeys[1]; - p_pkeys[1] = p_pkeys[0]; - p_pkeys[0] = tmp_pkey; - } - list_iterator = cl_list_next(list_iterator); - } - - __rangelist2rangearr(p_list, p_arr, p_arr_len); -} - -/*************************************************** - ***************************************************/ - -static void __rangelist2rangearr( - cl_list_t * p_list, - uint64_t ** * p_arr, - unsigned * p_arr_len) -{ - cl_list_iterator_t list_iterator; - unsigned len = cl_list_count(p_list); - unsigned i = 0; - uint64_t ** tmp_arr; - uint64_t ** res_arr = NULL; - unsigned res_arr_len = 0; - - tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *)); - - list_iterator = cl_list_head(p_list); - while( list_iterator != cl_list_end(p_list) ) - { - tmp_arr[i++] = (uint64_t *)cl_list_obj(list_iterator); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(p_list); - - __sort_reduce_rangearr( tmp_arr, - len, - &res_arr, - &res_arr_len ); - *p_arr = res_arr; - *p_arr_len = res_arr_len; -} - -/*************************************************** - ***************************************************/ - -static void __merge_rangearr( - uint64_t ** range_arr_1, - unsigned range_len_1, - uint64_t ** range_arr_2, - unsigned range_len_2, - uint64_t ** * p_arr, - unsigned * p_arr_len ) -{ - unsigned i = 0; - unsigned j = 0; - unsigned len = range_len_1 + range_len_2; - uint64_t ** tmp_arr; - uint64_t ** res_arr = NULL; - unsigned res_arr_len = 0; - - *p_arr = NULL; - *p_arr_len = 0; - - tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *)); - - for (i = 0; i < range_len_1; i++) - tmp_arr[j++] = range_arr_1[i]; - for (i = 0; i < range_len_2; i++) - tmp_arr[j++] = range_arr_2[i]; - free(range_arr_1); - free(range_arr_2); - - __sort_reduce_rangearr( tmp_arr, - len, - &res_arr, - &res_arr_len ); - *p_arr = res_arr; - *p_arr_len = res_arr_len; -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_port_to_port_map( - cl_qmap_t * p_map, - osm_physp_t * p_physp) -{ - if (cl_qmap_get(p_map, cl_ntoh64(osm_physp_get_port_guid(p_physp))) == - cl_qmap_end(p_map)) - { - osm_qos_port_t * p_port = osm_qos_policy_port_create(p_physp); - if (p_port) - cl_qmap_insert(p_map, - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - &p_port->map_item); - } -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_guid_range_to_port_map( - cl_qmap_t * p_map, - uint64_t ** range_arr, - unsigned range_len) -{ - unsigned i; - uint64_t guid_ho; - osm_port_t * p_osm_port; - - if (!range_arr || !range_len) - return; - - for (i = 0; i < range_len; i++) { - for (guid_ho = range_arr[i][0]; guid_ho <= range_arr[i][1]; guid_ho++) { - p_osm_port = - osm_get_port_by_guid(p_qos_policy->p_subn, cl_hton64(guid_ho)); - if (p_osm_port) - __parser_add_port_to_port_map(p_map, p_osm_port->p_physp); - } - free(range_arr[i]); - } - free(range_arr); -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_pkey_range_to_port_map( - cl_qmap_t * p_map, - uint64_t ** range_arr, - unsigned range_len) -{ - unsigned i; - uint64_t pkey_64; - ib_net16_t pkey; - osm_prtn_t * p_prtn; - - if (!range_arr || !range_len) - return; - - for (i = 0; i < range_len; i++) { - for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) { - pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff)); - p_prtn = (osm_prtn_t *) - cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey); - if (p_prtn != (osm_prtn_t *)cl_qmap_end( - &p_qos_policy->p_subn->prtn_pkey_tbl)) { - __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl); - __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl); - } - } - free(range_arr[i]); - } - free(range_arr); -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_partition_list_to_port_map( - cl_qmap_t * p_map, - cl_list_t * p_list) -{ - cl_list_iterator_t list_iterator; - char * tmp_str; - osm_prtn_t * p_prtn; - - /* extract all the ports from the partition - to the port map of this port group */ - list_iterator = cl_list_head(p_list); - while(list_iterator != cl_list_end(p_list)) { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) { - p_prtn = osm_prtn_find_by_name(p_qos_policy->p_subn, tmp_str); - if (p_prtn) { - __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl); - __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl); - } - free(tmp_str); - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(p_list); -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_map_to_port_map( - cl_qmap_t * p_dmap, - cl_map_t * p_smap) -{ - cl_map_iterator_t map_iterator; - osm_physp_t * p_physp; - - if (!p_dmap || !p_smap) - return; - - map_iterator = cl_map_head(p_smap); - while (map_iterator != cl_map_end(p_smap)) { - p_physp = (osm_physp_t*)cl_map_obj(map_iterator); - __parser_add_port_to_port_map(p_dmap, p_physp); - map_iterator = cl_map_next(map_iterator); - } -} - -/*************************************************** - ***************************************************/ - -static int __validate_pkeys( uint64_t ** range_arr, - unsigned range_len, - boolean_t is_ipoib) -{ - unsigned i; - uint64_t pkey_64; - ib_net16_t pkey; - osm_prtn_t * p_prtn; - - if (!range_arr || !range_len) - return 0; - - for (i = 0; i < range_len; i++) { - for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) { - pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff)); - p_prtn = (osm_prtn_t *) - cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey); - - if (p_prtn == (osm_prtn_t *)cl_qmap_end( - &p_qos_policy->p_subn->prtn_pkey_tbl)) - p_prtn = NULL; - - if (is_ipoib) { - /* - * Be very strict for IPoIB partition: - * - the partition for the pkey have to exist - * - it has to have at least 2 full members - */ - if (!p_prtn) { - yyerror("IPoIB partition, pkey 0x%04X - " - "partition doesn't exist", - cl_ntoh16(pkey)); - return 1; - } - else if (cl_map_count(&p_prtn->full_guid_tbl) < 2) { - yyerror("IPoIB partition, pkey 0x%04X - " - "partition has less than two full members", - cl_ntoh16(pkey)); - return 1; - } - } - else if (!p_prtn) { - /* - * For non-IPoIB pkey we just want to check that - * the relevant partition exists. - * And even if it doesn't, don't exit - just print - * error message and continue. - */ - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC02: " - "pkey 0x%04X - partition doesn't exist", - cl_ntoh16(pkey)); - } - } - } - return 0; -} - -/*************************************************** - ***************************************************/ - diff --git a/branches/opensm_3/user/opensm/osm_qos_parser_y.h b/branches/opensm_3/user/opensm/osm_qos_parser_y.h deleted file mode 100644 index ed19e9a0..00000000 --- a/branches/opensm_3/user/opensm/osm_qos_parser_y.h +++ /dev/null @@ -1,208 +0,0 @@ - -/* A Bison parser, made by GNU Bison 2.4.1. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TK_NUMBER = 258, - TK_DASH = 259, - TK_DOTDOT = 260, - TK_COMMA = 261, - TK_ASTERISK = 262, - TK_TEXT = 263, - TK_QOS_ULPS_START = 264, - TK_QOS_ULPS_END = 265, - TK_PORT_GROUPS_START = 266, - TK_PORT_GROUPS_END = 267, - TK_PORT_GROUP_START = 268, - TK_PORT_GROUP_END = 269, - TK_QOS_SETUP_START = 270, - TK_QOS_SETUP_END = 271, - TK_VLARB_TABLES_START = 272, - TK_VLARB_TABLES_END = 273, - TK_VLARB_SCOPE_START = 274, - TK_VLARB_SCOPE_END = 275, - TK_SL2VL_TABLES_START = 276, - TK_SL2VL_TABLES_END = 277, - TK_SL2VL_SCOPE_START = 278, - TK_SL2VL_SCOPE_END = 279, - TK_QOS_LEVELS_START = 280, - TK_QOS_LEVELS_END = 281, - TK_QOS_LEVEL_START = 282, - TK_QOS_LEVEL_END = 283, - TK_QOS_MATCH_RULES_START = 284, - TK_QOS_MATCH_RULES_END = 285, - TK_QOS_MATCH_RULE_START = 286, - TK_QOS_MATCH_RULE_END = 287, - TK_NAME = 288, - TK_USE = 289, - TK_PORT_GUID = 290, - TK_PORT_NAME = 291, - TK_PARTITION = 292, - TK_NODE_TYPE = 293, - TK_GROUP = 294, - TK_ACROSS = 295, - TK_VLARB_HIGH = 296, - TK_VLARB_LOW = 297, - TK_VLARB_HIGH_LIMIT = 298, - TK_TO = 299, - TK_FROM = 300, - TK_ACROSS_TO = 301, - TK_ACROSS_FROM = 302, - TK_SL2VL_TABLE = 303, - TK_SL = 304, - TK_MTU_LIMIT = 305, - TK_RATE_LIMIT = 306, - TK_PACKET_LIFE = 307, - TK_PATH_BITS = 308, - TK_QOS_CLASS = 309, - TK_SOURCE = 310, - TK_DESTINATION = 311, - TK_SERVICE_ID = 312, - TK_QOS_LEVEL_NAME = 313, - TK_PKEY = 314, - TK_NODE_TYPE_ROUTER = 315, - TK_NODE_TYPE_CA = 316, - TK_NODE_TYPE_SWITCH = 317, - TK_NODE_TYPE_SELF = 318, - TK_NODE_TYPE_ALL = 319, - TK_ULP_DEFAULT = 320, - TK_ULP_ANY_SERVICE_ID = 321, - TK_ULP_ANY_PKEY = 322, - TK_ULP_ANY_TARGET_PORT_GUID = 323, - TK_ULP_SDP_DEFAULT = 324, - TK_ULP_SDP_PORT = 325, - TK_ULP_RDS_DEFAULT = 326, - TK_ULP_RDS_PORT = 327, - TK_ULP_ISER_DEFAULT = 328, - TK_ULP_ISER_PORT = 329, - TK_ULP_SRP_GUID = 330, - TK_ULP_IPOIB_DEFAULT = 331, - TK_ULP_IPOIB_PKEY = 332 - }; -#endif -/* Tokens. */ -#define TK_NUMBER 258 -#define TK_DASH 259 -#define TK_DOTDOT 260 -#define TK_COMMA 261 -#define TK_ASTERISK 262 -#define TK_TEXT 263 -#define TK_QOS_ULPS_START 264 -#define TK_QOS_ULPS_END 265 -#define TK_PORT_GROUPS_START 266 -#define TK_PORT_GROUPS_END 267 -#define TK_PORT_GROUP_START 268 -#define TK_PORT_GROUP_END 269 -#define TK_QOS_SETUP_START 270 -#define TK_QOS_SETUP_END 271 -#define TK_VLARB_TABLES_START 272 -#define TK_VLARB_TABLES_END 273 -#define TK_VLARB_SCOPE_START 274 -#define TK_VLARB_SCOPE_END 275 -#define TK_SL2VL_TABLES_START 276 -#define TK_SL2VL_TABLES_END 277 -#define TK_SL2VL_SCOPE_START 278 -#define TK_SL2VL_SCOPE_END 279 -#define TK_QOS_LEVELS_START 280 -#define TK_QOS_LEVELS_END 281 -#define TK_QOS_LEVEL_START 282 -#define TK_QOS_LEVEL_END 283 -#define TK_QOS_MATCH_RULES_START 284 -#define TK_QOS_MATCH_RULES_END 285 -#define TK_QOS_MATCH_RULE_START 286 -#define TK_QOS_MATCH_RULE_END 287 -#define TK_NAME 288 -#define TK_USE 289 -#define TK_PORT_GUID 290 -#define TK_PORT_NAME 291 -#define TK_PARTITION 292 -#define TK_NODE_TYPE 293 -#define TK_GROUP 294 -#define TK_ACROSS 295 -#define TK_VLARB_HIGH 296 -#define TK_VLARB_LOW 297 -#define TK_VLARB_HIGH_LIMIT 298 -#define TK_TO 299 -#define TK_FROM 300 -#define TK_ACROSS_TO 301 -#define TK_ACROSS_FROM 302 -#define TK_SL2VL_TABLE 303 -#define TK_SL 304 -#define TK_MTU_LIMIT 305 -#define TK_RATE_LIMIT 306 -#define TK_PACKET_LIFE 307 -#define TK_PATH_BITS 308 -#define TK_QOS_CLASS 309 -#define TK_SOURCE 310 -#define TK_DESTINATION 311 -#define TK_SERVICE_ID 312 -#define TK_QOS_LEVEL_NAME 313 -#define TK_PKEY 314 -#define TK_NODE_TYPE_ROUTER 315 -#define TK_NODE_TYPE_CA 316 -#define TK_NODE_TYPE_SWITCH 317 -#define TK_NODE_TYPE_SELF 318 -#define TK_NODE_TYPE_ALL 319 -#define TK_ULP_DEFAULT 320 -#define TK_ULP_ANY_SERVICE_ID 321 -#define TK_ULP_ANY_PKEY 322 -#define TK_ULP_ANY_TARGET_PORT_GUID 323 -#define TK_ULP_SDP_DEFAULT 324 -#define TK_ULP_SDP_PORT 325 -#define TK_ULP_RDS_DEFAULT 326 -#define TK_ULP_RDS_PORT 327 -#define TK_ULP_ISER_DEFAULT 328 -#define TK_ULP_ISER_PORT 329 -#define TK_ULP_SRP_GUID 330 -#define TK_ULP_IPOIB_DEFAULT 331 -#define TK_ULP_IPOIB_PKEY 332 - - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - -extern YYSTYPE yylval; - - diff --git a/branches/opensm_3/user/opensm/osm_qos_parser_y.y b/branches/opensm_3/user/opensm/osm_qos_parser_y.y deleted file mode 100644 index f5c9ba0d..00000000 --- a/branches/opensm_3/user/opensm/osm_qos_parser_y.y +++ /dev/null @@ -1,3066 +0,0 @@ -%{ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Grammar of OSM QoS parser. - * - * Environment: - * Linux User Mode - * - * Author: - * Yevgeny Kliteynik, Mellanox - */ -#ifdef __WIN__ -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef __WIN__ -/* prevent redefinition in windows header files */ -#define malloc -#define free -#endif - -#define OSM_QOS_POLICY_MAX_LINE_LEN 1024*10 -#define OSM_QOS_POLICY_SL2VL_TABLE_LEN IB_MAX_NUM_VLS -#define OSM_QOS_POLICY_MAX_VL_NUM IB_MAX_NUM_VLS - -typedef struct tmp_parser_struct_t_ { - char str[OSM_QOS_POLICY_MAX_LINE_LEN]; - uint64_t num_pair[2]; - cl_list_t str_list; - cl_list_t num_list; - cl_list_t num_pair_list; -} tmp_parser_struct_t; - -static void __parser_tmp_struct_init(); -static void __parser_tmp_struct_reset(); -static void __parser_tmp_struct_destroy(); - -static char * __parser_strip_white(char * str); - -static void __parser_str2uint64(uint64_t * p_val, char * str); - -static void __parser_port_group_start(); -static int __parser_port_group_end(); - -static void __parser_sl2vl_scope_start(); -static int __parser_sl2vl_scope_end(); - -static void __parser_vlarb_scope_start(); -static int __parser_vlarb_scope_end(); - -static void __parser_qos_level_start(); -static int __parser_qos_level_end(); - -static void __parser_match_rule_start(); -static int __parser_match_rule_end(); - -static void __parser_ulp_match_rule_start(); -static int __parser_ulp_match_rule_end(); - -static void __pkey_rangelist2rangearr( - cl_list_t * p_list, - uint64_t ** * p_arr, - unsigned * p_arr_len); - -static void __rangelist2rangearr( - cl_list_t * p_list, - uint64_t ** * p_arr, - unsigned * p_arr_len); - -static void __merge_rangearr( - uint64_t ** range_arr_1, - unsigned range_len_1, - uint64_t ** range_arr_2, - unsigned range_len_2, - uint64_t ** * p_arr, - unsigned * p_arr_len ); - -static void __parser_add_port_to_port_map( - cl_qmap_t * p_map, - osm_physp_t * p_physp); - -static void __parser_add_guid_range_to_port_map( - cl_qmap_t * p_map, - uint64_t ** range_arr, - unsigned range_len); - -static void __parser_add_pkey_range_to_port_map( - cl_qmap_t * p_map, - uint64_t ** range_arr, - unsigned range_len); - -static void __parser_add_partition_list_to_port_map( - cl_qmap_t * p_map, - cl_list_t * p_list); - -static void __parser_add_map_to_port_map( - cl_qmap_t * p_dmap, - cl_map_t * p_smap); - -static int __validate_pkeys( - uint64_t ** range_arr, - unsigned range_len, - boolean_t is_ipoib); - -static void __setup_simple_qos_levels(); -static void __clear_simple_qos_levels(); -static void __setup_ulp_match_rules(); -static void __process_ulp_match_rules(); -static void yyerror(const char *format, ...); - -extern char * yytext; -extern int yylex (void); -extern FILE * yyin; -#ifndef __WIN__ -extern int errno; -#endif -int yyparse(); - -#define RESET_BUFFER __parser_tmp_struct_reset() - -tmp_parser_struct_t tmp_parser_struct; - -int column_num; -int line_num; - -osm_qos_policy_t * p_qos_policy = NULL; -osm_qos_port_group_t * p_current_port_group = NULL; -osm_qos_sl2vl_scope_t * p_current_sl2vl_scope = NULL; -osm_qos_vlarb_scope_t * p_current_vlarb_scope = NULL; -osm_qos_level_t * p_current_qos_level = NULL; -osm_qos_match_rule_t * p_current_qos_match_rule = NULL; -osm_log_t * p_qos_parser_osm_log; - -/* 16 Simple QoS Levels - one for each SL */ -static osm_qos_level_t osm_qos_policy_simple_qos_levels[16]; - -/* Default Simple QoS Level */ -osm_qos_level_t __default_simple_qos_level; - -/* - * List of match rules that will be generated by the - * qos-ulp section. These rules are concatenated to - * the end of the usual matching rules list at the - * end of parsing. - */ -static cl_list_t __ulp_match_rules; - -/***************************************************/ - -%} - -%token TK_NUMBER -%token TK_DASH -%token TK_DOTDOT -%token TK_COMMA -%token TK_ASTERISK -%token TK_TEXT - -%token TK_QOS_ULPS_START -%token TK_QOS_ULPS_END - -%token TK_PORT_GROUPS_START -%token TK_PORT_GROUPS_END -%token TK_PORT_GROUP_START -%token TK_PORT_GROUP_END - -%token TK_QOS_SETUP_START -%token TK_QOS_SETUP_END -%token TK_VLARB_TABLES_START -%token TK_VLARB_TABLES_END -%token TK_VLARB_SCOPE_START -%token TK_VLARB_SCOPE_END - -%token TK_SL2VL_TABLES_START -%token TK_SL2VL_TABLES_END -%token TK_SL2VL_SCOPE_START -%token TK_SL2VL_SCOPE_END - -%token TK_QOS_LEVELS_START -%token TK_QOS_LEVELS_END -%token TK_QOS_LEVEL_START -%token TK_QOS_LEVEL_END - -%token TK_QOS_MATCH_RULES_START -%token TK_QOS_MATCH_RULES_END -%token TK_QOS_MATCH_RULE_START -%token TK_QOS_MATCH_RULE_END - -%token TK_NAME -%token TK_USE -%token TK_PORT_GUID -%token TK_PORT_NAME -%token TK_PARTITION -%token TK_NODE_TYPE -%token TK_GROUP -%token TK_ACROSS -%token TK_VLARB_HIGH -%token TK_VLARB_LOW -%token TK_VLARB_HIGH_LIMIT -%token TK_TO -%token TK_FROM -%token TK_ACROSS_TO -%token TK_ACROSS_FROM -%token TK_SL2VL_TABLE -%token TK_SL -%token TK_MTU_LIMIT -%token TK_RATE_LIMIT -%token TK_PACKET_LIFE -%token TK_PATH_BITS -%token TK_QOS_CLASS -%token TK_SOURCE -%token TK_DESTINATION -%token TK_SERVICE_ID -%token TK_QOS_LEVEL_NAME -%token TK_PKEY - -%token TK_NODE_TYPE_ROUTER -%token TK_NODE_TYPE_CA -%token TK_NODE_TYPE_SWITCH -%token TK_NODE_TYPE_SELF -%token TK_NODE_TYPE_ALL - -%token TK_ULP_DEFAULT -%token TK_ULP_ANY_SERVICE_ID -%token TK_ULP_ANY_PKEY -%token TK_ULP_ANY_TARGET_PORT_GUID -%token TK_ULP_SDP_DEFAULT -%token TK_ULP_SDP_PORT -%token TK_ULP_RDS_DEFAULT -%token TK_ULP_RDS_PORT -%token TK_ULP_ISER_DEFAULT -%token TK_ULP_ISER_PORT -%token TK_ULP_SRP_GUID -%token TK_ULP_IPOIB_DEFAULT -%token TK_ULP_IPOIB_PKEY - -%start head - -%% - -head: qos_policy_entries - ; - -qos_policy_entries: /* empty */ - | qos_policy_entries qos_policy_entry - ; - -qos_policy_entry: qos_ulps_section - | port_groups_section - | qos_setup_section - | qos_levels_section - | qos_match_rules_section - ; - - /* - * Parsing qos-ulps: - * ------------------- - * qos-ulps - * default : 0 #default SL - * sdp, port-num 30000 : 1 #SL for SDP when destination port is 30000 - * sdp, port-num 10000-20000 : 2 - * sdp : 0 #default SL for SDP - * srp, target-port-guid 0x1234 : 2 - * rds, port-num 25000 : 2 #SL for RDS when destination port is 25000 - * rds, : 0 #default SL for RDS - * iser, port-num 900 : 5 #SL for iSER where target port is 900 - * iser : 4 #default SL for iSER - * ipoib, pkey 0x0001 : 5 #SL for IPoIB on partition with pkey 0x0001 - * ipoib : 6 #default IPoIB partition - pkey=0x7FFF - * any, service-id 0x6234 : 2 - * any, pkey 0x0ABC : 3 - * any, target-port-guid 0x0ABC-0xFFFFF : 6 - * end-qos-ulps - */ - -qos_ulps_section: TK_QOS_ULPS_START qos_ulps TK_QOS_ULPS_END - ; - -qos_ulps: qos_ulp - | qos_ulps qos_ulp - ; - - /* - * Parsing port groups: - * ------------------- - * port-groups - * port-group - * name: Storage - * use: our SRP storage targets - * port-guid: 0x1000000000000001,0x1000000000000002 - * ... - * port-name: vs1 HCA-1/P1 - * port-name: node_description/P2 - * ... - * pkey: 0x00FF-0x0FFF - * ... - * partition: Part1 - * ... - * node-type: ROUTER,CA,SWITCH,SELF,ALL - * ... - * end-port-group - * port-group - * ... - * end-port-group - * end-port-groups - */ - - -port_groups_section: TK_PORT_GROUPS_START port_groups TK_PORT_GROUPS_END - ; - -port_groups: port_group - | port_groups port_group - ; - -port_group: port_group_start port_group_entries port_group_end - ; - -port_group_start: TK_PORT_GROUP_START { - __parser_port_group_start(); - } - ; - -port_group_end: TK_PORT_GROUP_END { - if ( __parser_port_group_end() ) - return 1; - } - ; - -port_group_entries: /* empty */ - | port_group_entries port_group_entry - ; - -port_group_entry: port_group_name - | port_group_use - | port_group_port_guid - | port_group_port_name - | port_group_pkey - | port_group_partition - | port_group_node_type - ; - - - /* - * Parsing qos setup: - * ----------------- - * qos-setup - * vlarb-tables - * vlarb-scope - * ... - * end-vlarb-scope - * vlarb-scope - * ... - * end-vlarb-scope - * end-vlarb-tables - * sl2vl-tables - * sl2vl-scope - * ... - * end-sl2vl-scope - * sl2vl-scope - * ... - * end-sl2vl-scope - * end-sl2vl-tables - * end-qos-setup - */ - -qos_setup_section: TK_QOS_SETUP_START qos_setup_items TK_QOS_SETUP_END - ; - -qos_setup_items: /* empty */ - | qos_setup_items vlarb_tables - | qos_setup_items sl2vl_tables - ; - - /* Parsing vlarb-tables */ - -vlarb_tables: TK_VLARB_TABLES_START vlarb_scope_items TK_VLARB_TABLES_END - ; - -vlarb_scope_items: /* empty */ - | vlarb_scope_items vlarb_scope - ; - -vlarb_scope: vlarb_scope_start vlarb_scope_entries vlarb_scope_end - ; - -vlarb_scope_start: TK_VLARB_SCOPE_START { - __parser_vlarb_scope_start(); - } - ; - -vlarb_scope_end: TK_VLARB_SCOPE_END { - if ( __parser_vlarb_scope_end() ) - return 1; - } - ; - -vlarb_scope_entries:/* empty */ - | vlarb_scope_entries vlarb_scope_entry - ; - - /* - * vlarb-scope - * group: Storage - * ... - * across: Storage - * ... - * vlarb-high: 0:255,1:127,2:63,3:31,4:15,5:7,6:3,7:1 - * vlarb-low: 8:255,9:127,10:63,11:31,12:15,13:7,14:3 - * vl-high-limit: 10 - * end-vlarb-scope - */ - -vlarb_scope_entry: vlarb_scope_group - | vlarb_scope_across - | vlarb_scope_vlarb_high - | vlarb_scope_vlarb_low - | vlarb_scope_vlarb_high_limit - ; - - /* Parsing sl2vl-tables */ - -sl2vl_tables: TK_SL2VL_TABLES_START sl2vl_scope_items TK_SL2VL_TABLES_END - ; - -sl2vl_scope_items: /* empty */ - | sl2vl_scope_items sl2vl_scope - ; - -sl2vl_scope: sl2vl_scope_start sl2vl_scope_entries sl2vl_scope_end - ; - -sl2vl_scope_start: TK_SL2VL_SCOPE_START { - __parser_sl2vl_scope_start(); - } - ; - -sl2vl_scope_end: TK_SL2VL_SCOPE_END { - if ( __parser_sl2vl_scope_end() ) - return 1; - } - ; - -sl2vl_scope_entries:/* empty */ - | sl2vl_scope_entries sl2vl_scope_entry - ; - - /* - * sl2vl-scope - * group: Part1 - * ... - * from: * - * ... - * to: * - * ... - * across-to: Storage2 - * ... - * across-from: Storage1 - * ... - * sl2vl-table: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7 - * end-sl2vl-scope - */ - -sl2vl_scope_entry: sl2vl_scope_group - | sl2vl_scope_across - | sl2vl_scope_across_from - | sl2vl_scope_across_to - | sl2vl_scope_from - | sl2vl_scope_to - | sl2vl_scope_sl2vl_table - ; - - /* - * Parsing qos-levels: - * ------------------ - * qos-levels - * qos-level - * name: qos_level_1 - * use: for the lowest priority communication - * sl: 15 - * mtu-limit: 1 - * rate-limit: 1 - * packet-life: 12 - * path-bits: 2,4,8-32 - * pkey: 0x00FF-0x0FFF - * end-qos-level - * ... - * qos-level - * end-qos-level - * end-qos-levels - */ - - -qos_levels_section: TK_QOS_LEVELS_START qos_levels TK_QOS_LEVELS_END - ; - -qos_levels: /* empty */ - | qos_levels qos_level - ; - -qos_level: qos_level_start qos_level_entries qos_level_end - ; - -qos_level_start: TK_QOS_LEVEL_START { - __parser_qos_level_start(); - } - ; - -qos_level_end: TK_QOS_LEVEL_END { - if ( __parser_qos_level_end() ) - return 1; - } - ; - -qos_level_entries: /* empty */ - | qos_level_entries qos_level_entry - ; - -qos_level_entry: qos_level_name - | qos_level_use - | qos_level_sl - | qos_level_mtu_limit - | qos_level_rate_limit - | qos_level_packet_life - | qos_level_path_bits - | qos_level_pkey - ; - - /* - * Parsing qos-match-rules: - * ----------------------- - * qos-match-rules - * qos-match-rule - * use: low latency by class 7-9 or 11 and bla bla - * qos-class: 7-9,11 - * qos-level-name: default - * source: Storage - * destination: Storage - * service-id: 22,4719-5000 - * pkey: 0x00FF-0x0FFF - * end-qos-match-rule - * qos-match-rule - * ... - * end-qos-match-rule - * end-qos-match-rules - */ - -qos_match_rules_section: TK_QOS_MATCH_RULES_START qos_match_rules TK_QOS_MATCH_RULES_END - ; - -qos_match_rules: /* empty */ - | qos_match_rules qos_match_rule - ; - -qos_match_rule: qos_match_rule_start qos_match_rule_entries qos_match_rule_end - ; - -qos_match_rule_start: TK_QOS_MATCH_RULE_START { - __parser_match_rule_start(); - } - ; - -qos_match_rule_end: TK_QOS_MATCH_RULE_END { - if ( __parser_match_rule_end() ) - return 1; - } - ; - -qos_match_rule_entries: /* empty */ - | qos_match_rule_entries qos_match_rule_entry - ; - -qos_match_rule_entry: qos_match_rule_use - | qos_match_rule_qos_class - | qos_match_rule_qos_level_name - | qos_match_rule_source - | qos_match_rule_destination - | qos_match_rule_service_id - | qos_match_rule_pkey - ; - - - /* - * Parsing qos-ulps: - * ----------------- - * default - * sdp - * sdp with port-num - * rds - * rds with port-num - * srp with port-guid - * iser - * iser with port-num - * ipoib - * ipoib with pkey - * any with service-id - * any with pkey - * any with target-port-guid - */ - -qos_ulp: TK_ULP_DEFAULT single_number { - /* parsing default ulp rule: "default: num" */ - cl_list_iterator_t list_iterator; - uint64_t * p_tmp_num; - - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_tmp_num = (uint64_t*)cl_list_obj(list_iterator); - if (*p_tmp_num > 15) - { - yyerror("illegal SL value"); - return 1; - } - __default_simple_qos_level.sl = (uint8_t)(*p_tmp_num); - __default_simple_qos_level.sl_set = TRUE; - free(p_tmp_num); - cl_list_remove_all(&tmp_parser_struct.num_list); - } - - | qos_ulp_type_any_service list_of_ranges TK_DOTDOT { - /* "any, service-id ... : sl" - one instance of list of ranges */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("ULP rule doesn't have service ids"); - return 1; - } - - /* get all the service id ranges */ - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - - } qos_ulp_sl - - | qos_ulp_type_any_pkey list_of_ranges TK_DOTDOT { - /* "any, pkey ... : sl" - one instance of list of ranges */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("ULP rule doesn't have pkeys"); - return 1; - } - - /* get all the pkey ranges */ - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - p_current_qos_match_rule->pkey_range_arr = range_arr; - p_current_qos_match_rule->pkey_range_len = range_len; - - } qos_ulp_sl - - | qos_ulp_type_any_target_port_guid list_of_ranges TK_DOTDOT { - /* any, target-port-guid ... : sl */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("ULP rule doesn't have port guids"); - return 1; - } - - /* create a new port group with these ports */ - __parser_port_group_start(); - - p_current_port_group->name = strdup("_ULP_Targets_"); - p_current_port_group->use = strdup("Generated from ULP rules"); - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - __parser_add_guid_range_to_port_map( - &p_current_port_group->port_map, - range_arr, - range_len); - - /* add this port group to the destination - groups of the current match rule */ - cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list, - p_current_port_group); - - __parser_port_group_end(); - - } qos_ulp_sl - - | qos_ulp_type_sdp_default { - /* "sdp : sl" - default SL for SDP */ - uint64_t ** range_arr = - (uint64_t **)malloc(sizeof(uint64_t *)); - range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t)); - range_arr[0][0] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID; - range_arr[0][1] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID + 0xFFFF; - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = 1; - - } qos_ulp_sl - - | qos_ulp_type_sdp_port list_of_ranges TK_DOTDOT { - /* sdp with port numbers */ - uint64_t ** range_arr; - unsigned range_len; - unsigned i; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("SDP ULP rule doesn't have port numbers"); - return 1; - } - - /* get all the port ranges */ - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - /* now translate these port numbers into service ids */ - for (i = 0; i < range_len; i++) - { - if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF) - { - yyerror("SDP port number out of range"); - return 1; - } - range_arr[i][0] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID; - range_arr[i][1] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID; - } - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - - } qos_ulp_sl - - | qos_ulp_type_rds_default { - /* "rds : sl" - default SL for RDS */ - uint64_t ** range_arr = - (uint64_t **)malloc(sizeof(uint64_t *)); - range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t)); - range_arr[0][0] = range_arr[0][1] = - OSM_QOS_POLICY_ULP_RDS_SERVICE_ID + OSM_QOS_POLICY_ULP_RDS_PORT; - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = 1; - - } qos_ulp_sl - - | qos_ulp_type_rds_port list_of_ranges TK_DOTDOT { - /* rds with port numbers */ - uint64_t ** range_arr; - unsigned range_len; - unsigned i; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("RDS ULP rule doesn't have port numbers"); - return 1; - } - - /* get all the port ranges */ - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - /* now translate these port numbers into service ids */ - for (i = 0; i < range_len; i++) - { - if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF) - { - yyerror("SDP port number out of range"); - return 1; - } - range_arr[i][0] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID; - range_arr[i][1] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID; - } - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - - } qos_ulp_sl - - | qos_ulp_type_iser_default { - /* "iSER : sl" - default SL for iSER */ - uint64_t ** range_arr = - (uint64_t **)malloc(sizeof(uint64_t *)); - range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t)); - range_arr[0][0] = range_arr[0][1] = - OSM_QOS_POLICY_ULP_ISER_SERVICE_ID + OSM_QOS_POLICY_ULP_ISER_PORT; - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = 1; - - } qos_ulp_sl - - | qos_ulp_type_iser_port list_of_ranges TK_DOTDOT { - /* iser with port numbers */ - uint64_t ** range_arr; - unsigned range_len; - unsigned i; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("iSER ULP rule doesn't have port numbers"); - return 1; - } - - /* get all the port ranges */ - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - /* now translate these port numbers into service ids */ - for (i = 0; i < range_len; i++) - { - if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF) - { - yyerror("SDP port number out of range"); - return 1; - } - range_arr[i][0] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID; - range_arr[i][1] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID; - } - - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - - } qos_ulp_sl - - | qos_ulp_type_srp_guid list_of_ranges TK_DOTDOT { - /* srp with target guids - this rule is similar - to writing 'any' ulp with target port guids */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("SRP ULP rule doesn't have port guids"); - return 1; - } - - /* create a new port group with these ports */ - __parser_port_group_start(); - - p_current_port_group->name = strdup("_SRP_Targets_"); - p_current_port_group->use = strdup("Generated from ULP rules"); - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - __parser_add_guid_range_to_port_map( - &p_current_port_group->port_map, - range_arr, - range_len); - - /* add this port group to the destination - groups of the current match rule */ - cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list, - p_current_port_group); - - __parser_port_group_end(); - - } qos_ulp_sl - - | qos_ulp_type_ipoib_default { - /* ipoib w/o any pkeys (default pkey) */ - uint64_t ** range_arr = - (uint64_t **)malloc(sizeof(uint64_t *)); - range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t)); - range_arr[0][0] = range_arr[0][1] = 0x7fff; - - /* - * Although we know that the default partition exists, - * we still need to validate it by checking that it has - * at least two full members. Otherwise IPoIB won't work. - */ - if (__validate_pkeys(range_arr, 1, TRUE)) - return 1; - - p_current_qos_match_rule->pkey_range_arr = range_arr; - p_current_qos_match_rule->pkey_range_len = 1; - - } qos_ulp_sl - - | qos_ulp_type_ipoib_pkey list_of_ranges TK_DOTDOT { - /* ipoib with pkeys */ - uint64_t ** range_arr; - unsigned range_len; - - if (!cl_list_count(&tmp_parser_struct.num_pair_list)) - { - yyerror("IPoIB ULP rule doesn't have pkeys"); - return 1; - } - - /* get all the pkey ranges */ - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - /* - * Validate pkeys. - * For IPoIB pkeys the validation is strict. - * If some problem would be found, parsing will - * be aborted with a proper error messages. - */ - if (__validate_pkeys(range_arr, range_len, TRUE)) - return 1; - - p_current_qos_match_rule->pkey_range_arr = range_arr; - p_current_qos_match_rule->pkey_range_len = range_len; - - } qos_ulp_sl - ; - -qos_ulp_type_any_service: TK_ULP_ANY_SERVICE_ID - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_any_pkey: TK_ULP_ANY_PKEY - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_any_target_port_guid: TK_ULP_ANY_TARGET_PORT_GUID - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_sdp_default: TK_ULP_SDP_DEFAULT - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_sdp_port: TK_ULP_SDP_PORT - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_rds_default: TK_ULP_RDS_DEFAULT - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_rds_port: TK_ULP_RDS_PORT - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_iser_default: TK_ULP_ISER_DEFAULT - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_iser_port: TK_ULP_ISER_PORT - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_srp_guid: TK_ULP_SRP_GUID - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_ipoib_default: TK_ULP_IPOIB_DEFAULT - { __parser_ulp_match_rule_start(); }; - -qos_ulp_type_ipoib_pkey: TK_ULP_IPOIB_PKEY - { __parser_ulp_match_rule_start(); }; - - -qos_ulp_sl: single_number { - /* get the SL for ULP rules */ - cl_list_iterator_t list_iterator; - uint64_t * p_tmp_num; - uint8_t sl; - - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_tmp_num = (uint64_t*)cl_list_obj(list_iterator); - if (*p_tmp_num > 15) - { - yyerror("illegal SL value"); - return 1; - } - - sl = (uint8_t)(*p_tmp_num); - free(p_tmp_num); - cl_list_remove_all(&tmp_parser_struct.num_list); - - p_current_qos_match_rule->p_qos_level = - &osm_qos_policy_simple_qos_levels[sl]; - p_current_qos_match_rule->qos_level_name = - strdup(osm_qos_policy_simple_qos_levels[sl].name); - - if (__parser_ulp_match_rule_end()) - return 1; - } - ; - - /* - * port_group_entry values: - * port_group_name - * port_group_use - * port_group_port_guid - * port_group_port_name - * port_group_pkey - * port_group_partition - * port_group_node_type - */ - -port_group_name: port_group_name_start single_string { - /* 'name' of 'port-group' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_port_group->name) - { - yyerror("port-group has multiple 'name' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_port_group->name = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -port_group_name_start: TK_NAME { - RESET_BUFFER; - } - ; - -port_group_use: port_group_use_start single_string { - /* 'use' of 'port-group' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_port_group->use) - { - yyerror("port-group has multiple 'use' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_port_group->use = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -port_group_use_start: TK_USE { - RESET_BUFFER; - } - ; - -port_group_port_name: port_group_port_name_start string_list { - /* 'port-name' in 'port-group' - any num of instances */ - cl_list_iterator_t list_iterator; - osm_node_t * p_node; - osm_physp_t * p_physp; - unsigned port_num; - char * tmp_str; - char * port_str; - - /* parsing port name strings */ - for (list_iterator = cl_list_head(&tmp_parser_struct.str_list); - list_iterator != cl_list_end(&tmp_parser_struct.str_list); - list_iterator = cl_list_next(list_iterator)) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - { - /* last slash in port name string is a separator - between node name and port number */ - port_str = strrchr(tmp_str, '/'); - if (!port_str || (strlen(port_str) < 3) || - (port_str[1] != 'p' && port_str[1] != 'P')) { - yyerror("'%s' - illegal port name", - tmp_str); - free(tmp_str); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - if (!(port_num = strtoul(&port_str[2],NULL,0))) { - yyerror( - "'%s' - illegal port number in port name", - tmp_str); - free(tmp_str); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - /* separate node name from port number */ - port_str[0] = '\0'; - - if (st_lookup(p_qos_policy->p_node_hash, - (st_data_t)tmp_str, - (void *)&p_node)) - { - /* we found the node, now get the right port */ - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_physp) { - yyerror( - "'%s' - port number out of range in port name", - tmp_str); - free(tmp_str); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - /* we found the port, now add it to guid table */ - __parser_add_port_to_port_map(&p_current_port_group->port_map, - p_physp); - } - free(tmp_str); - } - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -port_group_port_name_start: TK_PORT_NAME { - RESET_BUFFER; - } - ; - -port_group_port_guid: port_group_port_guid_start list_of_ranges { - /* 'port-guid' in 'port-group' - any num of instances */ - /* list of guid ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - __parser_add_guid_range_to_port_map( - &p_current_port_group->port_map, - range_arr, - range_len); - } - } - ; - -port_group_port_guid_start: TK_PORT_GUID { - RESET_BUFFER; - } - ; - -port_group_pkey: port_group_pkey_start list_of_ranges { - /* 'pkey' in 'port-group' - any num of instances */ - /* list of pkey ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - __parser_add_pkey_range_to_port_map( - &p_current_port_group->port_map, - range_arr, - range_len); - } - } - ; - -port_group_pkey_start: TK_PKEY { - RESET_BUFFER; - } - ; - -port_group_partition: port_group_partition_start string_list { - /* 'partition' in 'port-group' - any num of instances */ - __parser_add_partition_list_to_port_map( - &p_current_port_group->port_map, - &tmp_parser_struct.str_list); - } - ; - -port_group_partition_start: TK_PARTITION { - RESET_BUFFER; - } - ; - -port_group_node_type: port_group_node_type_start port_group_node_type_list { - /* 'node-type' in 'port-group' - any num of instances */ - } - ; - -port_group_node_type_start: TK_NODE_TYPE { - RESET_BUFFER; - } - ; - -port_group_node_type_list: node_type_item - | port_group_node_type_list TK_COMMA node_type_item - ; - -node_type_item: node_type_ca - | node_type_switch - | node_type_router - | node_type_all - | node_type_self - ; - -node_type_ca: TK_NODE_TYPE_CA { - p_current_port_group->node_types |= - OSM_QOS_POLICY_NODE_TYPE_CA; - } - ; - -node_type_switch: TK_NODE_TYPE_SWITCH { - p_current_port_group->node_types |= - OSM_QOS_POLICY_NODE_TYPE_SWITCH; - } - ; - -node_type_router: TK_NODE_TYPE_ROUTER { - p_current_port_group->node_types |= - OSM_QOS_POLICY_NODE_TYPE_ROUTER; - } - ; - -node_type_all: TK_NODE_TYPE_ALL { - p_current_port_group->node_types |= - (OSM_QOS_POLICY_NODE_TYPE_CA | - OSM_QOS_POLICY_NODE_TYPE_SWITCH | - OSM_QOS_POLICY_NODE_TYPE_ROUTER); - } - ; - -node_type_self: TK_NODE_TYPE_SELF { - osm_port_t * p_osm_port = - osm_get_port_by_guid(p_qos_policy->p_subn, - p_qos_policy->p_subn->sm_port_guid); - if (p_osm_port) - __parser_add_port_to_port_map( - &p_current_port_group->port_map, - p_osm_port->p_physp); - } - ; - - /* - * vlarb_scope_entry values: - * vlarb_scope_group - * vlarb_scope_across - * vlarb_scope_vlarb_high - * vlarb_scope_vlarb_low - * vlarb_scope_vlarb_high_limit - */ - - - -vlarb_scope_group: vlarb_scope_group_start string_list { - /* 'group' in 'vlarb-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_vlarb_scope->group_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -vlarb_scope_group_start: TK_GROUP { - RESET_BUFFER; - } - ; - -vlarb_scope_across: vlarb_scope_across_start string_list { - /* 'across' in 'vlarb-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_vlarb_scope->across_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -vlarb_scope_across_start: TK_ACROSS { - RESET_BUFFER; - } - ; - -vlarb_scope_vlarb_high_limit: vlarb_scope_vlarb_high_limit_start single_number { - /* 'vl-high-limit' in 'vlarb-scope' - one instance of one number */ - cl_list_iterator_t list_iterator; - uint64_t * p_tmp_num; - - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_tmp_num = (uint64_t*)cl_list_obj(list_iterator); - if (p_tmp_num) - { - p_current_vlarb_scope->vl_high_limit = (uint32_t)(*p_tmp_num); - p_current_vlarb_scope->vl_high_limit_set = TRUE; - free(p_tmp_num); - } - - cl_list_remove_all(&tmp_parser_struct.num_list); - } - ; - -vlarb_scope_vlarb_high_limit_start: TK_VLARB_HIGH_LIMIT { - RESET_BUFFER; - } - ; - -vlarb_scope_vlarb_high: vlarb_scope_vlarb_high_start num_list_with_dotdot { - /* 'vlarb-high' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */ - cl_list_iterator_t list_iterator; - uint64_t * num_pair; - - list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) ) - { - num_pair = (uint64_t*)cl_list_obj(list_iterator); - if (num_pair) - cl_list_insert_tail(&p_current_vlarb_scope->vlarb_high_list,num_pair); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - } - ; - -vlarb_scope_vlarb_high_start: TK_VLARB_HIGH { - RESET_BUFFER; - } - ; - -vlarb_scope_vlarb_low: vlarb_scope_vlarb_low_start num_list_with_dotdot { - /* 'vlarb-low' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */ - cl_list_iterator_t list_iterator; - uint64_t * num_pair; - - list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) ) - { - num_pair = (uint64_t*)cl_list_obj(list_iterator); - if (num_pair) - cl_list_insert_tail(&p_current_vlarb_scope->vlarb_low_list,num_pair); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - } - ; - -vlarb_scope_vlarb_low_start: TK_VLARB_LOW { - RESET_BUFFER; - } - ; - - /* - * sl2vl_scope_entry values: - * sl2vl_scope_group - * sl2vl_scope_across - * sl2vl_scope_across_from - * sl2vl_scope_across_to - * sl2vl_scope_from - * sl2vl_scope_to - * sl2vl_scope_sl2vl_table - */ - -sl2vl_scope_group: sl2vl_scope_group_start string_list { - /* 'group' in 'sl2vl-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_sl2vl_scope->group_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -sl2vl_scope_group_start: TK_GROUP { - RESET_BUFFER; - } - ; - -sl2vl_scope_across: sl2vl_scope_across_start string_list { - /* 'across' in 'sl2vl-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) { - cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str); - cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,strdup(tmp_str)); - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -sl2vl_scope_across_start: TK_ACROSS { - RESET_BUFFER; - } - ; - -sl2vl_scope_across_from: sl2vl_scope_across_from_start string_list { - /* 'across-from' in 'sl2vl-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -sl2vl_scope_across_from_start: TK_ACROSS_FROM { - RESET_BUFFER; - } - ; - -sl2vl_scope_across_to: sl2vl_scope_across_to_start string_list { - /* 'across-to' in 'sl2vl-scope' - any num of instances */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) { - cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,tmp_str); - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -sl2vl_scope_across_to_start: TK_ACROSS_TO { - RESET_BUFFER; - } - ; - -sl2vl_scope_from: sl2vl_scope_from_start sl2vl_scope_from_list_or_asterisk { - /* 'from' in 'sl2vl-scope' - any num of instances */ - } - ; - -sl2vl_scope_from_start: TK_FROM { - RESET_BUFFER; - } - ; - -sl2vl_scope_to: sl2vl_scope_to_start sl2vl_scope_to_list_or_asterisk { - /* 'to' in 'sl2vl-scope' - any num of instances */ - } - ; - -sl2vl_scope_to_start: TK_TO { - RESET_BUFFER; - } - ; - -sl2vl_scope_from_list_or_asterisk: sl2vl_scope_from_asterisk - | sl2vl_scope_from_list_of_ranges - ; - -sl2vl_scope_from_asterisk: TK_ASTERISK { - int i; - for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++) - p_current_sl2vl_scope->from[i] = TRUE; - } - ; - -sl2vl_scope_to_list_or_asterisk: sl2vl_scope_to_asterisk - | sl2vl_scope_to_list_of_ranges - ; - -sl2vl_scope_to_asterisk: TK_ASTERISK { - int i; - for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++) - p_current_sl2vl_scope->to[i] = TRUE; - } - ; - -sl2vl_scope_from_list_of_ranges: list_of_ranges { - int i; - cl_list_iterator_t list_iterator; - uint64_t * num_pair; - uint8_t num1, num2; - - list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) ) - { - num_pair = (uint64_t*)cl_list_obj(list_iterator); - if (num_pair) - { - if ( (int64_t)num_pair[0] < 0 || - num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH ) - { - yyerror("port number out of range 'from' list"); - free(num_pair); - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - return 1; - } - num1 = (uint8_t)num_pair[0]; - num2 = (uint8_t)num_pair[1]; - free(num_pair); - for (i = num1; i <= num2; i++) - p_current_sl2vl_scope->from[i] = TRUE; - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - } - ; - -sl2vl_scope_to_list_of_ranges: list_of_ranges { - int i; - cl_list_iterator_t list_iterator; - uint64_t * num_pair; - uint8_t num1, num2; - - list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) ) - { - num_pair = (uint64_t*)cl_list_obj(list_iterator); - if (num_pair) - { - if ( (uint64_t)num_pair[0] < 0 || - num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH ) - { - yyerror("port number out of range 'to' list"); - free(num_pair); - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - return 1; - } - num1 = (uint8_t)num_pair[0]; - num2 = (uint8_t)num_pair[1]; - free(num_pair); - for (i = num1; i <= num2; i++) - p_current_sl2vl_scope->to[i] = TRUE; - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.num_pair_list); - } - ; - - -sl2vl_scope_sl2vl_table: sl2vl_scope_sl2vl_table_start num_list { - /* 'sl2vl-table' - one instance of exactly - OSM_QOS_POLICY_SL2VL_TABLE_LEN numbers */ - cl_list_iterator_t list_iterator; - uint64_t num; - uint64_t * p_num; - int i = 0; - - if (p_current_sl2vl_scope->sl2vl_table_set) - { - yyerror("sl2vl-scope has more than one sl2vl-table"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - - if (cl_list_count(&tmp_parser_struct.num_list) != OSM_QOS_POLICY_SL2VL_TABLE_LEN) - { - yyerror("wrong number of values in 'sl2vl-table' (should be 16)"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.num_list) ) - { - p_num = (uint64_t*)cl_list_obj(list_iterator); - num = *p_num; - free(p_num); - if (num >= OSM_QOS_POLICY_MAX_VL_NUM) - { - yyerror("wrong VL value in 'sl2vl-table' (should be 0 to 15)"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - - p_current_sl2vl_scope->sl2vl_table[i++] = (uint8_t)num; - list_iterator = cl_list_next(list_iterator); - } - p_current_sl2vl_scope->sl2vl_table_set = TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - ; - -sl2vl_scope_sl2vl_table_start: TK_SL2VL_TABLE { - RESET_BUFFER; - } - ; - - /* - * qos_level_entry values: - * qos_level_name - * qos_level_use - * qos_level_sl - * qos_level_mtu_limit - * qos_level_rate_limit - * qos_level_packet_life - * qos_level_path_bits - * qos_level_pkey - */ - -qos_level_name: qos_level_name_start single_string { - /* 'name' of 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_qos_level->name) - { - yyerror("qos-level has multiple 'name' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_qos_level->name = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -qos_level_name_start: TK_NAME { - RESET_BUFFER; - } - ; - -qos_level_use: qos_level_use_start single_string { - /* 'use' of 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_qos_level->use) - { - yyerror("qos-level has multiple 'use' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_qos_level->use = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -qos_level_use_start: TK_USE { - RESET_BUFFER; - } - ; - -qos_level_sl: qos_level_sl_start single_number { - /* 'sl' in 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - uint64_t * p_num; - - if (p_current_qos_level->sl_set) - { - yyerror("'qos-level' has multiple 'sl' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_num = (uint64_t*)cl_list_obj(list_iterator); - p_current_qos_level->sl = (uint8_t)(*p_num); - free(p_num); - p_current_qos_level->sl_set = TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - ; - -qos_level_sl_start: TK_SL { - RESET_BUFFER; - } - ; - -qos_level_mtu_limit: qos_level_mtu_limit_start single_number { - /* 'mtu-limit' in 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - uint64_t * p_num; - - if (p_current_qos_level->mtu_limit_set) - { - yyerror("'qos-level' has multiple 'mtu-limit' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_num = (uint64_t*)cl_list_obj(list_iterator); - p_current_qos_level->mtu_limit = (uint8_t)(*p_num); - free(p_num); - p_current_qos_level->mtu_limit_set = TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - ; - -qos_level_mtu_limit_start: TK_MTU_LIMIT { - /* 'mtu-limit' in 'qos-level' - one instance */ - RESET_BUFFER; - } - ; - -qos_level_rate_limit: qos_level_rate_limit_start single_number { - /* 'rate-limit' in 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - uint64_t * p_num; - - if (p_current_qos_level->rate_limit_set) - { - yyerror("'qos-level' has multiple 'rate-limit' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_num = (uint64_t*)cl_list_obj(list_iterator); - p_current_qos_level->rate_limit = (uint8_t)(*p_num); - free(p_num); - p_current_qos_level->rate_limit_set = TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - ; - -qos_level_rate_limit_start: TK_RATE_LIMIT { - /* 'rate-limit' in 'qos-level' - one instance */ - RESET_BUFFER; - } - ; - -qos_level_packet_life: qos_level_packet_life_start single_number { - /* 'packet-life' in 'qos-level' - one instance */ - cl_list_iterator_t list_iterator; - uint64_t * p_num; - - if (p_current_qos_level->pkt_life_set) - { - yyerror("'qos-level' has multiple 'packet-life' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - list_iterator = cl_list_head(&tmp_parser_struct.num_list); - p_num = (uint64_t*)cl_list_obj(list_iterator); - p_current_qos_level->pkt_life = (uint8_t)(*p_num); - free(p_num); - p_current_qos_level->pkt_life_set= TRUE; - cl_list_remove_all(&tmp_parser_struct.num_list); - } - ; - -qos_level_packet_life_start: TK_PACKET_LIFE { - /* 'packet-life' in 'qos-level' - one instance */ - RESET_BUFFER; - } - ; - -qos_level_path_bits: qos_level_path_bits_start list_of_ranges { - /* 'path-bits' in 'qos-level' - any num of instances */ - /* list of path bit ranges */ - - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_level->path_bits_range_len ) - { - p_current_qos_level->path_bits_range_arr = range_arr; - p_current_qos_level->path_bits_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_level->path_bits_range_arr, - p_current_qos_level->path_bits_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_level->path_bits_range_arr = new_range_arr; - p_current_qos_level->path_bits_range_len = new_range_len; - } - } - } - ; - -qos_level_path_bits_start: TK_PATH_BITS { - RESET_BUFFER; - } - ; - -qos_level_pkey: qos_level_pkey_start list_of_ranges { - /* 'pkey' in 'qos-level' - num of instances of list of ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_level->pkey_range_len ) - { - p_current_qos_level->pkey_range_arr = range_arr; - p_current_qos_level->pkey_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_level->pkey_range_arr, - p_current_qos_level->pkey_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_level->pkey_range_arr = new_range_arr; - p_current_qos_level->pkey_range_len = new_range_len; - } - } - } - ; - -qos_level_pkey_start: TK_PKEY { - RESET_BUFFER; - } - ; - - /* - * qos_match_rule_entry values: - * qos_match_rule_use - * qos_match_rule_qos_class - * qos_match_rule_qos_level_name - * qos_match_rule_source - * qos_match_rule_destination - * qos_match_rule_service_id - * qos_match_rule_pkey - */ - - -qos_match_rule_use: qos_match_rule_use_start single_string { - /* 'use' of 'qos-match-rule' - one instance */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_qos_match_rule->use) - { - yyerror("'qos-match-rule' has multiple 'use' tags"); - cl_list_remove_all(&tmp_parser_struct.str_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_qos_match_rule->use = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -qos_match_rule_use_start: TK_USE { - RESET_BUFFER; - } - ; - -qos_match_rule_qos_class: qos_match_rule_qos_class_start list_of_ranges { - /* 'qos-class' in 'qos-match-rule' - num of instances of list of ranges */ - /* list of class ranges (QoS Class is 12-bit value) */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_match_rule->qos_class_range_len ) - { - p_current_qos_match_rule->qos_class_range_arr = range_arr; - p_current_qos_match_rule->qos_class_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_match_rule->qos_class_range_arr, - p_current_qos_match_rule->qos_class_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_match_rule->qos_class_range_arr = new_range_arr; - p_current_qos_match_rule->qos_class_range_len = new_range_len; - } - } - } - ; - -qos_match_rule_qos_class_start: TK_QOS_CLASS { - RESET_BUFFER; - } - ; - -qos_match_rule_source: qos_match_rule_source_start string_list { - /* 'source' in 'qos-match-rule' - text */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_qos_match_rule->source_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -qos_match_rule_source_start: TK_SOURCE { - RESET_BUFFER; - } - ; - -qos_match_rule_destination: qos_match_rule_destination_start string_list { - /* 'destination' in 'qos-match-rule' - text */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - cl_list_insert_tail(&p_current_qos_match_rule->destination_list,tmp_str); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -qos_match_rule_destination_start: TK_DESTINATION { - RESET_BUFFER; - } - ; - -qos_match_rule_qos_level_name: qos_match_rule_qos_level_name_start single_string { - /* 'qos-level-name' in 'qos-match-rule' - single string */ - cl_list_iterator_t list_iterator; - char * tmp_str; - - if (p_current_qos_match_rule->qos_level_name) - { - yyerror("qos-match-rule has multiple 'qos-level-name' tags"); - cl_list_remove_all(&tmp_parser_struct.num_list); - return 1; - } - - list_iterator = cl_list_head(&tmp_parser_struct.str_list); - if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) ) - { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) - p_current_qos_match_rule->qos_level_name = tmp_str; - } - cl_list_remove_all(&tmp_parser_struct.str_list); - } - ; - -qos_match_rule_qos_level_name_start: TK_QOS_LEVEL_NAME { - RESET_BUFFER; - } - ; - -qos_match_rule_service_id: qos_match_rule_service_id_start list_of_ranges { - /* 'service-id' in 'qos-match-rule' - num of instances of list of ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_match_rule->service_id_range_len ) - { - p_current_qos_match_rule->service_id_range_arr = range_arr; - p_current_qos_match_rule->service_id_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_match_rule->service_id_range_arr, - p_current_qos_match_rule->service_id_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_match_rule->service_id_range_arr = new_range_arr; - p_current_qos_match_rule->service_id_range_len = new_range_len; - } - } - } - ; - -qos_match_rule_service_id_start: TK_SERVICE_ID { - RESET_BUFFER; - } - ; - -qos_match_rule_pkey: qos_match_rule_pkey_start list_of_ranges { - /* 'pkey' in 'qos-match-rule' - num of instances of list of ranges */ - if (cl_list_count(&tmp_parser_struct.num_pair_list)) - { - uint64_t ** range_arr; - unsigned range_len; - - __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list, - &range_arr, - &range_len ); - - if ( !p_current_qos_match_rule->pkey_range_len ) - { - p_current_qos_match_rule->pkey_range_arr = range_arr; - p_current_qos_match_rule->pkey_range_len = range_len; - } - else - { - uint64_t ** new_range_arr; - unsigned new_range_len; - __merge_rangearr( p_current_qos_match_rule->pkey_range_arr, - p_current_qos_match_rule->pkey_range_len, - range_arr, - range_len, - &new_range_arr, - &new_range_len ); - p_current_qos_match_rule->pkey_range_arr = new_range_arr; - p_current_qos_match_rule->pkey_range_len = new_range_len; - } - } - } - ; - -qos_match_rule_pkey_start: TK_PKEY { - RESET_BUFFER; - } - ; - - - /* - * Common part - */ - - -single_string: single_string_elems { - cl_list_insert_tail(&tmp_parser_struct.str_list, - strdup(__parser_strip_white(tmp_parser_struct.str))); - tmp_parser_struct.str[0] = '\0'; - } - ; - -single_string_elems: single_string_element - | single_string_elems single_string_element - ; - -single_string_element: TK_TEXT { - strcat(tmp_parser_struct.str,$1); - free($1); - } - ; - - -string_list: single_string - | string_list TK_COMMA single_string - ; - - - -single_number: number - ; - -num_list: number - | num_list TK_COMMA number - ; - -number: TK_NUMBER { - uint64_t * p_num = (uint64_t*)malloc(sizeof(uint64_t)); - __parser_str2uint64(p_num,$1); - free($1); - cl_list_insert_tail(&tmp_parser_struct.num_list, p_num); - } - ; - -num_list_with_dotdot: number_from_pair_1 TK_DOTDOT number_from_pair_2 { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - | num_list_with_dotdot TK_COMMA number_from_pair_1 TK_DOTDOT number_from_pair_2 { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - ; - -number_from_pair_1: TK_NUMBER { - __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1); - free($1); - } - ; - -number_from_pair_2: TK_NUMBER { - __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1); - free($1); - } - ; - -list_of_ranges: num_list_with_dash - ; - -num_list_with_dash: single_number_from_range { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - | number_from_range_1 TK_DASH number_from_range_2 { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) { - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - } - else { - num_pair[1] = tmp_parser_struct.num_pair[0]; - num_pair[0] = tmp_parser_struct.num_pair[1]; - } - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - | num_list_with_dash TK_COMMA number_from_range_1 TK_DASH number_from_range_2 { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) { - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - } - else { - num_pair[1] = tmp_parser_struct.num_pair[0]; - num_pair[0] = tmp_parser_struct.num_pair[1]; - } - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - | num_list_with_dash TK_COMMA single_number_from_range { - uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2); - num_pair[0] = tmp_parser_struct.num_pair[0]; - num_pair[1] = tmp_parser_struct.num_pair[1]; - cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair); - } - ; - -single_number_from_range: TK_NUMBER { - __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1); - __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1); - free($1); - } - ; - -number_from_range_1: TK_NUMBER { - __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1); - free($1); - } - ; - -number_from_range_2: TK_NUMBER { - __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1); - free($1); - } - ; - -%% - -/*************************************************** - ***************************************************/ - -int osm_qos_parse_policy_file(IN osm_subn_t * p_subn) -{ - int res = 0; - static boolean_t first_time = TRUE; - p_qos_parser_osm_log = &p_subn->p_osm->log; - - OSM_LOG_ENTER(p_qos_parser_osm_log); - - osm_qos_policy_destroy(p_subn->p_qos_policy); - p_subn->p_qos_policy = NULL; - - yyin = fopen (p_subn->opt.qos_policy_file, "r"); - if (!yyin) - { - if (strcmp(p_subn->opt.qos_policy_file,OSM_DEFAULT_QOS_POLICY_FILE)) { - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC01: " - "Failed opening QoS policy file %s - %s\n", - p_subn->opt.qos_policy_file, strerror(errno)); - res = 1; - } - else - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_VERBOSE, - "QoS policy file not found (%s)\n", - p_subn->opt.qos_policy_file); - - goto Exit; - } - - if (first_time) - { - first_time = FALSE; - __setup_simple_qos_levels(); - __setup_ulp_match_rules(); - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_INFO, - "Loading QoS policy file (%s)\n", - p_subn->opt.qos_policy_file); - } - else - /* - * ULP match rules list was emptied at the end of - * previous parsing iteration. - * What's left is to clear simple QoS levels. - */ - __clear_simple_qos_levels(); - - column_num = 1; - line_num = 1; - - p_subn->p_qos_policy = osm_qos_policy_create(p_subn); - - __parser_tmp_struct_init(); - p_qos_policy = p_subn->p_qos_policy; - - res = yyparse(); - - __parser_tmp_struct_destroy(); - - if (res != 0) - { - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC03: " - "Failed parsing QoS policy file (%s)\n", - p_subn->opt.qos_policy_file); - osm_qos_policy_destroy(p_subn->p_qos_policy); - p_subn->p_qos_policy = NULL; - res = 1; - goto Exit; - } - - /* add generated ULP match rules to the usual match rules */ - __process_ulp_match_rules(); - - if (osm_qos_policy_validate(p_subn->p_qos_policy,p_qos_parser_osm_log)) - { - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC04: " - "Error(s) in QoS policy file (%s)\n", - p_subn->opt.qos_policy_file); - fprintf(stderr, "Error(s) in QoS policy file (%s)\n", - p_subn->opt.qos_policy_file); - osm_qos_policy_destroy(p_subn->p_qos_policy); - p_subn->p_qos_policy = NULL; - res = 1; - goto Exit; - } - - Exit: - if (yyin) - fclose(yyin); - OSM_LOG_EXIT(p_qos_parser_osm_log); - return res; -} - -/*************************************************** - ***************************************************/ - -int yywrap() -{ - return(1); -} - -/*************************************************** - ***************************************************/ - -static void yyerror(const char *format, ...) -{ - char s[256]; - va_list pvar; - - OSM_LOG_ENTER(p_qos_parser_osm_log); - - va_start(pvar, format); - vsnprintf(s, sizeof(s), format, pvar); - va_end(pvar); - - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC05: " - "Syntax error (line %d:%d): %s\n", - line_num, column_num, s); - fprintf(stderr, "Error in QoS Policy File (line %d:%d): %s.\n", - line_num, column_num, s); - OSM_LOG_EXIT(p_qos_parser_osm_log); -} - -/*************************************************** - ***************************************************/ - -static char * __parser_strip_white(char * str) -{ - char *p; - - while (isspace(*str)) - str++; - if (!*str) - return str; - p = str + strlen(str) - 1; - while (isspace(*p)) - *p-- = '\0'; - - return str; -} - -/*************************************************** - ***************************************************/ - -static void __parser_str2uint64(uint64_t * p_val, char * str) -{ - *p_val = strtoull(str, NULL, 0); -} - -/*************************************************** - ***************************************************/ - -static void __parser_port_group_start() -{ - p_current_port_group = osm_qos_policy_port_group_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_port_group_end() -{ - if(!p_current_port_group->name) - { - yyerror("port-group validation failed - no port group name specified"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->port_groups, - p_current_port_group); - p_current_port_group = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_vlarb_scope_start() -{ - p_current_vlarb_scope = osm_qos_policy_vlarb_scope_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_vlarb_scope_end() -{ - if ( !cl_list_count(&p_current_vlarb_scope->group_list) && - !cl_list_count(&p_current_vlarb_scope->across_list) ) - { - yyerror("vlarb-scope validation failed - no port groups specified by 'group' or by 'across'"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->vlarb_tables, - p_current_vlarb_scope); - p_current_vlarb_scope = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_sl2vl_scope_start() -{ - p_current_sl2vl_scope = osm_qos_policy_sl2vl_scope_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_sl2vl_scope_end() -{ - if (!p_current_sl2vl_scope->sl2vl_table_set) - { - yyerror("sl2vl-scope validation failed - no sl2vl table specified"); - return -1; - } - if ( !cl_list_count(&p_current_sl2vl_scope->group_list) && - !cl_list_count(&p_current_sl2vl_scope->across_to_list) && - !cl_list_count(&p_current_sl2vl_scope->across_from_list) ) - { - yyerror("sl2vl-scope validation failed - no port groups specified by 'group', 'across-to' or 'across-from'"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->sl2vl_tables, - p_current_sl2vl_scope); - p_current_sl2vl_scope = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_qos_level_start() -{ - p_current_qos_level = osm_qos_policy_qos_level_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_qos_level_end() -{ - if (!p_current_qos_level->sl_set) - { - yyerror("qos-level validation failed - no 'sl' specified"); - return -1; - } - if (!p_current_qos_level->name) - { - yyerror("qos-level validation failed - no 'name' specified"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->qos_levels, - p_current_qos_level); - p_current_qos_level = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_match_rule_start() -{ - p_current_qos_match_rule = osm_qos_policy_match_rule_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_match_rule_end() -{ - if (!p_current_qos_match_rule->qos_level_name) - { - yyerror("match-rule validation failed - no 'qos-level-name' specified"); - return -1; - } - - cl_list_insert_tail(&p_qos_policy->qos_match_rules, - p_current_qos_match_rule); - p_current_qos_match_rule = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_ulp_match_rule_start() -{ - p_current_qos_match_rule = osm_qos_policy_match_rule_create(); -} - -/*************************************************** - ***************************************************/ - -static int __parser_ulp_match_rule_end() -{ - CL_ASSERT(p_current_qos_match_rule->p_qos_level); - cl_list_insert_tail(&__ulp_match_rules, - p_current_qos_match_rule); - p_current_qos_match_rule = NULL; - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __parser_tmp_struct_init() -{ - tmp_parser_struct.str[0] = '\0'; - cl_list_construct(&tmp_parser_struct.str_list); - cl_list_init(&tmp_parser_struct.str_list, 10); - cl_list_construct(&tmp_parser_struct.num_list); - cl_list_init(&tmp_parser_struct.num_list, 10); - cl_list_construct(&tmp_parser_struct.num_pair_list); - cl_list_init(&tmp_parser_struct.num_pair_list, 10); -} - -/*************************************************** - ***************************************************/ - -/* - * Do NOT free objects from the temp struct. - * Either they are inserted into the parse tree data - * structure, or they are already freed when copying - * their values to the parse tree data structure. - */ -static void __parser_tmp_struct_reset() -{ - tmp_parser_struct.str[0] = '\0'; - cl_list_remove_all(&tmp_parser_struct.str_list); - cl_list_remove_all(&tmp_parser_struct.num_list); - cl_list_remove_all(&tmp_parser_struct.num_pair_list); -} - -/*************************************************** - ***************************************************/ - -static void __parser_tmp_struct_destroy() -{ - __parser_tmp_struct_reset(); - cl_list_destroy(&tmp_parser_struct.str_list); - cl_list_destroy(&tmp_parser_struct.num_list); - cl_list_destroy(&tmp_parser_struct.num_pair_list); -} - -/*************************************************** - ***************************************************/ - -#define __SIMPLE_QOS_LEVEL_NAME "SimpleQoSLevel_SL" -#define __SIMPLE_QOS_LEVEL_DEFAULT_NAME "SimpleQoSLevel_DEFAULT" - -static void __setup_simple_qos_levels() -{ - uint8_t i; - char tmp_buf[30]; - memset(osm_qos_policy_simple_qos_levels, 0, - sizeof(osm_qos_policy_simple_qos_levels)); - for (i = 0; i < 16; i++) - { - osm_qos_policy_simple_qos_levels[i].sl = i; - osm_qos_policy_simple_qos_levels[i].sl_set = TRUE; - sprintf(tmp_buf, "%s%u", __SIMPLE_QOS_LEVEL_NAME, i); - osm_qos_policy_simple_qos_levels[i].name = strdup(tmp_buf); - } - - memset(&__default_simple_qos_level, 0, - sizeof(__default_simple_qos_level)); - __default_simple_qos_level.name = - strdup(__SIMPLE_QOS_LEVEL_DEFAULT_NAME); -} - -/*************************************************** - ***************************************************/ - -static void __clear_simple_qos_levels() -{ - /* - * Simple QoS levels are static. - * What's left is to invalidate default simple QoS level. - */ - __default_simple_qos_level.sl_set = FALSE; -} - -/*************************************************** - ***************************************************/ - -static void __setup_ulp_match_rules() -{ - cl_list_construct(&__ulp_match_rules); - cl_list_init(&__ulp_match_rules, 10); -} - -/*************************************************** - ***************************************************/ - -static void __process_ulp_match_rules() -{ - cl_list_iterator_t list_iterator; - osm_qos_match_rule_t *p_qos_match_rule = NULL; - - list_iterator = cl_list_head(&__ulp_match_rules); - while (list_iterator != cl_list_end(&__ulp_match_rules)) - { - p_qos_match_rule = (osm_qos_match_rule_t *) cl_list_obj(list_iterator); - if (p_qos_match_rule) - cl_list_insert_tail(&p_qos_policy->qos_match_rules, - p_qos_match_rule); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&__ulp_match_rules); -} - -/*************************************************** - ***************************************************/ - -static int __cdecl __cmp_num_range(const void * p1, const void * p2) -{ - uint64_t * pair1 = *((uint64_t **)p1); - uint64_t * pair2 = *((uint64_t **)p2); - - if (pair1[0] < pair2[0]) - return -1; - if (pair1[0] > pair2[0]) - return 1; - - if (pair1[1] < pair2[1]) - return -1; - if (pair1[1] > pair2[1]) - return 1; - - return 0; -} - -/*************************************************** - ***************************************************/ - -static void __sort_reduce_rangearr( - uint64_t ** arr, - unsigned arr_len, - uint64_t ** * p_res_arr, - unsigned * p_res_arr_len ) -{ - unsigned i = 0; - unsigned j = 0; - unsigned last_valid_ind = 0; - unsigned valid_cnt = 0; - uint64_t ** res_arr; - boolean_t * is_valid_arr; - - *p_res_arr = NULL; - *p_res_arr_len = 0; - - qsort(arr, arr_len, sizeof(uint64_t*), __cmp_num_range); - - is_valid_arr = (boolean_t *)malloc(arr_len * sizeof(boolean_t)); - is_valid_arr[last_valid_ind] = TRUE; - valid_cnt++; - for (i = 1; i < arr_len; i++) - { - if (arr[i][0] <= arr[last_valid_ind][1]) - { - if (arr[i][1] > arr[last_valid_ind][1]) - arr[last_valid_ind][1] = arr[i][1]; - free(arr[i]); - arr[i] = NULL; - is_valid_arr[i] = FALSE; - } - else if ((arr[i][0] - 1) == arr[last_valid_ind][1]) - { - arr[last_valid_ind][1] = arr[i][1]; - free(arr[i]); - arr[i] = NULL; - is_valid_arr[i] = FALSE; - } - else - { - is_valid_arr[i] = TRUE; - last_valid_ind = i; - valid_cnt++; - } - } - - res_arr = (uint64_t **)malloc(valid_cnt * sizeof(uint64_t *)); - for (i = 0; i < arr_len; i++) - { - if (is_valid_arr[i]) - res_arr[j++] = arr[i]; - } - free(is_valid_arr); - free(arr); - - *p_res_arr = res_arr; - *p_res_arr_len = valid_cnt; -} - -/*************************************************** - ***************************************************/ - -static void __pkey_rangelist2rangearr( - cl_list_t * p_list, - uint64_t ** * p_arr, - unsigned * p_arr_len) -{ - uint64_t tmp_pkey; - uint64_t * p_pkeys; - cl_list_iterator_t list_iterator; - - list_iterator= cl_list_head(p_list); - while( list_iterator != cl_list_end(p_list) ) - { - p_pkeys = (uint64_t *)cl_list_obj(list_iterator); - p_pkeys[0] &= 0x7fff; - p_pkeys[1] &= 0x7fff; - if (p_pkeys[0] > p_pkeys[1]) - { - tmp_pkey = p_pkeys[1]; - p_pkeys[1] = p_pkeys[0]; - p_pkeys[0] = tmp_pkey; - } - list_iterator = cl_list_next(list_iterator); - } - - __rangelist2rangearr(p_list, p_arr, p_arr_len); -} - -/*************************************************** - ***************************************************/ - -static void __rangelist2rangearr( - cl_list_t * p_list, - uint64_t ** * p_arr, - unsigned * p_arr_len) -{ - cl_list_iterator_t list_iterator; - unsigned len = cl_list_count(p_list); - unsigned i = 0; - uint64_t ** tmp_arr; - uint64_t ** res_arr = NULL; - unsigned res_arr_len = 0; - - tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *)); - - list_iterator = cl_list_head(p_list); - while( list_iterator != cl_list_end(p_list) ) - { - tmp_arr[i++] = (uint64_t *)cl_list_obj(list_iterator); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(p_list); - - __sort_reduce_rangearr( tmp_arr, - len, - &res_arr, - &res_arr_len ); - *p_arr = res_arr; - *p_arr_len = res_arr_len; -} - -/*************************************************** - ***************************************************/ - -static void __merge_rangearr( - uint64_t ** range_arr_1, - unsigned range_len_1, - uint64_t ** range_arr_2, - unsigned range_len_2, - uint64_t ** * p_arr, - unsigned * p_arr_len ) -{ - unsigned i = 0; - unsigned j = 0; - unsigned len = range_len_1 + range_len_2; - uint64_t ** tmp_arr; - uint64_t ** res_arr = NULL; - unsigned res_arr_len = 0; - - *p_arr = NULL; - *p_arr_len = 0; - - tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *)); - - for (i = 0; i < range_len_1; i++) - tmp_arr[j++] = range_arr_1[i]; - for (i = 0; i < range_len_2; i++) - tmp_arr[j++] = range_arr_2[i]; - free(range_arr_1); - free(range_arr_2); - - __sort_reduce_rangearr( tmp_arr, - len, - &res_arr, - &res_arr_len ); - *p_arr = res_arr; - *p_arr_len = res_arr_len; -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_port_to_port_map( - cl_qmap_t * p_map, - osm_physp_t * p_physp) -{ - if (cl_qmap_get(p_map, cl_ntoh64(osm_physp_get_port_guid(p_physp))) == - cl_qmap_end(p_map)) - { - osm_qos_port_t * p_port = osm_qos_policy_port_create(p_physp); - if (p_port) - cl_qmap_insert(p_map, - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - &p_port->map_item); - } -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_guid_range_to_port_map( - cl_qmap_t * p_map, - uint64_t ** range_arr, - unsigned range_len) -{ - unsigned i; - uint64_t guid_ho; - osm_port_t * p_osm_port; - - if (!range_arr || !range_len) - return; - - for (i = 0; i < range_len; i++) { - for (guid_ho = range_arr[i][0]; guid_ho <= range_arr[i][1]; guid_ho++) { - p_osm_port = - osm_get_port_by_guid(p_qos_policy->p_subn, cl_hton64(guid_ho)); - if (p_osm_port) - __parser_add_port_to_port_map(p_map, p_osm_port->p_physp); - } - free(range_arr[i]); - } - free(range_arr); -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_pkey_range_to_port_map( - cl_qmap_t * p_map, - uint64_t ** range_arr, - unsigned range_len) -{ - unsigned i; - uint64_t pkey_64; - ib_net16_t pkey; - osm_prtn_t * p_prtn; - - if (!range_arr || !range_len) - return; - - for (i = 0; i < range_len; i++) { - for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) { - pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff)); - p_prtn = (osm_prtn_t *) - cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey); - if (p_prtn != (osm_prtn_t *)cl_qmap_end( - &p_qos_policy->p_subn->prtn_pkey_tbl)) { - __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl); - __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl); - } - } - free(range_arr[i]); - } - free(range_arr); -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_partition_list_to_port_map( - cl_qmap_t * p_map, - cl_list_t * p_list) -{ - cl_list_iterator_t list_iterator; - char * tmp_str; - osm_prtn_t * p_prtn; - - /* extract all the ports from the partition - to the port map of this port group */ - list_iterator = cl_list_head(p_list); - while(list_iterator != cl_list_end(p_list)) { - tmp_str = (char*)cl_list_obj(list_iterator); - if (tmp_str) { - p_prtn = osm_prtn_find_by_name(p_qos_policy->p_subn, tmp_str); - if (p_prtn) { - __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl); - __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl); - } - free(tmp_str); - } - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(p_list); -} - -/*************************************************** - ***************************************************/ - -static void __parser_add_map_to_port_map( - cl_qmap_t * p_dmap, - cl_map_t * p_smap) -{ - cl_map_iterator_t map_iterator; - osm_physp_t * p_physp; - - if (!p_dmap || !p_smap) - return; - - map_iterator = cl_map_head(p_smap); - while (map_iterator != cl_map_end(p_smap)) { - p_physp = (osm_physp_t*)cl_map_obj(map_iterator); - __parser_add_port_to_port_map(p_dmap, p_physp); - map_iterator = cl_map_next(map_iterator); - } -} - -/*************************************************** - ***************************************************/ - -static int __validate_pkeys( uint64_t ** range_arr, - unsigned range_len, - boolean_t is_ipoib) -{ - unsigned i; - uint64_t pkey_64; - ib_net16_t pkey; - osm_prtn_t * p_prtn; - - if (!range_arr || !range_len) - return 0; - - for (i = 0; i < range_len; i++) { - for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) { - pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff)); - p_prtn = (osm_prtn_t *) - cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey); - - if (p_prtn == (osm_prtn_t *)cl_qmap_end( - &p_qos_policy->p_subn->prtn_pkey_tbl)) - p_prtn = NULL; - - if (is_ipoib) { - /* - * Be very strict for IPoIB partition: - * - the partition for the pkey have to exist - * - it has to have at least 2 full members - */ - if (!p_prtn) { - yyerror("IPoIB partition, pkey 0x%04X - " - "partition doesn't exist", - cl_ntoh16(pkey)); - return 1; - } - else if (cl_map_count(&p_prtn->full_guid_tbl) < 2) { - yyerror("IPoIB partition, pkey 0x%04X - " - "partition has less than two full members", - cl_ntoh16(pkey)); - return 1; - } - } - else if (!p_prtn) { - /* - * For non-IPoIB pkey we just want to check that - * the relevant partition exists. - * And even if it doesn't, don't exit - just print - * error message and continue. - */ - OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC02: " - "pkey 0x%04X - partition doesn't exist", - cl_ntoh16(pkey)); - } - } - } - return 0; -} - -/*************************************************** - ***************************************************/ diff --git a/branches/opensm_3/user/opensm/osm_qos_policy.c b/branches/opensm_3/user/opensm/osm_qos_policy.c deleted file mode 100644 index 8156c9df..00000000 --- a/branches/opensm_3/user/opensm/osm_qos_policy.c +++ /dev/null @@ -1,1057 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * OSM QoS Policy functions. - * - * Author: - * Yevgeny Kliteynik, Mellanox - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern osm_qos_level_t __default_simple_qos_level; - -/*************************************************** - ***************************************************/ - -static void -__build_nodebyname_hash(osm_qos_policy_t * p_qos_policy) -{ - osm_node_t * p_node; - cl_qmap_t * p_node_guid_tbl = &p_qos_policy->p_subn->node_guid_tbl; - - p_qos_policy->p_node_hash = st_init_strtable(); - CL_ASSERT(p_qos_policy->p_node_hash); - - if (!p_node_guid_tbl || !cl_qmap_count(p_node_guid_tbl)) - return; - - for (p_node = (osm_node_t *) cl_qmap_head(p_node_guid_tbl); - p_node != (osm_node_t *) cl_qmap_end(p_node_guid_tbl); - p_node = (osm_node_t *) cl_qmap_next(&p_node->map_item)) { - if (!st_lookup(p_qos_policy->p_node_hash, - (st_data_t)p_node->print_desc, NULL)) - st_insert(p_qos_policy->p_node_hash, - (st_data_t)p_node->print_desc, - (st_data_t)p_node); - } -} - -/*************************************************** - ***************************************************/ - -static boolean_t -__is_num_in_range_arr(uint64_t ** range_arr, - unsigned range_arr_len, uint64_t num) -{ - unsigned ind_1 = 0; - unsigned ind_2 = range_arr_len - 1; - unsigned ind_mid; - - if (!range_arr || !range_arr_len) - return FALSE; - - while (ind_1 <= ind_2) { - if (num < range_arr[ind_1][0] || num > range_arr[ind_2][1]) - return FALSE; - else if (num <= range_arr[ind_1][1] || num >= range_arr[ind_2][0]) - return TRUE; - - ind_mid = ind_1 + (ind_2 - ind_1 + 1)/2; - - if (num < range_arr[ind_mid][0]) - ind_2 = ind_mid; - else if (num > range_arr[ind_mid][1]) - ind_1 = ind_mid; - else - return TRUE; - - ind_1++; - ind_2--; - } - - return FALSE; -} - -/*************************************************** - ***************************************************/ - -static void __free_single_element(void *p_element, void *context) -{ - if (p_element) - free(p_element); -} - -/*************************************************** - ***************************************************/ - -osm_qos_port_t *osm_qos_policy_port_create(osm_physp_t *p_physp) -{ - osm_qos_port_t *p = - (osm_qos_port_t *) calloc(1, sizeof(osm_qos_port_t)); - if (p) - p->p_physp = p_physp; - return p; -} - -/*************************************************** - ***************************************************/ - -osm_qos_port_group_t *osm_qos_policy_port_group_create() -{ - osm_qos_port_group_t *p = - (osm_qos_port_group_t *) calloc(1, sizeof(osm_qos_port_group_t)); - if (p) - cl_qmap_init(&p->port_map); - return p; -} - -/*************************************************** - ***************************************************/ - -void osm_qos_policy_port_group_destroy(osm_qos_port_group_t * p) -{ - osm_qos_port_t * p_port; - osm_qos_port_t * p_old_port; - - if (!p) - return; - - if (p->name) - free(p->name); - if (p->use) - free(p->use); - - p_port = (osm_qos_port_t *) cl_qmap_head(&p->port_map); - while (p_port != (osm_qos_port_t *) cl_qmap_end(&p->port_map)) - { - p_old_port = p_port; - p_port = (osm_qos_port_t *) cl_qmap_next(&p_port->map_item); - free(p_old_port); - } - cl_qmap_remove_all(&p->port_map); - - free(p); -} - -/*************************************************** - ***************************************************/ - -osm_qos_vlarb_scope_t *osm_qos_policy_vlarb_scope_create() -{ - osm_qos_vlarb_scope_t *p = - (osm_qos_vlarb_scope_t *) calloc(1, sizeof(osm_qos_vlarb_scope_t)); - if (p) { - cl_list_init(&p->group_list, 10); - cl_list_init(&p->across_list, 10); - cl_list_init(&p->vlarb_high_list, 10); - cl_list_init(&p->vlarb_low_list, 10); - } - return p; -} - -/*************************************************** - ***************************************************/ - -void osm_qos_policy_vlarb_scope_destroy(osm_qos_vlarb_scope_t * p) -{ - if (!p) - return; - - cl_list_apply_func(&p->group_list, __free_single_element, NULL); - cl_list_apply_func(&p->across_list, __free_single_element, NULL); - cl_list_apply_func(&p->vlarb_high_list, __free_single_element, NULL); - cl_list_apply_func(&p->vlarb_low_list, __free_single_element, NULL); - - cl_list_remove_all(&p->group_list); - cl_list_remove_all(&p->across_list); - cl_list_remove_all(&p->vlarb_high_list); - cl_list_remove_all(&p->vlarb_low_list); - - cl_list_destroy(&p->group_list); - cl_list_destroy(&p->across_list); - cl_list_destroy(&p->vlarb_high_list); - cl_list_destroy(&p->vlarb_low_list); - - free(p); -} - -/*************************************************** - ***************************************************/ - -osm_qos_sl2vl_scope_t *osm_qos_policy_sl2vl_scope_create() -{ - osm_qos_sl2vl_scope_t *p = - (osm_qos_sl2vl_scope_t *) calloc(1, sizeof(osm_qos_sl2vl_scope_t)); - if (p) { - cl_list_init(&p->group_list, 10); - cl_list_init(&p->across_from_list, 10); - cl_list_init(&p->across_to_list, 10); - } - return p; -} - -/*************************************************** - ***************************************************/ - -void osm_qos_policy_sl2vl_scope_destroy(osm_qos_sl2vl_scope_t * p) -{ - if (!p) - return; - - cl_list_apply_func(&p->group_list, __free_single_element, NULL); - cl_list_apply_func(&p->across_from_list, __free_single_element, NULL); - cl_list_apply_func(&p->across_to_list, __free_single_element, NULL); - - cl_list_remove_all(&p->group_list); - cl_list_remove_all(&p->across_from_list); - cl_list_remove_all(&p->across_to_list); - - cl_list_destroy(&p->group_list); - cl_list_destroy(&p->across_from_list); - cl_list_destroy(&p->across_to_list); - - free(p); -} - -/*************************************************** - ***************************************************/ - -osm_qos_level_t *osm_qos_policy_qos_level_create() -{ - osm_qos_level_t *p = - (osm_qos_level_t *) calloc(1, sizeof(osm_qos_level_t)); - return p; -} - -/*************************************************** - ***************************************************/ - -void osm_qos_policy_qos_level_destroy(osm_qos_level_t * p) -{ - unsigned i; - - if (!p) - return; - - if (p->name) - free(p->name); - if (p->use) - free(p->use); - - for (i = 0; i < p->path_bits_range_len; i++) - free(p->path_bits_range_arr[i]); - if (p->path_bits_range_arr) - free(p->path_bits_range_arr); - - free(p); -} - -/*************************************************** - ***************************************************/ - -boolean_t osm_qos_level_has_pkey(IN const osm_qos_level_t * p_qos_level, - IN ib_net16_t pkey) -{ - if (!p_qos_level || !p_qos_level->pkey_range_len) - return FALSE; - return __is_num_in_range_arr(p_qos_level->pkey_range_arr, - p_qos_level->pkey_range_len, - cl_ntoh16(ib_pkey_get_base(pkey))); -} - -/*************************************************** - ***************************************************/ - -ib_net16_t osm_qos_level_get_shared_pkey(IN const osm_qos_level_t * p_qos_level, - IN const osm_physp_t * p_src_physp, - IN const osm_physp_t * p_dest_physp) -{ - unsigned i; - uint16_t pkey_ho = 0; - - if (!p_qos_level || !p_qos_level->pkey_range_len) - return 0; - - /* - * ToDo: This approach is not optimal. - * Think how to find shared pkey that also exists - * in QoS level in less runtime. - */ - - for (i = 0; i < p_qos_level->pkey_range_len; i++) { - for (pkey_ho = p_qos_level->pkey_range_arr[i][0]; - pkey_ho <= p_qos_level->pkey_range_arr[i][1]; pkey_ho++) { - if (osm_physp_share_this_pkey - (p_src_physp, p_dest_physp, cl_hton16(pkey_ho))) - return cl_hton16(pkey_ho); - } - } - - return 0; -} - -/*************************************************** - ***************************************************/ - -osm_qos_match_rule_t *osm_qos_policy_match_rule_create() -{ - osm_qos_match_rule_t *p = - (osm_qos_match_rule_t *) calloc(1, sizeof(osm_qos_match_rule_t)); - if (p) { - cl_list_init(&p->source_list, 10); - cl_list_init(&p->source_group_list, 10); - cl_list_init(&p->destination_list, 10); - cl_list_init(&p->destination_group_list, 10); - } - return p; -} - -/*************************************************** - ***************************************************/ - -void osm_qos_policy_match_rule_destroy(osm_qos_match_rule_t * p) -{ - unsigned i; - - if (!p) - return; - - if (p->qos_level_name) - free(p->qos_level_name); - if (p->use) - free(p->use); - - for (i = 0; i < p->service_id_range_len; i++) - free(p->service_id_range_arr[i]); - if (p->service_id_range_arr) - free(p->service_id_range_arr); - - for (i = 0; i < p->qos_class_range_len; i++) - free(p->qos_class_range_arr[i]); - if (p->qos_class_range_arr) - free(p->qos_class_range_arr); - - for (i = 0; i < p->pkey_range_len; i++) - free(p->pkey_range_arr[i]); - if (p->pkey_range_arr) - free(p->pkey_range_arr); - - cl_list_apply_func(&p->source_list, __free_single_element, NULL); - cl_list_remove_all(&p->source_list); - cl_list_destroy(&p->source_list); - - cl_list_remove_all(&p->source_group_list); - cl_list_destroy(&p->source_group_list); - - cl_list_apply_func(&p->destination_list, __free_single_element, NULL); - cl_list_remove_all(&p->destination_list); - cl_list_destroy(&p->destination_list); - - cl_list_remove_all(&p->destination_group_list); - cl_list_destroy(&p->destination_group_list); - - free(p); -} - -/*************************************************** - ***************************************************/ - -osm_qos_policy_t * osm_qos_policy_create(osm_subn_t * p_subn) -{ - osm_qos_policy_t * p_qos_policy = (osm_qos_policy_t *)calloc(1, sizeof(osm_qos_policy_t)); - if (!p_qos_policy) - return NULL; - - cl_list_construct(&p_qos_policy->port_groups); - cl_list_init(&p_qos_policy->port_groups, 10); - - cl_list_construct(&p_qos_policy->vlarb_tables); - cl_list_init(&p_qos_policy->vlarb_tables, 10); - - cl_list_construct(&p_qos_policy->sl2vl_tables); - cl_list_init(&p_qos_policy->sl2vl_tables, 10); - - cl_list_construct(&p_qos_policy->qos_levels); - cl_list_init(&p_qos_policy->qos_levels, 10); - - cl_list_construct(&p_qos_policy->qos_match_rules); - cl_list_init(&p_qos_policy->qos_match_rules, 10); - - p_qos_policy->p_subn = p_subn; - __build_nodebyname_hash(p_qos_policy); - - return p_qos_policy; -} - -/*************************************************** - ***************************************************/ - -void osm_qos_policy_destroy(osm_qos_policy_t * p_qos_policy) -{ - cl_list_iterator_t list_iterator; - osm_qos_port_group_t *p_port_group = NULL; - osm_qos_vlarb_scope_t *p_vlarb_scope = NULL; - osm_qos_sl2vl_scope_t *p_sl2vl_scope = NULL; - osm_qos_level_t *p_qos_level = NULL; - osm_qos_match_rule_t *p_qos_match_rule = NULL; - - if (!p_qos_policy) - return; - - list_iterator = cl_list_head(&p_qos_policy->port_groups); - while (list_iterator != cl_list_end(&p_qos_policy->port_groups)) { - p_port_group = - (osm_qos_port_group_t *) cl_list_obj(list_iterator); - if (p_port_group) - osm_qos_policy_port_group_destroy(p_port_group); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&p_qos_policy->port_groups); - cl_list_destroy(&p_qos_policy->port_groups); - - list_iterator = cl_list_head(&p_qos_policy->vlarb_tables); - while (list_iterator != cl_list_end(&p_qos_policy->vlarb_tables)) { - p_vlarb_scope = - (osm_qos_vlarb_scope_t *) cl_list_obj(list_iterator); - if (p_vlarb_scope) - osm_qos_policy_vlarb_scope_destroy(p_vlarb_scope); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&p_qos_policy->vlarb_tables); - cl_list_destroy(&p_qos_policy->vlarb_tables); - - list_iterator = cl_list_head(&p_qos_policy->sl2vl_tables); - while (list_iterator != cl_list_end(&p_qos_policy->sl2vl_tables)) { - p_sl2vl_scope = - (osm_qos_sl2vl_scope_t *) cl_list_obj(list_iterator); - if (p_sl2vl_scope) - osm_qos_policy_sl2vl_scope_destroy(p_sl2vl_scope); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&p_qos_policy->sl2vl_tables); - cl_list_destroy(&p_qos_policy->sl2vl_tables); - - list_iterator = cl_list_head(&p_qos_policy->qos_levels); - while (list_iterator != cl_list_end(&p_qos_policy->qos_levels)) { - p_qos_level = (osm_qos_level_t *) cl_list_obj(list_iterator); - if (p_qos_level) - osm_qos_policy_qos_level_destroy(p_qos_level); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&p_qos_policy->qos_levels); - cl_list_destroy(&p_qos_policy->qos_levels); - - list_iterator = cl_list_head(&p_qos_policy->qos_match_rules); - while (list_iterator != cl_list_end(&p_qos_policy->qos_match_rules)) { - p_qos_match_rule = - (osm_qos_match_rule_t *) cl_list_obj(list_iterator); - if (p_qos_match_rule) - osm_qos_policy_match_rule_destroy(p_qos_match_rule); - list_iterator = cl_list_next(list_iterator); - } - cl_list_remove_all(&p_qos_policy->qos_match_rules); - cl_list_destroy(&p_qos_policy->qos_match_rules); - - if (p_qos_policy->p_node_hash) - st_free_table(p_qos_policy->p_node_hash); - - free(p_qos_policy); - - p_qos_policy = NULL; -} - -/*************************************************** - ***************************************************/ - -static boolean_t -__qos_policy_is_port_in_group(osm_subn_t * p_subn, - const osm_physp_t * p_physp, - osm_qos_port_group_t * p_port_group) -{ - osm_node_t *p_node = osm_physp_get_node_ptr(p_physp); - ib_net64_t port_guid = osm_physp_get_port_guid(p_physp); - uint64_t port_guid_ho = cl_ntoh64(port_guid); - - /* check whether this port's type matches any of group's types */ - - if ( p_port_group->node_types & - (((uint8_t)1)<port_map, port_guid_ho) != - cl_qmap_end(&p_port_group->port_map)) - return TRUE; - - return FALSE; -} /* __qos_policy_is_port_in_group() */ - -/*************************************************** - ***************************************************/ - -static boolean_t -__qos_policy_is_port_in_group_list(const osm_qos_policy_t * p_qos_policy, - const osm_physp_t * p_physp, - cl_list_t * p_port_group_list) -{ - osm_qos_port_group_t *p_port_group; - cl_list_iterator_t list_iterator; - - list_iterator = cl_list_head(p_port_group_list); - while (list_iterator != cl_list_end(p_port_group_list)) { - p_port_group = - (osm_qos_port_group_t *) cl_list_obj(list_iterator); - if (p_port_group) { - if (__qos_policy_is_port_in_group - (p_qos_policy->p_subn, p_physp, p_port_group)) - return TRUE; - } - list_iterator = cl_list_next(list_iterator); - } - return FALSE; -} - -/*************************************************** - ***************************************************/ - -static osm_qos_match_rule_t *__qos_policy_get_match_rule_by_params( - const osm_qos_policy_t * p_qos_policy, - uint64_t service_id, - uint16_t qos_class, - uint16_t pkey, - const osm_physp_t * p_src_physp, - const osm_physp_t * p_dest_physp, - ib_net64_t comp_mask) -{ - osm_qos_match_rule_t *p_qos_match_rule = NULL; - cl_list_iterator_t list_iterator; - osm_log_t * p_log = &p_qos_policy->p_subn->p_osm->log; - - boolean_t matched_by_sguid = FALSE, - matched_by_dguid = FALSE, - matched_by_class = FALSE, - matched_by_sid = FALSE, - matched_by_pkey = FALSE; - - if (!cl_list_count(&p_qos_policy->qos_match_rules)) - return NULL; - - OSM_LOG_ENTER(p_log); - - /* Go over all QoS match rules and find the one that matches the request */ - - list_iterator = cl_list_head(&p_qos_policy->qos_match_rules); - while (list_iterator != cl_list_end(&p_qos_policy->qos_match_rules)) { - p_qos_match_rule = - (osm_qos_match_rule_t *) cl_list_obj(list_iterator); - if (!p_qos_match_rule) { - list_iterator = cl_list_next(list_iterator); - continue; - } - - /* If a match rule has Source groups, PR request source has to be in this list */ - - if (cl_list_count(&p_qos_match_rule->source_group_list)) { - if (!__qos_policy_is_port_in_group_list(p_qos_policy, - p_src_physp, - &p_qos_match_rule-> - source_group_list)) - { - list_iterator = cl_list_next(list_iterator); - continue; - } - matched_by_sguid = TRUE; - } - - /* If a match rule has Destination groups, PR request dest. has to be in this list */ - - if (cl_list_count(&p_qos_match_rule->destination_group_list)) { - if (!__qos_policy_is_port_in_group_list(p_qos_policy, - p_dest_physp, - &p_qos_match_rule-> - destination_group_list)) - { - list_iterator = cl_list_next(list_iterator); - continue; - } - matched_by_dguid = TRUE; - } - - /* If a match rule has QoS classes, PR request HAS - to have a matching QoS class to match the rule */ - - if (p_qos_match_rule->qos_class_range_len) { - if (!(comp_mask & IB_PR_COMPMASK_QOS_CLASS)) { - list_iterator = cl_list_next(list_iterator); - continue; - } - - if (!__is_num_in_range_arr - (p_qos_match_rule->qos_class_range_arr, - p_qos_match_rule->qos_class_range_len, - qos_class)) { - list_iterator = cl_list_next(list_iterator); - continue; - } - matched_by_class = TRUE; - } - - /* If a match rule has Service IDs, PR request HAS - to have a matching Service ID to match the rule */ - - if (p_qos_match_rule->service_id_range_len) { - if (!(comp_mask & IB_PR_COMPMASK_SERVICEID_MSB) || - !(comp_mask & IB_PR_COMPMASK_SERVICEID_LSB)) { - list_iterator = cl_list_next(list_iterator); - continue; - } - - if (!__is_num_in_range_arr - (p_qos_match_rule->service_id_range_arr, - p_qos_match_rule->service_id_range_len, - service_id)) { - list_iterator = cl_list_next(list_iterator); - continue; - } - matched_by_sid = TRUE; - } - - /* If a match rule has PKeys, PR request HAS - to have a matching PKey to match the rule */ - - if (p_qos_match_rule->pkey_range_len) { - if (!(comp_mask & IB_PR_COMPMASK_PKEY)) { - list_iterator = cl_list_next(list_iterator); - continue; - } - - if (!__is_num_in_range_arr - (p_qos_match_rule->pkey_range_arr, - p_qos_match_rule->pkey_range_len, - pkey & 0x7FFF)) { - list_iterator = cl_list_next(list_iterator); - continue; - } - matched_by_pkey = TRUE; - } - - /* if we got here, then this match-rule matched this PR request */ - break; - } - - if (list_iterator == cl_list_end(&p_qos_policy->qos_match_rules)) - p_qos_match_rule = NULL; - - if (p_qos_match_rule) - OSM_LOG(p_log, OSM_LOG_DEBUG, - "request matched rule (%s) by:%s%s%s%s%s\n", - (p_qos_match_rule->use) ? - p_qos_match_rule->use : "no description", - (matched_by_sguid) ? " SGUID" : "", - (matched_by_dguid) ? " DGUID" : "", - (matched_by_class) ? " QoS_Class" : "", - (matched_by_sid) ? " ServiceID" : "", - (matched_by_pkey) ? " PKey" : ""); - else - OSM_LOG(p_log, OSM_LOG_DEBUG, - "request not matched any rule\n"); - - OSM_LOG_EXIT(p_log); - return p_qos_match_rule; -} /* __qos_policy_get_match_rule_by_params() */ - -/*************************************************** - ***************************************************/ - -static osm_qos_level_t *__qos_policy_get_qos_level_by_name( - const osm_qos_policy_t * p_qos_policy, - char *name) -{ - osm_qos_level_t *p_qos_level = NULL; - cl_list_iterator_t list_iterator; - - list_iterator = cl_list_head(&p_qos_policy->qos_levels); - while (list_iterator != cl_list_end(&p_qos_policy->qos_levels)) { - p_qos_level = (osm_qos_level_t *) cl_list_obj(list_iterator); - if (!p_qos_level) - continue; - - /* names are case INsensitive */ - if (strcasecmp(name, p_qos_level->name) == 0) - return p_qos_level; - - list_iterator = cl_list_next(list_iterator); - } - - return NULL; -} - -/*************************************************** - ***************************************************/ - -static osm_qos_port_group_t *__qos_policy_get_port_group_by_name( - const osm_qos_policy_t * p_qos_policy, - const char *const name) -{ - osm_qos_port_group_t *p_port_group = NULL; - cl_list_iterator_t list_iterator; - - list_iterator = cl_list_head(&p_qos_policy->port_groups); - while (list_iterator != cl_list_end(&p_qos_policy->port_groups)) { - p_port_group = - (osm_qos_port_group_t *) cl_list_obj(list_iterator); - if (!p_port_group) - continue; - - /* names are case INsensitive */ - if (strcasecmp(name, p_port_group->name) == 0) - return p_port_group; - - list_iterator = cl_list_next(list_iterator); - } - - return NULL; -} - -/*************************************************** - ***************************************************/ - -static void __qos_policy_validate_pkey( - osm_qos_policy_t * p_qos_policy, - osm_qos_match_rule_t * p_qos_match_rule, - osm_prtn_t * p_prtn) -{ - uint8_t sl; - uint32_t flow; - uint8_t hop; - - if (!p_qos_policy || !p_qos_match_rule || !p_prtn) - return; - - if (!p_qos_match_rule->p_qos_level->sl_set || - p_prtn->sl == p_qos_match_rule->p_qos_level->sl) - return; - - /* overriding partition's SL */ - OSM_LOG(&p_qos_policy->p_subn->p_osm->log, OSM_LOG_ERROR, - "ERR AC15: pkey 0x%04X in match rule - " - "overriding partition SL (%u) with QoS Level SL (%u)\n", - cl_ntoh16(p_prtn->pkey), p_prtn->sl, - p_qos_match_rule->p_qos_level->sl); - p_prtn->sl = p_qos_match_rule->p_qos_level->sl; - - - /* If this partition is an IPoIB partition, there should - be a matching MCast group. Fix this group's SL too */ - if (!p_prtn->mgrp) - return; - - CL_ASSERT((cl_ntoh16(p_prtn->mgrp->mcmember_rec.pkey) & 0x7fff) == - (cl_ntoh16(p_prtn->pkey) & 0x7fff)); - - ib_member_get_sl_flow_hop(p_prtn->mgrp->mcmember_rec.sl_flow_hop, - &sl, &flow, &hop); - if (sl != p_prtn->sl) { - OSM_LOG(&p_qos_policy->p_subn->p_osm->log, OSM_LOG_DEBUG, - "Updating MCGroup (MLID 0x%04x) SL to " - "match partition SL (%u)\n", - cl_hton16(p_prtn->mgrp->mcmember_rec.mlid), - p_prtn->sl); - p_prtn->mgrp->mcmember_rec.sl_flow_hop = - ib_member_set_sl_flow_hop(p_prtn->sl, flow, hop); - } -} - -/*************************************************** - ***************************************************/ - -int osm_qos_policy_validate(osm_qos_policy_t * p_qos_policy, - osm_log_t *p_log) -{ - cl_list_iterator_t match_rules_list_iterator; - cl_list_iterator_t list_iterator; - osm_qos_port_group_t *p_port_group = NULL; - osm_qos_match_rule_t *p_qos_match_rule = NULL; - char *str; - unsigned i, j; - int res = 0; - uint64_t pkey_64; - ib_net16_t pkey; - osm_prtn_t * p_prtn; - - OSM_LOG_ENTER(p_log); - - /* set default qos level */ - - p_qos_policy->p_default_qos_level = - __qos_policy_get_qos_level_by_name(p_qos_policy, OSM_QOS_POLICY_DEFAULT_LEVEL_NAME); - if (!p_qos_policy->p_default_qos_level) { - /* There's no default QoS level in the usual qos-level section. - Check whether the 'simple' default QoS level that can be - defined in the qos-ulp section exists */ - if (__default_simple_qos_level.sl_set) { - p_qos_policy->p_default_qos_level = &__default_simple_qos_level; - } - else { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR AC10: " - "Default qos-level (%s) not defined.\n", - OSM_QOS_POLICY_DEFAULT_LEVEL_NAME); - res = 1; - goto Exit; - } - } - - /* scan all the match rules, and fill the lists of pointers to - relevant qos levels and port groups to speed up PR matching */ - - i = 1; - match_rules_list_iterator = - cl_list_head(&p_qos_policy->qos_match_rules); - while (match_rules_list_iterator != - cl_list_end(&p_qos_policy->qos_match_rules)) { - p_qos_match_rule = - (osm_qos_match_rule_t *) - cl_list_obj(match_rules_list_iterator); - CL_ASSERT(p_qos_match_rule); - - /* find the matching qos-level for each match-rule */ - - if (!p_qos_match_rule->p_qos_level) - p_qos_match_rule->p_qos_level = - __qos_policy_get_qos_level_by_name(p_qos_policy, - p_qos_match_rule->qos_level_name); - - if (!p_qos_match_rule->p_qos_level) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR AC11: " - "qos-match-rule num %u: qos-level '%s' not found\n", - i, p_qos_match_rule->qos_level_name); - res = 1; - goto Exit; - } - - /* find the matching port-group for element of source_list */ - - if (cl_list_count(&p_qos_match_rule->source_list)) { - list_iterator = - cl_list_head(&p_qos_match_rule->source_list); - while (list_iterator != - cl_list_end(&p_qos_match_rule->source_list)) { - str = (char *)cl_list_obj(list_iterator); - CL_ASSERT(str); - - p_port_group = - __qos_policy_get_port_group_by_name(p_qos_policy, str); - if (!p_port_group) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR AC12: " - "qos-match-rule num %u: source port-group '%s' not found\n", - i, str); - res = 1; - goto Exit; - } - - cl_list_insert_tail(&p_qos_match_rule-> - source_group_list, - p_port_group); - - list_iterator = cl_list_next(list_iterator); - } - } - - /* find the matching port-group for element of destination_list */ - - if (cl_list_count(&p_qos_match_rule->destination_list)) { - list_iterator = - cl_list_head(&p_qos_match_rule->destination_list); - while (list_iterator != - cl_list_end(&p_qos_match_rule-> - destination_list)) { - str = (char *)cl_list_obj(list_iterator); - CL_ASSERT(str); - - p_port_group = - __qos_policy_get_port_group_by_name(p_qos_policy,str); - if (!p_port_group) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR AC13: " - "qos-match-rule num %u: destination port-group '%s' not found\n", - i, str); - res = 1; - goto Exit; - } - - cl_list_insert_tail(&p_qos_match_rule-> - destination_group_list, - p_port_group); - - list_iterator = cl_list_next(list_iterator); - } - } - - /* - * Scan all the pkeys in matching rule, and if the - * partition for these pkeys exists, set the SL - * according to the QoS Level. - * Warn if there's mismatch between QoS level SL - * and Partition SL. - */ - - for (j = 0; j < p_qos_match_rule->pkey_range_len; j++) { - for ( pkey_64 = p_qos_match_rule->pkey_range_arr[j][0]; - pkey_64 <= p_qos_match_rule->pkey_range_arr[j][1]; - pkey_64++) { - pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff)); - p_prtn = (osm_prtn_t *)cl_qmap_get( - &p_qos_policy->p_subn->prtn_pkey_tbl, pkey); - - if (p_prtn == (osm_prtn_t *)cl_qmap_end( - &p_qos_policy->p_subn->prtn_pkey_tbl)) - /* partition for this pkey not found */ - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR AC14: " - "pkey 0x%04X in match rule - " - "partition doesn't exist\n", - cl_ntoh16(pkey)); - else - __qos_policy_validate_pkey(p_qos_policy, - p_qos_match_rule, - p_prtn); - } - } - - /* done with the current match-rule */ - - match_rules_list_iterator = - cl_list_next(match_rules_list_iterator); - i++; - } - -Exit: - OSM_LOG_EXIT(p_log); - return res; -} /* osm_qos_policy_validate() */ - -/*************************************************** - ***************************************************/ - -static osm_qos_level_t * __qos_policy_get_qos_level_by_params( - IN const osm_qos_policy_t * p_qos_policy, - IN const osm_physp_t * p_src_physp, - IN const osm_physp_t * p_dest_physp, - IN uint64_t service_id, - IN uint16_t qos_class, - IN uint16_t pkey, - IN ib_net64_t comp_mask) -{ - osm_qos_match_rule_t *p_qos_match_rule = NULL; - - if (!p_qos_policy) - return NULL; - - p_qos_match_rule = __qos_policy_get_match_rule_by_params( - p_qos_policy, service_id, qos_class, pkey, - p_src_physp, p_dest_physp, comp_mask); - - return p_qos_match_rule ? p_qos_match_rule->p_qos_level : - p_qos_policy->p_default_qos_level; -} /* __qos_policy_get_qos_level_by_params() */ - -/*************************************************** - ***************************************************/ - -osm_qos_level_t * osm_qos_policy_get_qos_level_by_pr( - IN const osm_qos_policy_t * p_qos_policy, - IN const ib_path_rec_t * p_pr, - IN const osm_physp_t * p_src_physp, - IN const osm_physp_t * p_dest_physp, - IN ib_net64_t comp_mask) -{ - return __qos_policy_get_qos_level_by_params( - p_qos_policy, p_src_physp, p_dest_physp, - cl_ntoh64(p_pr->service_id), ib_path_rec_qos_class(p_pr), - cl_ntoh16(p_pr->pkey), comp_mask); -} - -/*************************************************** - ***************************************************/ - -osm_qos_level_t * osm_qos_policy_get_qos_level_by_mpr( - IN const osm_qos_policy_t * p_qos_policy, - IN const ib_multipath_rec_t * p_mpr, - IN const osm_physp_t * p_src_physp, - IN const osm_physp_t * p_dest_physp, - IN ib_net64_t comp_mask) -{ - ib_net64_t pr_comp_mask = 0; - - if (!p_qos_policy) - return NULL; - - /* - * Converting MultiPathRecord compmask to the PathRecord - * compmask. Note that only relevant bits are set. - */ - pr_comp_mask = - ((comp_mask & IB_MPR_COMPMASK_QOS_CLASS) ? - IB_PR_COMPMASK_QOS_CLASS : 0) | - ((comp_mask & IB_MPR_COMPMASK_PKEY) ? - IB_PR_COMPMASK_PKEY : 0) | - ((comp_mask & IB_MPR_COMPMASK_SERVICEID_MSB) ? - IB_PR_COMPMASK_SERVICEID_MSB : 0) | - ((comp_mask & IB_MPR_COMPMASK_SERVICEID_LSB) ? - IB_PR_COMPMASK_SERVICEID_LSB : 0); - - return __qos_policy_get_qos_level_by_params( - p_qos_policy, p_src_physp, p_dest_physp, - cl_ntoh64(ib_multipath_rec_service_id(p_mpr)), - ib_multipath_rec_qos_class(p_mpr), - cl_ntoh16(p_mpr->pkey), pr_comp_mask); -} - -/*************************************************** - ***************************************************/ diff --git a/branches/opensm_3/user/opensm/osm_remote_sm.c b/branches/opensm_3/user/opensm/osm_remote_sm.c deleted file mode 100644 index 6b8bd1c9..00000000 --- a/branches/opensm_3/user/opensm/osm_remote_sm.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_sm_t. - * This object represents the remote SM object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include - -void osm_remote_sm_construct(IN osm_remote_sm_t * p_sm) -{ - memset(p_sm, 0, sizeof(*p_sm)); -} - -void osm_remote_sm_destroy(IN osm_remote_sm_t * p_sm) -{ - memset(p_sm, 0, sizeof(*p_sm)); -} - -void osm_remote_sm_init(IN osm_remote_sm_t * p_sm, IN const osm_port_t * p_port, - IN const ib_sm_info_t * p_smi) -{ - CL_ASSERT(p_sm); - CL_ASSERT(p_port); - - osm_remote_sm_construct(p_sm); - - p_sm->p_port = p_port; - p_sm->smi = *p_smi; - return; -} diff --git a/branches/opensm_3/user/opensm/osm_req.c b/branches/opensm_3/user/opensm/osm_req.c deleted file mode 100644 index fe7d134c..00000000 --- a/branches/opensm_3/user/opensm/osm_req.c +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_req_t. - * This object represents the generic attribute requester. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/********************************************************************** - The plock MAY or MAY NOT be held before calling this function. -**********************************************************************/ -ib_api_status_t osm_req_get(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path, - IN ib_net16_t attr_id, IN ib_net32_t attr_mod, - IN cl_disp_msgid_t err_msg, - IN const osm_madw_context_t * p_context) -{ - osm_madw_t *p_madw; - ib_api_status_t status = IB_SUCCESS; - ib_net64_t tid; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_path); - CL_ASSERT(attr_id); - - /* do nothing if we are exiting ... */ - if (osm_exit_flag) - goto Exit; - - /* p_context may be NULL. */ - - p_madw = osm_mad_pool_get(sm->p_mad_pool, p_path->h_bind, - MAD_BLOCK_SIZE, NULL); - if (p_madw == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 1101: Unable to acquire MAD\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - tid = cl_hton64((uint64_t) cl_atomic_inc(&sm->sm_trans_id)); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Getting %s (0x%X), modifier 0x%X, TID 0x%" PRIx64 "\n", - ib_get_sm_attr_str(attr_id), cl_ntoh16(attr_id), - cl_ntoh32(attr_mod), cl_ntoh64(tid)); - - ib_smp_init_new(osm_madw_get_smp_ptr(p_madw), IB_MAD_METHOD_GET, - tid, attr_id, attr_mod, p_path->hop_count, - sm->p_subn->opt.m_key, p_path->path, - IB_LID_PERMISSIVE, IB_LID_PERMISSIVE); - - p_madw->mad_addr.dest_lid = IB_LID_PERMISSIVE; - p_madw->mad_addr.addr_type.smi.source_lid = IB_LID_PERMISSIVE; - p_madw->resp_expected = TRUE; - p_madw->fail_msg = err_msg; - - /* - Fill in the mad wrapper context for the recipient. - In this case, the only thing the recipient needs is the - guid value. - */ - - if (p_context) - p_madw->context = *p_context; - - osm_vl15_post(sm->p_vl15, p_madw); - -Exit: - OSM_LOG_EXIT(sm->p_log); - return status; -} - -/********************************************************************** - The plock MAY or MAY NOT be held before calling this function. -**********************************************************************/ -ib_api_status_t osm_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path, - IN const uint8_t * p_payload, - IN size_t payload_size, - IN ib_net16_t attr_id, IN ib_net32_t attr_mod, - IN cl_disp_msgid_t err_msg, - IN const osm_madw_context_t * p_context) -{ - osm_madw_t *p_madw; - ib_api_status_t status = IB_SUCCESS; - ib_net64_t tid; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_path); - CL_ASSERT(attr_id); - CL_ASSERT(p_payload); - - /* do nothing if we are exiting ... */ - if (osm_exit_flag) - goto Exit; - - /* p_context may be NULL. */ - - p_madw = osm_mad_pool_get(sm->p_mad_pool, p_path->h_bind, - MAD_BLOCK_SIZE, NULL); - if (p_madw == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 1102: Unable to acquire MAD\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - tid = cl_hton64((uint64_t) cl_atomic_inc(&sm->sm_trans_id)); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Setting %s (0x%X), modifier 0x%X, TID 0x%" PRIx64 "\n", - ib_get_sm_attr_str(attr_id), cl_ntoh16(attr_id), - cl_ntoh32(attr_mod), cl_ntoh64(tid)); - - ib_smp_init_new(osm_madw_get_smp_ptr(p_madw), IB_MAD_METHOD_SET, - tid, attr_id, attr_mod, p_path->hop_count, - sm->p_subn->opt.m_key, p_path->path, - IB_LID_PERMISSIVE, IB_LID_PERMISSIVE); - - p_madw->mad_addr.dest_lid = IB_LID_PERMISSIVE; - p_madw->mad_addr.addr_type.smi.source_lid = IB_LID_PERMISSIVE; - p_madw->resp_expected = TRUE; - p_madw->fail_msg = err_msg; - - /* - Fill in the mad wrapper context for the recipient. - In this case, the only thing the recipient needs is the - guid value. - */ - - if (p_context) - p_madw->context = *p_context; - - memcpy(osm_madw_get_smp_ptr(p_madw)->data, p_payload, payload_size); - - osm_vl15_post(sm->p_vl15, p_madw); - -Exit: - OSM_LOG_EXIT(sm->p_log); - return status; -} - -int osm_send_trap144(osm_sm_t * sm, ib_net16_t local) -{ - osm_madw_t *madw; - ib_smp_t *smp; - ib_mad_notice_attr_t *ntc; - osm_port_t *port, *smport; - ib_port_info_t *pi; - - port = osm_get_port_by_guid(sm->p_subn, sm->p_subn->sm_port_guid); - if (!port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 1104: cannot find SM port by guid 0x%" PRIx64 "\n", - cl_ntoh64(sm->p_subn->sm_port_guid)); - return -1; - } - - pi = &port->p_physp->port_info; - - /* don't bother with sending trap when SMA supports this */ - if (!local && - pi->capability_mask&(IB_PORT_CAP_HAS_TRAP|IB_PORT_CAP_HAS_CAP_NTC)) - return 0; - - smport = osm_get_port_by_guid(sm->p_subn, sm->master_sm_guid); - if (!smport) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 1106: cannot find master SM port by guid 0x%" PRIx64 "\n", - cl_ntoh64(sm->master_sm_guid)); - return -1; - } - - madw = osm_mad_pool_get(sm->p_mad_pool, - osm_sm_mad_ctrl_get_bind_handle(&sm->mad_ctrl), - MAD_BLOCK_SIZE, NULL); - if (madw == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 1105: Unable to acquire MAD\n"); - return -1; - } - - madw->mad_addr.dest_lid = smport->p_physp->port_info.base_lid; - madw->mad_addr.addr_type.smi.source_lid = pi->base_lid; - madw->resp_expected = TRUE; - madw->fail_msg = CL_DISP_MSGID_NONE; - - smp = osm_madw_get_smp_ptr(madw); - memset(smp, 0, sizeof(*smp)); - - smp->base_ver = 1; - smp->mgmt_class = IB_MCLASS_SUBN_LID; - smp->class_ver = 1; - smp->method = IB_MAD_METHOD_TRAP; - smp->trans_id = cl_hton64((uint64_t) cl_atomic_inc(&sm->sm_trans_id)); - smp->attr_id = IB_MAD_ATTR_NOTICE; - smp->m_key = 0; - - ntc = (ib_mad_notice_attr_t *) smp->data; - - ntc->generic_type = 0x80 | IB_NOTICE_TYPE_INFO; - ib_notice_set_prod_type_ho(ntc, osm_node_get_type(port->p_node)); - ntc->g_or_v.generic.trap_num = cl_hton16(144); - ntc->issuer_lid = pi->base_lid; - ntc->data_details.ntc_144.lid = pi->base_lid; - ntc->data_details.ntc_144.local_changes = local ? - TRAP_144_MASK_OTHER_LOCAL_CHANGES : 0; - ntc->data_details.ntc_144.new_cap_mask = pi->capability_mask; - ntc->data_details.ntc_144.change_flgs = local; - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Sending Trap 144, TID 0x%" PRIx64 " to SM lid %u\n", - cl_ntoh64(smp->trans_id), cl_ntoh16(madw->mad_addr.dest_lid)); - - osm_vl15_post(sm->p_vl15, madw); - - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_resp.c b/branches/opensm_3/user/opensm/osm_resp.c deleted file mode 100644 index 22d5a808..00000000 --- a/branches/opensm_3/user/opensm/osm_resp.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_resp_t. - * This object represents the generic attribute responder. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static void resp_make_resp_smp(IN osm_sm_t * sm, IN const ib_smp_t * p_src_smp, - IN ib_net16_t status, - IN const uint8_t * p_payload, - OUT ib_smp_t * p_dest_smp) -{ - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_dest_smp); - CL_ASSERT(p_src_smp); - CL_ASSERT(!ib_smp_is_response(p_src_smp)); - - *p_dest_smp = *p_src_smp; - if (p_src_smp->method == IB_MAD_METHOD_GET || - p_src_smp->method == IB_MAD_METHOD_SET) { - p_dest_smp->method = IB_MAD_METHOD_GET_RESP; - p_dest_smp->status = status; - } else if (p_src_smp->method == IB_MAD_METHOD_TRAP) { - p_dest_smp->method = IB_MAD_METHOD_TRAP_REPRESS; - p_dest_smp->status = 0; - } else { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 1302: " - "src smp method unsupported 0x%X\n", p_src_smp->method); - goto Exit; - } - - if (p_src_smp->mgmt_class == IB_MCLASS_SUBN_DIR) - p_dest_smp->status |= IB_SMP_DIRECTION; - - p_dest_smp->dr_dlid = p_dest_smp->dr_slid; - p_dest_smp->dr_slid = p_dest_smp->dr_dlid; - memcpy(&p_dest_smp->data, p_payload, IB_SMP_DATA_SIZE); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -ib_api_status_t osm_resp_send(IN osm_sm_t * sm, - IN const osm_madw_t * p_req_madw, - IN ib_net16_t mad_status, - IN const uint8_t * p_payload) -{ - const ib_smp_t *p_req_smp; - ib_smp_t *p_smp; - osm_madw_t *p_madw; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_req_madw); - CL_ASSERT(p_payload); - - /* do nothing if we are exiting ... */ - if (osm_exit_flag) - goto Exit; - - p_madw = osm_mad_pool_get(sm->p_mad_pool, - osm_madw_get_bind_handle(p_req_madw), - MAD_BLOCK_SIZE, NULL); - - if (p_madw == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 1301: Unable to acquire MAD\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - /* - Copy the request smp to the response smp, then just - update the necessary fields. - */ - p_smp = osm_madw_get_smp_ptr(p_madw); - p_req_smp = osm_madw_get_smp_ptr(p_req_madw); - resp_make_resp_smp(sm, p_req_smp, mad_status, p_payload, p_smp); - p_madw->mad_addr.dest_lid = - p_req_madw->mad_addr.addr_type.smi.source_lid; - p_madw->mad_addr.addr_type.smi.source_lid = - p_req_madw->mad_addr.dest_lid; - - p_madw->resp_expected = FALSE; - p_madw->fail_msg = CL_DISP_MSGID_NONE; - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Responding to %s (0x%X)" - "\n\t\t\t\tattribute modifier 0x%X, TID 0x%" PRIx64 "\n", - ib_get_sm_attr_str(p_smp->attr_id), cl_ntoh16(p_smp->attr_id), - cl_ntoh32(p_smp->attr_mod), cl_ntoh64(p_smp->trans_id)); - - osm_vl15_post(sm->p_vl15, p_madw); - -Exit: - OSM_LOG_EXIT(sm->p_log); - return status; -} diff --git a/branches/opensm_3/user/opensm/osm_router.c b/branches/opensm_3/user/opensm/osm_router.c deleted file mode 100644 index c10b7bee..00000000 --- a/branches/opensm_3/user/opensm/osm_router.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_router_t. - * This object represents an Infiniband router. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include - -void osm_router_delete(IN OUT osm_router_t ** pp_rtr) -{ - free(*pp_rtr); - *pp_rtr = NULL; -} - -osm_router_t *osm_router_new(IN osm_port_t * p_port) -{ - osm_router_t *p_rtr; - - CL_ASSERT(p_port); - - p_rtr = malloc(sizeof(*p_rtr)); - if (p_rtr) { - memset(p_rtr, 0, sizeof(*p_rtr)); - p_rtr->p_port = p_port; - } - - return p_rtr; -} diff --git a/branches/opensm_3/user/opensm/osm_sa.c b/branches/opensm_3/user/opensm/osm_sa.c deleted file mode 100644 index 279fd953..00000000 --- a/branches/opensm_3/user/opensm/osm_sa.c +++ /dev/null @@ -1,1133 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * Copyright (c) 2010 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_sa_t. - * This object represents the Subnet Administration object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define OSM_SA_INITIAL_TID_VALUE 0xabc - -extern void osm_cpi_rcv_process(IN void *context, IN void *data); -extern void osm_gir_rcv_process(IN void *context, IN void *data); -extern void osm_infr_rcv_process(IN void *context, IN void *data); -extern void osm_infir_rcv_process(IN void *context, IN void *data); -extern void osm_lftr_rcv_process(IN void *context, IN void *data); -extern void osm_lr_rcv_process(IN void *context, IN void *data); -extern void osm_mcmr_rcv_process(IN void *context, IN void *data); -extern void osm_mftr_rcv_process(IN void *context, IN void *data); -extern void osm_mpr_rcv_process(IN void *context, IN void *data); -extern void osm_nr_rcv_process(IN void *context, IN void *data); -extern void osm_pr_rcv_process(IN void *context, IN void *data); -extern void osm_pkey_rec_rcv_process(IN void *context, IN void *data); -extern void osm_pir_rcv_process(IN void *context, IN void *data); -extern void osm_sr_rcv_process(IN void *context, IN void *data); -extern void osm_slvl_rec_rcv_process(IN void *context, IN void *data); -extern void osm_smir_rcv_process(IN void *context, IN void *data); -extern void osm_sir_rcv_process(IN void *context, IN void *data); -extern void osm_vlarb_rec_rcv_process(IN void *context, IN void *data); -extern void osm_sr_rcv_lease_cb(IN void *context); - -void osm_sa_construct(IN osm_sa_t * p_sa) -{ - memset(p_sa, 0, sizeof(*p_sa)); - p_sa->state = OSM_SA_STATE_INIT; - p_sa->sa_trans_id = OSM_SA_INITIAL_TID_VALUE; - - cl_timer_construct(&p_sa->sr_timer); -} - -void osm_sa_shutdown(IN osm_sa_t * p_sa) -{ - ib_api_status_t status; - OSM_LOG_ENTER(p_sa->p_log); - - cl_timer_stop(&p_sa->sr_timer); - - /* unbind from the mad service */ - status = osm_sa_mad_ctrl_unbind(&p_sa->mad_ctrl); - - /* remove any registered dispatcher message */ - cl_disp_unregister(p_sa->nr_disp_h); - cl_disp_unregister(p_sa->pir_disp_h); - cl_disp_unregister(p_sa->gir_disp_h); - cl_disp_unregister(p_sa->lr_disp_h); - cl_disp_unregister(p_sa->pr_disp_h); -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - cl_disp_unregister(p_sa->mpr_disp_h); -#endif - cl_disp_unregister(p_sa->smir_disp_h); - cl_disp_unregister(p_sa->mcmr_disp_h); - cl_disp_unregister(p_sa->sr_disp_h); - cl_disp_unregister(p_sa->infr_disp_h); - cl_disp_unregister(p_sa->infir_disp_h); - cl_disp_unregister(p_sa->vlarb_disp_h); - cl_disp_unregister(p_sa->slvl_disp_h); - cl_disp_unregister(p_sa->pkey_disp_h); - cl_disp_unregister(p_sa->lft_disp_h); - cl_disp_unregister(p_sa->sir_disp_h); - cl_disp_unregister(p_sa->mft_disp_h); - osm_sa_mad_ctrl_destroy(&p_sa->mad_ctrl); - - OSM_LOG_EXIT(p_sa->p_log); -} - -void osm_sa_destroy(IN osm_sa_t * p_sa) -{ - OSM_LOG_ENTER(p_sa->p_log); - - p_sa->state = OSM_SA_STATE_INIT; - - cl_timer_destroy(&p_sa->sr_timer); - - OSM_LOG_EXIT(p_sa->p_log); -} - -ib_api_status_t osm_sa_init(IN osm_sm_t * p_sm, IN osm_sa_t * p_sa, - IN osm_subn_t * p_subn, IN osm_vendor_t * p_vendor, - IN osm_mad_pool_t * p_mad_pool, - IN osm_log_t * p_log, IN osm_stats_t * p_stats, - IN cl_dispatcher_t * p_disp, IN cl_plock_t * p_lock) -{ - ib_api_status_t status; - - OSM_LOG_ENTER(p_log); - - p_sa->sm = p_sm; - p_sa->p_subn = p_subn; - p_sa->p_vendor = p_vendor; - p_sa->p_mad_pool = p_mad_pool; - p_sa->p_log = p_log; - p_sa->p_disp = p_disp; - p_sa->p_lock = p_lock; - - p_sa->state = OSM_SA_STATE_READY; - - status = osm_sa_mad_ctrl_init(&p_sa->mad_ctrl, p_sa, p_sa->p_mad_pool, - p_sa->p_vendor, p_subn, p_log, p_stats, - p_disp); - if (status != IB_SUCCESS) - goto Exit; - - status = cl_timer_init(&p_sa->sr_timer, osm_sr_rcv_lease_cb, p_sa); - if (status != IB_SUCCESS) - goto Exit; - - status = IB_INSUFFICIENT_RESOURCES; - p_sa->cpi_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_CLASS_PORT_INFO, - osm_cpi_rcv_process, p_sa); - if (p_sa->cpi_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->nr_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_NODE_RECORD, - osm_nr_rcv_process, p_sa); - if (p_sa->nr_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->pir_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_PORTINFO_RECORD, - osm_pir_rcv_process, p_sa); - if (p_sa->pir_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->gir_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_GUIDINFO_RECORD, - osm_gir_rcv_process, p_sa); - if (p_sa->gir_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->lr_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_LINK_RECORD, - osm_lr_rcv_process, p_sa); - if (p_sa->lr_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->pr_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_PATH_RECORD, - osm_pr_rcv_process, p_sa); - if (p_sa->pr_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - p_sa->mpr_disp_h = - cl_disp_register(p_disp, OSM_MSG_MAD_MULTIPATH_RECORD, - osm_mpr_rcv_process, p_sa); - if (p_sa->mpr_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; -#endif - - p_sa->smir_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_SMINFO_RECORD, - osm_smir_rcv_process, p_sa); - if (p_sa->smir_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->mcmr_disp_h = - cl_disp_register(p_disp, OSM_MSG_MAD_MCMEMBER_RECORD, - osm_mcmr_rcv_process, p_sa); - if (p_sa->mcmr_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->sr_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_SERVICE_RECORD, - osm_sr_rcv_process, p_sa); - if (p_sa->sr_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->infr_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_INFORM_INFO, - osm_infr_rcv_process, p_sa); - if (p_sa->infr_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->infir_disp_h = - cl_disp_register(p_disp, OSM_MSG_MAD_INFORM_INFO_RECORD, - osm_infir_rcv_process, p_sa); - if (p_sa->infir_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->vlarb_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_VL_ARB_RECORD, - osm_vlarb_rec_rcv_process, p_sa); - if (p_sa->vlarb_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->slvl_disp_h = - cl_disp_register(p_disp, OSM_MSG_MAD_SLVL_TBL_RECORD, - osm_slvl_rec_rcv_process, p_sa); - if (p_sa->slvl_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->pkey_disp_h = - cl_disp_register(p_disp, OSM_MSG_MAD_PKEY_TBL_RECORD, - osm_pkey_rec_rcv_process, p_sa); - if (p_sa->pkey_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->lft_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_LFT_RECORD, - osm_lftr_rcv_process, p_sa); - if (p_sa->lft_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->sir_disp_h = - cl_disp_register(p_disp, OSM_MSG_MAD_SWITCH_INFO_RECORD, - osm_sir_rcv_process, p_sa); - if (p_sa->sir_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sa->mft_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_MFT_RECORD, - osm_mftr_rcv_process, p_sa); - if (p_sa->mft_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - status = IB_SUCCESS; -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -ib_api_status_t osm_sa_bind(IN osm_sa_t * p_sa, IN ib_net64_t port_guid) -{ - ib_api_status_t status; - - OSM_LOG_ENTER(p_sa->p_log); - - status = osm_sa_mad_ctrl_bind(&p_sa->mad_ctrl, port_guid); - - if (status != IB_SUCCESS) { - OSM_LOG(p_sa->p_log, OSM_LOG_ERROR, "ERR 4C03: " - "SA MAD Controller bind failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_sa->p_log); - return status; -} - -ib_api_status_t osm_sa_send(osm_sa_t *sa, IN osm_madw_t * p_madw, - IN boolean_t resp_expected) -{ - ib_api_status_t status; - - cl_atomic_inc(&sa->p_subn->p_osm->stats.sa_mads_sent); - status = osm_vendor_send(p_madw->h_bind, p_madw, resp_expected); - if (status != IB_SUCCESS) { - cl_atomic_dec(&sa->p_subn->p_osm->stats.sa_mads_sent); - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4C04: " - "osm_vendor_send failed, status = %s\n", - ib_get_err_str(status)); - } - return status; -} - -void osm_sa_send_error(IN osm_sa_t * sa, IN const osm_madw_t * p_madw, - IN ib_net16_t sa_status) -{ - osm_madw_t *p_resp_madw; - ib_sa_mad_t *p_resp_sa_mad; - ib_sa_mad_t *p_sa_mad; - - OSM_LOG_ENTER(sa->p_log); - - /* avoid races - if we are exiting - exit */ - if (osm_exit_flag) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Ignoring requested send after exit\n"); - goto Exit; - } - - p_resp_madw = osm_mad_pool_get(sa->p_mad_pool, - p_madw->h_bind, MAD_BLOCK_SIZE, - &p_madw->mad_addr); - - if (p_resp_madw == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4C07: " - "Unable to acquire response MAD\n"); - goto Exit; - } - - p_resp_sa_mad = osm_madw_get_sa_mad_ptr(p_resp_madw); - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - - /* Copy the MAD header back into the response mad */ - *p_resp_sa_mad = *p_sa_mad; - p_resp_sa_mad->status = sa_status; - - if (p_resp_sa_mad->method == IB_MAD_METHOD_SET) - p_resp_sa_mad->method = IB_MAD_METHOD_GET; - else if (p_resp_sa_mad->method == IB_MAD_METHOD_GETTABLE) - p_resp_sa_mad->attr_offset = 0; - - p_resp_sa_mad->method |= IB_MAD_METHOD_RESP_MASK; - - /* - * C15-0.1.5 - always return SM_Key = 0 (table 185 p 884) - */ - p_resp_sa_mad->sm_key = 0; - - /* - * o15-0.2.7 - The PathRecord Attribute ID shall be used in - * the response (to a SubnAdmGetMulti(MultiPathRecord) - */ - if (p_resp_sa_mad->attr_id == IB_MAD_ATTR_MULTIPATH_RECORD) - p_resp_sa_mad->attr_id = IB_MAD_ATTR_PATH_RECORD; - - if (osm_log_is_active(sa->p_log, OSM_LOG_FRAMES)) - osm_dump_sa_mad(sa->p_log, p_resp_sa_mad, OSM_LOG_FRAMES); - - osm_sa_send(sa, p_resp_madw, FALSE); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -void osm_sa_respond(osm_sa_t *sa, osm_madw_t *madw, size_t attr_size, - cl_qlist_t *list) -{ - struct item_data { - cl_list_item_t list; - char data[0]; - }; - cl_list_item_t *item; - osm_madw_t *resp_madw; - ib_sa_mad_t *sa_mad, *resp_sa_mad; - unsigned num_rec, i; -#ifndef VENDOR_RMPP_SUPPORT - unsigned trim_num_rec; -#endif - unsigned char *p; - - sa_mad = osm_madw_get_sa_mad_ptr(madw); - num_rec = cl_qlist_count(list); - - /* - * C15-0.1.30: - * If we do a SubnAdmGet and got more than one record it is an error! - */ - if (sa_mad->method == IB_MAD_METHOD_GET && num_rec > 1) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4C05: " - "Got %u records for SubnAdmGet(%s) comp_mask 0x%016" PRIx64 "\n", - num_rec, ib_get_sa_attr_str(sa_mad->attr_id), - cl_ntoh64(sa_mad->comp_mask)); - osm_sa_send_error(sa, madw, IB_SA_MAD_STATUS_TOO_MANY_RECORDS); - goto Exit; - } - -#ifndef VENDOR_RMPP_SUPPORT - trim_num_rec = (MAD_BLOCK_SIZE - IB_SA_MAD_HDR_SIZE) / attr_size; - if (trim_num_rec < num_rec) { - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "Number of records:%u trimmed to:%u to fit in one MAD\n", - num_rec, trim_num_rec); - num_rec = trim_num_rec; - } -#endif - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Returning %u records\n", num_rec); - - if (sa_mad->method == IB_MAD_METHOD_GET && num_rec == 0) { - osm_sa_send_error(sa, madw, IB_SA_MAD_STATUS_NO_RECORDS); - goto Exit; - } - - /* - * Get a MAD to reply. Address of Mad is in the received mad_wrapper - */ - resp_madw = osm_mad_pool_get(sa->p_mad_pool, madw->h_bind, - num_rec * attr_size + IB_SA_MAD_HDR_SIZE, - &madw->mad_addr); - if (!resp_madw) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4C06: " - "osm_mad_pool_get failed\n"); - osm_sa_send_error(sa, madw, IB_SA_MAD_STATUS_NO_RESOURCES); - goto Exit; - } - - resp_sa_mad = osm_madw_get_sa_mad_ptr(resp_madw); - - /* - Copy the MAD header back into the response mad. - Set the 'R' bit and the payload length, - Then copy all records from the list into the response payload. - */ - - memcpy(resp_sa_mad, sa_mad, IB_SA_MAD_HDR_SIZE); - if (resp_sa_mad->method == IB_MAD_METHOD_SET) - resp_sa_mad->method = IB_MAD_METHOD_GET; - resp_sa_mad->method |= IB_MAD_METHOD_RESP_MASK; - /* C15-0.1.5 - always return SM_Key = 0 (table 185 p 884) */ - resp_sa_mad->sm_key = 0; - -#ifdef DUAL_SIDED_RMPP - if (resp_sa_mad->method == IB_MAD_METHOD_GETTABLE_RESP || - resp_sa_mad->method == IB_MAD_METHOD_GETMULTI_RESP) { -#else - if (resp_sa_mad->method == IB_MAD_METHOD_GETTABLE_RESP) { -#endif - /* Fill in the offset (paylen will be done by the rmpp SAR) */ - resp_sa_mad->attr_offset = num_rec ? ib_get_attr_offset(attr_size) : 0; - } - - p = ib_sa_mad_get_payload_ptr(resp_sa_mad); - -#ifndef VENDOR_RMPP_SUPPORT - /* we support only one packet RMPP - so we will set the first and - last flags for gettable */ - if (resp_sa_mad->method == IB_MAD_METHOD_GETTABLE_RESP) { - resp_sa_mad->rmpp_type = IB_RMPP_TYPE_DATA; - resp_sa_mad->rmpp_flags = - IB_RMPP_FLAG_FIRST | IB_RMPP_FLAG_LAST | - IB_RMPP_FLAG_ACTIVE; - } -#else - /* forcefully define the packet as RMPP one */ - if (resp_sa_mad->method == IB_MAD_METHOD_GETTABLE_RESP) - resp_sa_mad->rmpp_flags = IB_RMPP_FLAG_ACTIVE; -#endif - - for (i = 0; i < num_rec; i++) { - item = cl_qlist_remove_head(list); - memcpy(p, ((struct item_data *)item)->data, attr_size); - p += attr_size; - free(item); - } - - osm_dump_sa_mad(sa->p_log, resp_sa_mad, OSM_LOG_FRAMES); - osm_sa_send(sa, resp_madw, FALSE); - -Exit: - /* need to set the mem free ... */ - item = cl_qlist_remove_head(list); - while (item != cl_qlist_end(list)) { - free(item); - item = cl_qlist_remove_head(list); - } -} - -/* - * SA DB Dumper - * - */ - -struct opensm_dump_context { - osm_opensm_t *p_osm; - FILE *file; -}; - -static int -opensm_dump_to_file(osm_opensm_t * p_osm, const char *file_name, - void (*dump_func) (osm_opensm_t * p_osm, FILE * file)) -{ - char path[1024]; - FILE *file; - - snprintf(path, sizeof(path), "%s/%s", - p_osm->subn.opt.dump_files_dir, file_name); - - file = fopen(path, "w"); - if (!file) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "ERR 4C01: " - "cannot open file \'%s\': %s\n", - file_name, strerror(errno)); - return -1; - } - - chmod(path, S_IRUSR | S_IWUSR); - - dump_func(p_osm, file); - - fclose(file); - return 0; -} - -static void mcast_mgr_dump_one_port(cl_map_item_t * p_map_item, void *cxt) -{ - FILE *file = ((struct opensm_dump_context *)cxt)->file; - osm_mcm_port_t *p_mcm_port = (osm_mcm_port_t *) p_map_item; - - fprintf(file, "mcm_port: " - "port_gid=0x%016" PRIx64 ":0x%016" PRIx64 " " - "scope_state=0x%02x proxy_join=0x%x" "\n\n", - cl_ntoh64(p_mcm_port->port_gid.unicast.prefix), - cl_ntoh64(p_mcm_port->port_gid.unicast.interface_id), - p_mcm_port->scope_state, p_mcm_port->proxy_join); -} - -static void sa_dump_one_mgrp(osm_mgrp_t *p_mgrp, void *cxt) -{ - struct opensm_dump_context dump_context; - osm_opensm_t *p_osm = ((struct opensm_dump_context *)cxt)->p_osm; - FILE *file = ((struct opensm_dump_context *)cxt)->file; - - fprintf(file, "MC Group 0x%04x %s:" - " mgid=0x%016" PRIx64 ":0x%016" PRIx64 - " port_gid=0x%016" PRIx64 ":0x%016" PRIx64 - " qkey=0x%08x mlid=0x%04x mtu=0x%02x tclass=0x%02x" - " pkey=0x%04x rate=0x%02x pkt_life=0x%02x sl_flow_hop=0x%08x" - " scope_state=0x%02x proxy_join=0x%x" "\n\n", - cl_ntoh16(p_mgrp->mlid), - p_mgrp->well_known ? " (well known)" : "", - cl_ntoh64(p_mgrp->mcmember_rec.mgid.unicast.prefix), - cl_ntoh64(p_mgrp->mcmember_rec.mgid.unicast.interface_id), - cl_ntoh64(p_mgrp->mcmember_rec.port_gid.unicast.prefix), - cl_ntoh64(p_mgrp->mcmember_rec.port_gid.unicast.interface_id), - cl_ntoh32(p_mgrp->mcmember_rec.qkey), - cl_ntoh16(p_mgrp->mcmember_rec.mlid), - p_mgrp->mcmember_rec.mtu, - p_mgrp->mcmember_rec.tclass, - cl_ntoh16(p_mgrp->mcmember_rec.pkey), - p_mgrp->mcmember_rec.rate, - p_mgrp->mcmember_rec.pkt_life, - cl_ntoh32(p_mgrp->mcmember_rec.sl_flow_hop), - p_mgrp->mcmember_rec.scope_state, - p_mgrp->mcmember_rec.proxy_join); - - dump_context.p_osm = p_osm; - dump_context.file = file; - - cl_qmap_apply_func(&p_mgrp->mcm_port_tbl, - mcast_mgr_dump_one_port, &dump_context); -} - -static void sa_dump_one_inform(cl_list_item_t * p_list_item, void *cxt) -{ - FILE *file = ((struct opensm_dump_context *)cxt)->file; - osm_infr_t *p_infr = (osm_infr_t *) p_list_item; - ib_inform_info_record_t *p_iir = &p_infr->inform_record; - - fprintf(file, "InformInfo Record:" - " subscriber_gid=0x%016" PRIx64 ":0x%016" PRIx64 - " subscriber_enum=0x%x" - " InformInfo:" - " gid=0x%016" PRIx64 ":0x%016" PRIx64 - " lid_range_begin=0x%x" - " lid_range_end=0x%x" - " is_generic=0x%x" - " subscribe=0x%x" - " trap_type=0x%x" - " trap_num=0x%x" - " qpn_resp_time_val=0x%x" - " node_type=0x%06x" - " rep_addr: lid=0x%04x path_bits=0x%02x static_rate=0x%02x" - " remote_qp=0x%08x remote_qkey=0x%08x pkey_ix=0x%04x sl=0x%02x" - "\n\n", - cl_ntoh64(p_iir->subscriber_gid.unicast.prefix), - cl_ntoh64(p_iir->subscriber_gid.unicast.interface_id), - cl_ntoh16(p_iir->subscriber_enum), - cl_ntoh64(p_iir->inform_info.gid.unicast.prefix), - cl_ntoh64(p_iir->inform_info.gid.unicast.interface_id), - cl_ntoh16(p_iir->inform_info.lid_range_begin), - cl_ntoh16(p_iir->inform_info.lid_range_end), - p_iir->inform_info.is_generic, - p_iir->inform_info.subscribe, - cl_ntoh16(p_iir->inform_info.trap_type), - cl_ntoh16(p_iir->inform_info.g_or_v.generic.trap_num), - cl_ntoh32(p_iir->inform_info.g_or_v.generic.qpn_resp_time_val), - cl_ntoh32(ib_inform_info_get_prod_type(&p_iir->inform_info)), - cl_ntoh16(p_infr->report_addr.dest_lid), - p_infr->report_addr.path_bits, - p_infr->report_addr.static_rate, - cl_ntoh32(p_infr->report_addr.addr_type.gsi.remote_qp), - cl_ntoh32(p_infr->report_addr.addr_type.gsi.remote_qkey), - p_infr->report_addr.addr_type.gsi.pkey_ix, - p_infr->report_addr.addr_type.gsi.service_level); -} - -static void sa_dump_one_service(cl_list_item_t * p_list_item, void *cxt) -{ - FILE *file = ((struct opensm_dump_context *)cxt)->file; - osm_svcr_t *p_svcr = (osm_svcr_t *) p_list_item; - ib_service_record_t *p_sr = &p_svcr->service_record; - - fprintf(file, "Service Record: id=0x%016" PRIx64 - " gid=0x%016" PRIx64 ":0x%016" PRIx64 - " pkey=0x%x" - " lease=0x%x" - " key=0x%02x%02x%02x%02x%02x%02x%02x%02x" - ":0x%02x%02x%02x%02x%02x%02x%02x%02x" - " name=\'%s\'" - " data8=0x%02x%02x%02x%02x%02x%02x%02x%02x" - ":0x%02x%02x%02x%02x%02x%02x%02x%02x" - " data16=0x%04x%04x%04x%04x:0x%04x%04x%04x%04x" - " data32=0x%08x%08x:0x%08x%08x" - " data64=0x%016" PRIx64 ":0x%016" PRIx64 - " modified_time=0x%x lease_period=0x%x\n\n", - cl_ntoh64(p_sr->service_id), - cl_ntoh64(p_sr->service_gid.unicast.prefix), - cl_ntoh64(p_sr->service_gid.unicast.interface_id), - cl_ntoh16(p_sr->service_pkey), - cl_ntoh32(p_sr->service_lease), - p_sr->service_key[0], p_sr->service_key[1], - p_sr->service_key[2], p_sr->service_key[3], - p_sr->service_key[4], p_sr->service_key[5], - p_sr->service_key[6], p_sr->service_key[7], - p_sr->service_key[8], p_sr->service_key[9], - p_sr->service_key[10], p_sr->service_key[11], - p_sr->service_key[12], p_sr->service_key[13], - p_sr->service_key[14], p_sr->service_key[15], - p_sr->service_name, - p_sr->service_data8[0], p_sr->service_data8[1], - p_sr->service_data8[2], p_sr->service_data8[3], - p_sr->service_data8[4], p_sr->service_data8[5], - p_sr->service_data8[6], p_sr->service_data8[7], - p_sr->service_data8[8], p_sr->service_data8[9], - p_sr->service_data8[10], p_sr->service_data8[11], - p_sr->service_data8[12], p_sr->service_data8[13], - p_sr->service_data8[14], p_sr->service_data8[15], - cl_ntoh16(p_sr->service_data16[0]), - cl_ntoh16(p_sr->service_data16[1]), - cl_ntoh16(p_sr->service_data16[2]), - cl_ntoh16(p_sr->service_data16[3]), - cl_ntoh16(p_sr->service_data16[4]), - cl_ntoh16(p_sr->service_data16[5]), - cl_ntoh16(p_sr->service_data16[6]), - cl_ntoh16(p_sr->service_data16[7]), - cl_ntoh32(p_sr->service_data32[0]), - cl_ntoh32(p_sr->service_data32[1]), - cl_ntoh32(p_sr->service_data32[2]), - cl_ntoh32(p_sr->service_data32[3]), - cl_ntoh64(p_sr->service_data64[0]), - cl_ntoh64(p_sr->service_data64[1]), - p_svcr->modified_time, p_svcr->lease_period); -} - -static void sa_dump_all_sa(osm_opensm_t * p_osm, FILE * file) -{ - struct opensm_dump_context dump_context; - osm_mgrp_t *p_mgrp; - - dump_context.p_osm = p_osm; - dump_context.file = file; - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, "Dump multicast\n"); - cl_plock_acquire(&p_osm->lock); - for (p_mgrp = (osm_mgrp_t *) cl_fmap_head(&p_osm->subn.mgrp_mgid_tbl); - p_mgrp != (osm_mgrp_t *) cl_fmap_end(&p_osm->subn.mgrp_mgid_tbl); - p_mgrp = (osm_mgrp_t *) cl_fmap_next(&p_mgrp->map_item)) - sa_dump_one_mgrp(p_mgrp, &dump_context); - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, "Dump inform\n"); - cl_qlist_apply_func(&p_osm->subn.sa_infr_list, - sa_dump_one_inform, &dump_context); - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, "Dump services\n"); - cl_qlist_apply_func(&p_osm->subn.sa_sr_list, - sa_dump_one_service, &dump_context); - cl_plock_release(&p_osm->lock); -} - -int osm_sa_db_file_dump(osm_opensm_t * p_osm) -{ - int res = 1; - if (p_osm->sa.dirty) { - res = opensm_dump_to_file( - p_osm, "opensm-sa.dump", sa_dump_all_sa); - p_osm->sa.dirty = FALSE; - } - return res; -} - -/* - * SA DB Loader - */ -static osm_mgrp_t *load_mcgroup(osm_opensm_t * p_osm, ib_net16_t mlid, - ib_member_rec_t * p_mcm_rec, - unsigned well_known) -{ - ib_net64_t comp_mask; - osm_mgrp_t *p_mgrp; - - cl_plock_excl_acquire(&p_osm->lock); - - p_mgrp = osm_get_mgrp_by_mgid(&p_osm->subn, &p_mcm_rec->mgid); - if (p_mgrp) { - if (p_mgrp->mlid == mlid) { - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, - "mgrp %04x is already here.", cl_ntoh16(mlid)); - goto _out; - } - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "mlid %04x is already used by another MC group. Will " - "request clients reregistration.\n", cl_ntoh16(mlid)); - p_mgrp = NULL; - goto _out; - } - - comp_mask = IB_MCR_COMPMASK_MTU | IB_MCR_COMPMASK_MTU_SEL - | IB_MCR_COMPMASK_RATE | IB_MCR_COMPMASK_RATE_SEL; - if (osm_mcmr_rcv_find_or_create_new_mgrp(&p_osm->sa, - comp_mask, p_mcm_rec, - &p_mgrp) != IB_SUCCESS || - !p_mgrp || p_mgrp->mlid != mlid) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "cannot create MC group with mlid 0x%04x and mgid " - "0x%016" PRIx64 ":0x%016" PRIx64 "\n", cl_ntoh16(mlid), - cl_ntoh64(p_mcm_rec->mgid.unicast.prefix), - cl_ntoh64(p_mcm_rec->mgid.unicast.interface_id)); - p_mgrp = NULL; - } else if (well_known) - p_mgrp->well_known = TRUE; - -_out: - cl_plock_release(&p_osm->lock); - - return p_mgrp; -} - -static int load_svcr(osm_opensm_t * p_osm, ib_service_record_t * sr, - uint32_t modified_time, uint32_t lease_period) -{ - osm_svcr_t *p_svcr; - int ret = 0; - - cl_plock_excl_acquire(&p_osm->lock); - - if (osm_svcr_get_by_rid(&p_osm->subn, &p_osm->log, sr)) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "ServiceRecord already exists\n"); - goto _out; - } - - if (!(p_svcr = osm_svcr_new(sr))) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "cannot allocate new service struct\n"); - ret = -1; - goto _out; - } - - p_svcr->modified_time = modified_time; - p_svcr->lease_period = lease_period; - - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, "adding ServiceRecord...\n"); - - osm_svcr_insert_to_db(&p_osm->subn, &p_osm->log, p_svcr); - - if (lease_period != 0xffffffff) - cl_timer_trim(&p_osm->sa.sr_timer, 1000); - -_out: - cl_plock_release(&p_osm->lock); - - return ret; -} - -static int load_infr(osm_opensm_t * p_osm, ib_inform_info_record_t * iir, - osm_mad_addr_t * addr) -{ - osm_infr_t infr, *p_infr; - int ret = 0; - - infr.h_bind = p_osm->sa.mad_ctrl.h_bind; - infr.sa = &p_osm->sa; - /* other possible way to restore mad_addr partially is - to extract qpn from InformInfo and to find lid by gid */ - infr.report_addr = *addr; - infr.inform_record = *iir; - - cl_plock_excl_acquire(&p_osm->lock); - if (osm_infr_get_by_rec(&p_osm->subn, &p_osm->log, &infr)) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "InformInfo Record already exists\n"); - goto _out; - } - - if (!(p_infr = osm_infr_new(&infr))) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "cannot allocate new infr struct\n"); - ret = -1; - goto _out; - } - - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, "adding InformInfo Record...\n"); - - osm_infr_insert_to_db(&p_osm->subn, &p_osm->log, p_infr); - -_out: - cl_plock_release(&p_osm->lock); - - return ret; -} - -#define UNPACK_FUNC(name,x) \ -static int unpack_##name##x(char *p, uint##x##_t *val_ptr) \ -{ \ - char *q; \ - unsigned long long num; \ - num = strtoull(p, &q, 16); \ - if (num > ~((uint##x##_t)0x0) \ - || q == p || (!isspace(*q) && *q != ':')) { \ - *val_ptr = 0; \ - return -1; \ - } \ - *val_ptr = cl_hton##x((uint##x##_t)num); \ - return (int)(q - p); \ -} - -#define cl_hton8(x) (x) - -UNPACK_FUNC(net, 8); -UNPACK_FUNC(net, 16); -UNPACK_FUNC(net, 32); -UNPACK_FUNC(net, 64); - -static int unpack_string(char *p, uint8_t * buf, unsigned len) -{ - char *q = p; - char delim = ' '; - - if (*q == '\'' || *q == '\"') - delim = *q++; - while (--len && *q && *q != delim) - *buf++ = *q++; - *buf = '\0'; - if (*q == delim && delim != ' ') - q++; - return (int)(q - p); -} - -static int unpack_string64(char *p, uint8_t * buf) -{ - return unpack_string(p, buf, 64); -} - -#define PARSE_AHEAD(p, x, name, val_ptr) { int _ret; \ - p = strstr(p, name); \ - if (!p) { \ - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, \ - "PARSE ERROR: %s:%u: cannot find \"%s\" string\n", \ - file_name, lineno, (name)); \ - ret = -2; \ - goto _error; \ - } \ - p += strlen(name); \ - _ret = unpack_##x(p, (val_ptr)); \ - if (_ret < 0) { \ - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, \ - "PARSE ERROR: %s:%u: cannot parse "#x" value " \ - "after \"%s\"\n", file_name, lineno, (name)); \ - ret = _ret; \ - goto _error; \ - } \ - p += _ret; \ -} - -int osm_sa_db_file_load(osm_opensm_t * p_osm) -{ - char line[1024]; - char *file_name; - FILE *file; - int ret = 0; - osm_mgrp_t *p_mgrp = NULL; - unsigned rereg_clients = 0; - unsigned lineno; - - if (!p_osm->subn.first_time_master_sweep) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "Not first sweep - skip SA DB restore\n"); - return 0; - } - - file_name = p_osm->subn.opt.sa_db_file; - if (!file_name) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "sa db file name is not specifed. Skip restore\n"); - return 0; - } - - file = fopen(file_name, "r"); - if (!file) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR | OSM_LOG_SYS, "ERR 4C02: " - "cannot open sa db file \'%s\'. Skip restoring\n", - file_name); - return -1; - } - - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "Restoring SA DB from file \'%s\'\n", - file_name); - - lineno = 0; - - while (fgets(line, sizeof(line) - 1, file) != NULL) { - char *p; - uint8_t val; - - lineno++; - - p = line; - while (isspace(*p)) - p++; - - if (*p == '#') - continue; - - if (!strncmp(p, "MC Group", 8)) { - ib_member_rec_t mcm_rec; - ib_net16_t mlid; - unsigned well_known = 0; - - p_mgrp = NULL; - memset(&mcm_rec, 0, sizeof(mcm_rec)); - - PARSE_AHEAD(p, net16, " 0x", &mlid); - if (strstr(p, "well known")) - well_known = 1; - PARSE_AHEAD(p, net64, " mgid=0x", - &mcm_rec.mgid.unicast.prefix); - PARSE_AHEAD(p, net64, ":0x", - &mcm_rec.mgid.unicast.interface_id); - PARSE_AHEAD(p, net64, " port_gid=0x", - &mcm_rec.port_gid.unicast.prefix); - PARSE_AHEAD(p, net64, ":0x", - &mcm_rec.port_gid.unicast.interface_id); - PARSE_AHEAD(p, net32, " qkey=0x", &mcm_rec.qkey); - PARSE_AHEAD(p, net16, " mlid=0x", &mcm_rec.mlid); - PARSE_AHEAD(p, net8, " mtu=0x", &mcm_rec.mtu); - PARSE_AHEAD(p, net8, " tclass=0x", &mcm_rec.tclass); - PARSE_AHEAD(p, net16, " pkey=0x", &mcm_rec.pkey); - PARSE_AHEAD(p, net8, " rate=0x", &mcm_rec.rate); - PARSE_AHEAD(p, net8, " pkt_life=0x", &mcm_rec.pkt_life); - PARSE_AHEAD(p, net32, " sl_flow_hop=0x", - &mcm_rec.sl_flow_hop); - PARSE_AHEAD(p, net8, " scope_state=0x", - &mcm_rec.scope_state); - PARSE_AHEAD(p, net8, " proxy_join=0x", &val); - mcm_rec.proxy_join = val; - - p_mgrp = load_mcgroup(p_osm, mlid, &mcm_rec, - well_known); - if (!p_mgrp) - rereg_clients = 1; - } else if (p_mgrp && !strncmp(p, "mcm_port", 8)) { - ib_member_rec_t mcmr; - ib_net64_t guid; - osm_port_t *port; - boolean_t proxy; - - PARSE_AHEAD(p, net64, " port_gid=0x", - &mcmr.port_gid.unicast.prefix); - PARSE_AHEAD(p, net64, ":0x", - &mcmr.port_gid.unicast.interface_id); - PARSE_AHEAD(p, net8, " scope_state=0x", &mcmr.scope_state); - PARSE_AHEAD(p, net8, " proxy_join=0x", &val); - proxy = val; - - guid = mcmr.port_gid.unicast.interface_id; - port = osm_get_port_by_guid(&p_osm->subn, guid); - if (port && - cl_qmap_get(&p_mgrp->mcm_port_tbl, guid) == - cl_qmap_end(&p_mgrp->mcm_port_tbl) && - !osm_mgrp_add_port(&p_osm->subn, &p_osm->log, - p_mgrp, port, &mcmr, proxy)) - rereg_clients = 1; - } else if (!strncmp(p, "Service Record:", 15)) { - ib_service_record_t s_rec; - uint32_t modified_time, lease_period; - - p_mgrp = NULL; - memset(&s_rec, 0, sizeof(s_rec)); - - PARSE_AHEAD(p, net64, " id=0x", &s_rec.service_id); - PARSE_AHEAD(p, net64, " gid=0x", - &s_rec.service_gid.unicast.prefix); - PARSE_AHEAD(p, net64, ":0x", - &s_rec.service_gid.unicast.interface_id); - PARSE_AHEAD(p, net16, " pkey=0x", &s_rec.service_pkey); - PARSE_AHEAD(p, net32, " lease=0x", - &s_rec.service_lease); - PARSE_AHEAD(p, net64, " key=0x", - (ib_net64_t *) (&s_rec.service_key[0])); - PARSE_AHEAD(p, net64, ":0x", - (ib_net64_t *) (&s_rec.service_key[8])); - PARSE_AHEAD(p, string64, " name=", s_rec.service_name); - PARSE_AHEAD(p, net64, " data8=0x", - (ib_net64_t *) (&s_rec.service_data8[0])); - PARSE_AHEAD(p, net64, ":0x", - (ib_net64_t *) (&s_rec.service_data8[8])); - PARSE_AHEAD(p, net64, " data16=0x", - (ib_net64_t *) (&s_rec.service_data16[0])); - PARSE_AHEAD(p, net64, ":0x", - (ib_net64_t *) (&s_rec.service_data16[4])); - PARSE_AHEAD(p, net64, " data32=0x", - (ib_net64_t *) (&s_rec.service_data32[0])); - PARSE_AHEAD(p, net64, ":0x", - (ib_net64_t *) (&s_rec.service_data32[2])); - PARSE_AHEAD(p, net64, " data64=0x", - &s_rec.service_data64[0]); - PARSE_AHEAD(p, net64, ":0x", &s_rec.service_data64[1]); - PARSE_AHEAD(p, net32, " modified_time=0x", - &modified_time); - PARSE_AHEAD(p, net32, " lease_period=0x", - &lease_period); - - if (load_svcr(p_osm, &s_rec, cl_ntoh32(modified_time), - cl_ntoh32(lease_period))) - rereg_clients = 1; - } else if (!strncmp(p, "InformInfo Record:", 18)) { - ib_inform_info_record_t i_rec; - osm_mad_addr_t rep_addr; - ib_net16_t val16; - - p_mgrp = NULL; - memset(&i_rec, 0, sizeof(i_rec)); - memset(&rep_addr, 0, sizeof(rep_addr)); - - PARSE_AHEAD(p, net64, " subscriber_gid=0x", - &i_rec.subscriber_gid.unicast.prefix); - PARSE_AHEAD(p, net64, ":0x", - &i_rec.subscriber_gid.unicast.interface_id); - PARSE_AHEAD(p, net16, " subscriber_enum=0x", - &i_rec.subscriber_enum); - PARSE_AHEAD(p, net64, " gid=0x", - &i_rec.inform_info.gid.unicast.prefix); - PARSE_AHEAD(p, net64, ":0x", - &i_rec.inform_info.gid.unicast. - interface_id); - PARSE_AHEAD(p, net16, " lid_range_begin=0x", - &i_rec.inform_info.lid_range_begin); - PARSE_AHEAD(p, net16, " lid_range_end=0x", - &i_rec.inform_info.lid_range_end); - PARSE_AHEAD(p, net8, " is_generic=0x", - &i_rec.inform_info.is_generic); - PARSE_AHEAD(p, net8, " subscribe=0x", - &i_rec.inform_info.subscribe); - PARSE_AHEAD(p, net16, " trap_type=0x", - &i_rec.inform_info.trap_type); - PARSE_AHEAD(p, net16, " trap_num=0x", - &i_rec.inform_info.g_or_v.generic.trap_num); - PARSE_AHEAD(p, net32, " qpn_resp_time_val=0x", - &i_rec.inform_info.g_or_v.generic. - qpn_resp_time_val); - PARSE_AHEAD(p, net32, " node_type=0x", - (uint32_t *) & i_rec.inform_info.g_or_v. - generic.reserved2); - - PARSE_AHEAD(p, net16, " rep_addr: lid=0x", - &rep_addr.dest_lid); - PARSE_AHEAD(p, net8, " path_bits=0x", - &rep_addr.path_bits); - PARSE_AHEAD(p, net8, " static_rate=0x", - &rep_addr.static_rate); - PARSE_AHEAD(p, net32, " remote_qp=0x", - &rep_addr.addr_type.gsi.remote_qp); - PARSE_AHEAD(p, net32, " remote_qkey=0x", - &rep_addr.addr_type.gsi.remote_qkey); - PARSE_AHEAD(p, net16, " pkey_ix=0x", &val16); - rep_addr.addr_type.gsi.pkey_ix = cl_ntoh16(val16); - PARSE_AHEAD(p, net8, " sl=0x", - &rep_addr.addr_type.gsi.service_level); - - if (load_infr(p_osm, &i_rec, &rep_addr)) - rereg_clients = 1; - } - } - - /* - * If loading succeeded, do whatever 'no_clients_rereg' says. - * If loading failed at some point, turn off the 'no_clients_rereg' - * option (turn on re-registartion requests). - */ - if (rereg_clients) - p_osm->subn.opt.no_clients_rereg = FALSE; - - /* We've just finished loading SA DB file - clear the "dirty" flag */ - p_osm->sa.dirty = FALSE; - -_error: - fclose(file); - return ret; -} diff --git a/branches/opensm_3/user/opensm/osm_sa_class_port_info.c b/branches/opensm_3/user/opensm/osm_sa_class_port_info.c deleted file mode 100644 index b3dd7979..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_class_port_info.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_cpi_rcv_t. - * This object represents the ClassPortInfo Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_MSECS_TO_RTV 24 -/* Precalculated table in msec (index is related to encoded value) */ -/* 4.096 usec * 2 ** n (where n = 8 - 31) */ -const static uint32_t msecs_to_rtv_table[MAX_MSECS_TO_RTV] = { - 1, 2, 4, 8, - 16, 33, 67, 134, - 268, 536, 1073, 2147, - 4294, 8589, 17179, 34359, - 68719, 137438, 274877, 549755, - 1099511, 2199023, 4398046, 8796093 -}; - -static void cpi_rcv_respond(IN osm_sa_t * sa, IN const osm_madw_t * p_madw) -{ - osm_madw_t *p_resp_madw; - const ib_sa_mad_t *p_sa_mad; - ib_sa_mad_t *p_resp_sa_mad; - ib_class_port_info_t *p_resp_cpi; - ib_gid_t zero_gid; - uint8_t rtv; - - OSM_LOG_ENTER(sa->p_log); - - memset(&zero_gid, 0, sizeof(ib_gid_t)); - - /* - Get a MAD to reply. Address of Mad is in the received mad_wrapper - */ - p_resp_madw = osm_mad_pool_get(sa->p_mad_pool, p_madw->h_bind, - MAD_BLOCK_SIZE, &p_madw->mad_addr); - if (!p_resp_madw) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1408: " - "Unable to allocate MAD\n"); - goto Exit; - } - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_resp_sa_mad = osm_madw_get_sa_mad_ptr(p_resp_madw); - - memcpy(p_resp_sa_mad, p_sa_mad, IB_SA_MAD_HDR_SIZE); - p_resp_sa_mad->method |= IB_MAD_METHOD_RESP_MASK; - /* C15-0.1.5 - always return SM_Key = 0 (table 185 p 884) */ - p_resp_sa_mad->sm_key = 0; - - p_resp_cpi = - (ib_class_port_info_t *) ib_sa_mad_get_payload_ptr(p_resp_sa_mad); - - /* finally do it (the job) man ! */ - p_resp_cpi->base_ver = 1; - p_resp_cpi->class_ver = 2; - /* Calculate encoded response time value */ - /* transaction timeout is in msec */ - if (sa->p_subn->opt.transaction_timeout > - msecs_to_rtv_table[MAX_MSECS_TO_RTV - 1]) - rtv = MAX_MSECS_TO_RTV - 1; - else { - for (rtv = 0; rtv < MAX_MSECS_TO_RTV; rtv++) { - if (sa->p_subn->opt.transaction_timeout <= - msecs_to_rtv_table[rtv]) - break; - } - } - rtv += 8; - ib_class_set_resp_time_val(p_resp_cpi, rtv); - p_resp_cpi->redir_gid = zero_gid; - p_resp_cpi->redir_tc_sl_fl = 0; - p_resp_cpi->redir_lid = 0; - p_resp_cpi->redir_pkey = 0; - p_resp_cpi->redir_qp = CL_NTOH32(1); - p_resp_cpi->redir_qkey = IB_QP1_WELL_KNOWN_Q_KEY; - p_resp_cpi->trap_gid = zero_gid; - p_resp_cpi->trap_tc_sl_fl = 0; - p_resp_cpi->trap_lid = 0; - p_resp_cpi->trap_pkey = 0; - p_resp_cpi->trap_hop_qp = 0; - p_resp_cpi->trap_qkey = IB_QP1_WELL_KNOWN_Q_KEY; - - /* set specific capability mask bits */ - /* we do not support the following options/optional records: - OSM_CAP_IS_SUBN_OPT_RECS_SUP : - RandomForwardingTableRecord, - ServiceAssociationRecord - other optional records supported "under the table" - - OSM_CAP_IS_MULTIPATH_SUP: - TraceRecord - - OSM_CAP_IS_REINIT_SUP: - For reinitialization functionality. - - So not sending traps, but supporting Get(Notice) and Set(Notice). - */ - - /* Note host notation replaced later */ -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - p_resp_cpi->cap_mask = OSM_CAP_IS_SUBN_GET_SET_NOTICE_SUP | - OSM_CAP_IS_PORT_INFO_CAPMASK_MATCH_SUPPORTED | - OSM_CAP_IS_MULTIPATH_SUP; -#else - p_resp_cpi->cap_mask = OSM_CAP_IS_SUBN_GET_SET_NOTICE_SUP | - OSM_CAP_IS_PORT_INFO_CAPMASK_MATCH_SUPPORTED; -#endif - if (sa->p_subn->opt.qos) - ib_class_set_cap_mask2(p_resp_cpi, OSM_CAP2_IS_QOS_SUPPORTED); - - if (!sa->p_subn->opt.disable_multicast) - p_resp_cpi->cap_mask |= OSM_CAP_IS_UD_MCAST_SUP; - p_resp_cpi->cap_mask = cl_hton16(p_resp_cpi->cap_mask); - - if (osm_log_is_active(sa->p_log, OSM_LOG_FRAMES)) - osm_dump_sa_mad(sa->p_log, p_resp_sa_mad, OSM_LOG_FRAMES); - - osm_sa_send(sa, p_resp_madw, FALSE); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -/********************************************************************** - * This code actually handles the call - **********************************************************************/ -void osm_cpi_rcv_process(IN void *context, IN void *data) -{ - osm_sa_t *sa = context; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *p_sa_mad; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - - /* we only support GET */ - if (p_sa_mad->method != IB_MAD_METHOD_GET) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1403: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_sa_mad->method)); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - CL_ASSERT(p_sa_mad->attr_id == IB_MAD_ATTR_CLASS_PORT_INFO); - - /* CLASS PORT INFO does not really look at the SMDB - no lock required. */ - - cpi_rcv_respond(sa, p_madw); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_guidinfo_record.c b/branches/opensm_3/user/opensm/osm_sa_guidinfo_record.c deleted file mode 100644 index b99cc2cf..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_guidinfo_record.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright (c) 2006-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_gir_rcv_t. - * This object represents the GUIDInfoRecord Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_gir_item { - cl_list_item_t list_item; - ib_guidinfo_record_t rec; -} osm_gir_item_t; - -typedef struct osm_gir_search_ctxt { - const ib_guidinfo_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; -} osm_gir_search_ctxt_t; - -static ib_api_status_t gir_rcv_new_gir(IN osm_sa_t * sa, - IN const osm_node_t * p_node, - IN cl_qlist_t * p_list, - IN ib_net64_t const match_port_guid, - IN ib_net16_t const match_lid, - IN const osm_physp_t * p_req_physp, - IN uint8_t const block_num) -{ - osm_gir_item_t *p_rec_item; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 5102: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New GUIDInfoRecord: lid %u, block num %d\n", - cl_ntoh16(match_lid), block_num); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = match_lid; - p_rec_item->rec.block_num = block_num; - if (!block_num) - p_rec_item->rec.guid_info.guid[0] = - osm_physp_get_port_guid(p_req_physp); - - cl_qlist_insert_tail(p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void sa_gir_create_gir(IN osm_sa_t * sa, IN osm_node_t * p_node, - IN cl_qlist_t * p_list, - IN ib_net64_t const match_port_guid, - IN ib_net16_t const match_lid, - IN const osm_physp_t * p_req_physp, - IN uint8_t const match_block_num) -{ - const osm_physp_t *p_physp; - uint8_t port_num; - uint8_t num_ports; - uint16_t match_lid_ho; - ib_net16_t base_lid_ho; - ib_net16_t max_lid_ho; - uint8_t lmc; - ib_net64_t port_guid; - uint8_t block_num, start_block_num, end_block_num, num_blocks; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Looking for GUIDRecord with LID: %u GUID:0x%016" - PRIx64 "\n", cl_ntoh16(match_lid), cl_ntoh64(match_port_guid)); - - /* - For switches, do not return the GUIDInfo record(s) - for each port on the switch, just for port 0. - */ - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH) - num_ports = 1; - else - num_ports = osm_node_get_num_physp(p_node); - - for (port_num = 0; port_num < num_ports; port_num++) { - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_physp) - continue; - - /* Check to see if the found p_physp and the requester physp - share a pkey. If not, continue */ - if (!osm_physp_share_pkey(sa->p_log, p_physp, p_req_physp)) - continue; - - port_guid = osm_physp_get_port_guid(p_physp); - - if (match_port_guid && (port_guid != match_port_guid)) - continue; - - /* - Note: the following check is a temporary workaround - Since 1. GUIDCap should never be 0 on ports where this applies - and 2. GUIDCap should not be used on ports where it doesn't apply - So this should really be a check for whether the port is a - switch external port or not! - */ - if (p_physp->port_info.guid_cap == 0) - continue; - - num_blocks = p_physp->port_info.guid_cap / 8; - if (p_physp->port_info.guid_cap % 8) - num_blocks++; - if (match_block_num == 255) { - start_block_num = 0; - end_block_num = num_blocks - 1; - } else { - if (match_block_num >= num_blocks) - continue; - end_block_num = start_block_num = match_block_num; - } - - base_lid_ho = cl_ntoh16(osm_physp_get_base_lid(p_physp)); - match_lid_ho = cl_ntoh16(match_lid); - if (match_lid_ho) { - lmc = osm_physp_get_lmc(p_physp); - max_lid_ho = (uint16_t) (base_lid_ho + (1 << lmc) - 1); - - /* - We validate that the lid belongs to this node. - */ - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Comparing LID: %u <= %u <= %u\n", - base_lid_ho, match_lid_ho, max_lid_ho); - - if (match_lid_ho < base_lid_ho - || match_lid_ho > max_lid_ho) - continue; - } - - for (block_num = start_block_num; block_num <= end_block_num; - block_num++) - gir_rcv_new_gir(sa, p_node, p_list, port_guid, - cl_ntoh16(base_lid_ho), p_physp, - block_num); - } - - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_gir_by_comp_mask_cb(IN cl_map_item_t * p_map_item, IN void *cxt) -{ - const osm_gir_search_ctxt_t *p_ctxt = cxt; - osm_node_t *const p_node = (osm_node_t *) p_map_item; - const ib_guidinfo_record_t *const p_rcvd_rec = p_ctxt->p_rcvd_rec; - const osm_physp_t *const p_req_physp = p_ctxt->p_req_physp; - osm_sa_t *sa = p_ctxt->sa; - const ib_guid_info_t *p_comp_gi; - ib_net64_t const comp_mask = p_ctxt->comp_mask; - ib_net64_t match_port_guid = 0; - ib_net16_t match_lid = 0; - uint8_t match_block_num = 255; - - OSM_LOG_ENTER(p_ctxt->sa->p_log); - - if (comp_mask & IB_GIR_COMPMASK_LID) - match_lid = p_rcvd_rec->lid; - - if (comp_mask & IB_GIR_COMPMASK_BLOCKNUM) - match_block_num = p_rcvd_rec->block_num; - - p_comp_gi = &p_rcvd_rec->guid_info; - /* Different rule for block 0 v. other blocks */ - if (comp_mask & IB_GIR_COMPMASK_GID0) { - if (!p_rcvd_rec->block_num) - match_port_guid = osm_physp_get_port_guid(p_req_physp); - if (p_comp_gi->guid[0] != match_port_guid) - goto Exit; - } - - if (comp_mask & IB_GIR_COMPMASK_GID1) { - if (p_comp_gi->guid[1] != 0) - goto Exit; - } - - if (comp_mask & IB_GIR_COMPMASK_GID2) { - if (p_comp_gi->guid[2] != 0) - goto Exit; - } - - if (comp_mask & IB_GIR_COMPMASK_GID3) { - if (p_comp_gi->guid[3] != 0) - goto Exit; - } - - if (comp_mask & IB_GIR_COMPMASK_GID4) { - if (p_comp_gi->guid[4] != 0) - goto Exit; - } - - if (comp_mask & IB_GIR_COMPMASK_GID5) { - if (p_comp_gi->guid[5] != 0) - goto Exit; - } - - if (comp_mask & IB_GIR_COMPMASK_GID6) { - if (p_comp_gi->guid[6] != 0) - goto Exit; - } - - if (comp_mask & IB_GIR_COMPMASK_GID7) { - if (p_comp_gi->guid[7] != 0) - goto Exit; - } - - sa_gir_create_gir(sa, p_node, p_ctxt->p_list, match_port_guid, - match_lid, p_req_physp, match_block_num); - -Exit: - OSM_LOG_EXIT(p_ctxt->sa->p_log); -} - -void osm_gir_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *p_rcvd_mad; - const ib_guidinfo_record_t *p_rcvd_rec; - cl_qlist_t rec_list; - osm_gir_search_ctxt_t context; - osm_physp_t *p_req_physp; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_rcvd_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = - (ib_guidinfo_record_t *) ib_sa_mad_get_payload_ptr(p_rcvd_mad); - - CL_ASSERT(p_rcvd_mad->attr_id == IB_MAD_ATTR_GUIDINFO_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (p_rcvd_mad->method != IB_MAD_METHOD_GET && - p_rcvd_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 5105: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_rcvd_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 5104: " - "Cannot find requester physical port\n"); - goto Exit; - } - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_guidinfo_record(sa->p_log, p_rcvd_rec, OSM_LOG_DEBUG); - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = p_rcvd_mad->comp_mask; - context.sa = sa; - context.p_req_physp = p_req_physp; - - cl_plock_acquire(sa->p_lock); - - cl_qmap_apply_func(&sa->p_subn->node_guid_tbl, sa_gir_by_comp_mask_cb, - &context); - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_guidinfo_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_informinfo.c b/branches/opensm_3/user/opensm/osm_sa_informinfo.c deleted file mode 100644 index 4cfe5792..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_informinfo.c +++ /dev/null @@ -1,595 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_infr_rcv_t. - * This object represents the InformInfo Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_iir_item { - cl_list_item_t list_item; - ib_inform_info_record_t rec; -} osm_iir_item_t; - -typedef struct osm_iir_search_ctxt { - const ib_inform_info_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - cl_qlist_t *p_list; - ib_gid_t subscriber_gid; - ib_net16_t subscriber_enum; - osm_sa_t *sa; - osm_physp_t *p_req_physp; -} osm_iir_search_ctxt_t; - -/********************************************************************** -o13-14.1.1: Except for Set(InformInfo) requests with Inform- -Info:LIDRangeBegin=0xFFFF, managers that support event forwarding -shall, upon receiving a Set(InformInfo), verify that the requester -originating the Set(InformInfo) and a Trap() source identified by Inform- -can access each other - can use path record to verify that. -**********************************************************************/ -static boolean_t validate_ports_access_rights(IN osm_sa_t * sa, - IN osm_infr_t * p_infr_rec) -{ - boolean_t valid = TRUE; - osm_physp_t *p_requester_physp; - osm_port_t *p_port; - ib_net64_t portguid; - uint16_t lid_range_begin, lid_range_end, lid; - - OSM_LOG_ENTER(sa->p_log); - - /* get the requester physp from the request address */ - p_requester_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - &p_infr_rec->report_addr); - - if (ib_gid_is_notzero(&p_infr_rec->inform_record.inform_info.gid)) { - /* a gid is defined */ - portguid = - p_infr_rec->inform_record.inform_info.gid.unicast. - interface_id; - - p_port = osm_get_port_by_guid(sa->p_subn, portguid); - if (p_port == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4301: " - "Invalid port guid: 0x%016" PRIx64 "\n", - cl_ntoh64(portguid)); - valid = FALSE; - goto Exit; - } - - /* make sure that the requester and destination port can access - each other according to the current partitioning. */ - if (!osm_physp_share_pkey - (sa->p_log, p_port->p_physp, p_requester_physp)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "port and requester don't share pkey\n"); - valid = FALSE; - goto Exit; - } - } else { - size_t lids_size; - - /* gid is zero - check if LID range is defined */ - lid_range_begin = - cl_ntoh16(p_infr_rec->inform_record.inform_info. - lid_range_begin); - /* if lid is 0xFFFF - meaning all endports managed by the manager */ - if (lid_range_begin == 0xFFFF) - goto Exit; - - lid_range_end = - cl_ntoh16(p_infr_rec->inform_record.inform_info. - lid_range_end); - - lids_size = cl_ptr_vector_get_size(&sa->p_subn->port_lid_tbl); - - /* lid_range_end is set to zero if no range desired. In this - case - just make it equal to the lid_range_begin. */ - if (lid_range_end == 0) - lid_range_end = lid_range_begin; - else if (lid_range_end >= lids_size) - lid_range_end = lids_size - 1; - - if (lid_range_begin >= lids_size) { - /* requested lids are out of range */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4302: " - "Given LIDs (%u-%u) are out of range (%zu)\n", - lid_range_begin, lid_range_end, lids_size); - valid = FALSE; - goto Exit; - } - - /* go over all defined lids within the range and make sure that the - requester port can access them according to current partitioning. */ - for (lid = lid_range_begin; lid <= lid_range_end; lid++) { - p_port = osm_get_port_by_lid_ho(sa->p_subn, lid); - if (p_port == NULL) - continue; - - /* make sure that the requester and destination port can access - each other according to the current partitioning. */ - if (!osm_physp_share_pkey - (sa->p_log, p_port->p_physp, p_requester_physp)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "port and requester don't share pkey\n"); - valid = FALSE; - goto Exit; - } - } - } - -Exit: - OSM_LOG_EXIT(sa->p_log); - return valid; -} - -static boolean_t validate_infr(IN osm_sa_t * sa, IN osm_infr_t * p_infr_rec) -{ - boolean_t valid = TRUE; - - OSM_LOG_ENTER(sa->p_log); - - valid = validate_ports_access_rights(sa, p_infr_rec); - if (!valid) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Invalid Access for InformInfo\n"); - valid = FALSE; - } - - OSM_LOG_EXIT(sa->p_log); - return valid; -} - -/********************************************************************** -o13-12.1.1: Confirm a valid request for event subscription by responding -with an InformInfo attribute that is a copy of the data in the -Set(InformInfo) request. -**********************************************************************/ -static void infr_rcv_respond(IN osm_sa_t * sa, IN osm_madw_t * p_madw) -{ - cl_qlist_t rec_list; - osm_iir_item_t *item; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Generating successful InformInfo response\n"); - - item = malloc(sizeof(*item)); - if (!item) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4303: " - "rec_item alloc failed\n"); - goto Exit; - } - - memcpy(&item->rec, - ib_sa_mad_get_payload_ptr(osm_madw_get_sa_mad_ptr(p_madw)), - sizeof(item->rec)); - - cl_qlist_init(&rec_list); - cl_qlist_insert_tail(&rec_list, &item->list_item); - - osm_sa_respond(sa, p_madw, sizeof(ib_inform_info_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_inform_info_rec_by_comp_mask(IN osm_sa_t * sa, - IN const osm_infr_t * p_infr, - osm_iir_search_ctxt_t * p_ctxt) -{ - const ib_inform_info_record_t *p_rcvd_rec = NULL; - ib_net64_t comp_mask; - ib_net64_t portguid; - osm_port_t *p_subscriber_port; - osm_physp_t *p_subscriber_physp; - const osm_physp_t *p_req_physp; - osm_iir_item_t *p_rec_item; - - OSM_LOG_ENTER(sa->p_log); - - p_rcvd_rec = p_ctxt->p_rcvd_rec; - comp_mask = p_ctxt->comp_mask; - p_req_physp = p_ctxt->p_req_physp; - - if (comp_mask & IB_IIR_COMPMASK_SUBSCRIBERGID && - memcmp(&p_infr->inform_record.subscriber_gid, - &p_ctxt->subscriber_gid, - sizeof(p_infr->inform_record.subscriber_gid))) - goto Exit; - - if (comp_mask & IB_IIR_COMPMASK_ENUM && - p_infr->inform_record.subscriber_enum != p_ctxt->subscriber_enum) - goto Exit; - - /* Implement any other needed search cases */ - - /* Ensure pkey is shared before returning any records */ - portguid = p_infr->inform_record.subscriber_gid.unicast.interface_id; - p_subscriber_port = osm_get_port_by_guid(sa->p_subn, portguid); - if (p_subscriber_port == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 430D: " - "Invalid subscriber port guid: 0x%016" PRIx64 "\n", - cl_ntoh64(portguid)); - goto Exit; - } - - /* get the subscriber InformInfo physical port */ - p_subscriber_physp = p_subscriber_port->p_physp; - /* make sure that the requester and subscriber port can access each - other according to the current partitioning. */ - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_subscriber_physp)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "requester and subscriber ports don't share pkey\n"); - goto Exit; - } - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 430E: " - "rec_item alloc failed\n"); - goto Exit; - } - - memcpy(&p_rec_item->rec, &p_infr->inform_record, - sizeof(ib_inform_info_record_t)); - cl_qlist_insert_tail(p_ctxt->p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_inform_info_rec_by_comp_mask_cb(IN cl_list_item_t * p_list_item, - IN void *context) -{ - const osm_infr_t *p_infr = (osm_infr_t *) p_list_item; - osm_iir_search_ctxt_t *p_ctxt = context; - - sa_inform_info_rec_by_comp_mask(p_ctxt->sa, p_infr, p_ctxt); -} - -/********************************************************************** -Received a Get(InformInfoRecord) or GetTable(InformInfoRecord) MAD -**********************************************************************/ -static void infr_rcv_process_get_method(osm_sa_t * sa, IN osm_madw_t * p_madw) -{ - char gid_str[INET6_ADDRSTRLEN]; - ib_sa_mad_t *p_rcvd_mad; - const ib_inform_info_record_t *p_rcvd_rec; - cl_qlist_t rec_list; - osm_iir_search_ctxt_t context; - osm_physp_t *p_req_physp; - osm_iir_item_t *item; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - p_rcvd_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = - (ib_inform_info_record_t *) ib_sa_mad_get_payload_ptr(p_rcvd_mad); - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4309: " - "Cannot find requester physical port\n"); - goto Exit; - } - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_inform_info_record(sa->p_log, p_rcvd_rec, - OSM_LOG_DEBUG); - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = p_rcvd_mad->comp_mask; - context.subscriber_gid = p_rcvd_rec->subscriber_gid; - context.subscriber_enum = p_rcvd_rec->subscriber_enum; - context.sa = sa; - context.p_req_physp = p_req_physp; - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Query Subscriber GID:%s(%02X) Enum:0x%X(%02X)\n", - inet_ntop(AF_INET6, p_rcvd_rec->subscriber_gid.raw, - gid_str, sizeof gid_str), - (p_rcvd_mad->comp_mask & IB_IIR_COMPMASK_SUBSCRIBERGID) != 0, - cl_ntoh16(p_rcvd_rec->subscriber_enum), - (p_rcvd_mad->comp_mask & IB_IIR_COMPMASK_ENUM) != 0); - - cl_plock_acquire(sa->p_lock); - - cl_qlist_apply_func(&sa->p_subn->sa_infr_list, - sa_inform_info_rec_by_comp_mask_cb, &context); - - cl_plock_release(sa->p_lock); - - /* clear reserved and pad fields in InformInfoRecord */ - for (item = (osm_iir_item_t *) cl_qlist_head(&rec_list); - item != (osm_iir_item_t *) cl_qlist_end(&rec_list); - item = (osm_iir_item_t *) cl_qlist_next(&item->list_item)) { - memset(item->rec.reserved, 0, sizeof(item->rec.reserved)); - memset(item->rec.pad, 0, sizeof(item->rec.pad)); - } - - osm_sa_respond(sa, p_madw, sizeof(ib_inform_info_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -/********************************************************************* -Received a Set(InformInfo) MAD -**********************************************************************/ -static void infr_rcv_process_set_method(osm_sa_t * sa, IN osm_madw_t * p_madw) -{ - ib_sa_mad_t *p_sa_mad; - ib_inform_info_t *p_recvd_inform_info; - osm_infr_t inform_info_rec; /* actual inform record to be stored for reports */ - osm_infr_t *p_infr; - ib_net32_t qpn; - uint8_t resp_time_val; - ib_api_status_t res; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_recvd_inform_info = - (ib_inform_info_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - -#if 0 - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_inform_info(sa->p_log, p_recvd_inform_info, - OSM_LOG_DEBUG); -#endif - - /* Grab the lock */ - cl_plock_excl_acquire(sa->p_lock); - - /* define the inform record */ - inform_info_rec.inform_record.inform_info = *p_recvd_inform_info; - - /* following C13-32.1.2 Tbl 120: we only copy the source address vector */ - inform_info_rec.report_addr = p_madw->mad_addr; - - /* we will need to know the mad srvc to send back through */ - inform_info_rec.h_bind = p_madw->h_bind; - inform_info_rec.sa = sa; - - /* update the subscriber GID according to mad address */ - res = osm_get_gid_by_mad_addr(sa->p_log, sa->p_subn, &p_madw->mad_addr, - &inform_info_rec.inform_record. - subscriber_gid); - if (res != IB_SUCCESS) { - cl_plock_release(sa->p_lock); - - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4308 " - "Subscribe Request from unknown LID: %u\n", - cl_ntoh16(p_madw->mad_addr.dest_lid)); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* HACK: enum is always 0 (currently) */ - inform_info_rec.inform_record.subscriber_enum = 0; - - /* Subscribe values above 1 are undefined */ - if (p_recvd_inform_info->subscribe > 1) { - cl_plock_release(sa->p_lock); - - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4308 " - "Invalid subscribe: %d\n", - p_recvd_inform_info->subscribe); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* - * MODIFICATIONS DONE ON INCOMING REQUEST: - * - * QPN: - * Internally we keep the QPN field of the InformInfo updated - * so we can simply compare it in the record - when finding such. - */ - if (p_recvd_inform_info->subscribe) { - ib_inform_info_set_qpn(&inform_info_rec.inform_record. - inform_info, - inform_info_rec.report_addr.addr_type. - gsi.remote_qp); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Subscribe Request with QPN: 0x%06X\n", - cl_ntoh32(inform_info_rec.report_addr.addr_type.gsi. - remote_qp)); - } else { - ib_inform_info_get_qpn_resp_time(p_recvd_inform_info->g_or_v. - generic.qpn_resp_time_val, - &qpn, &resp_time_val); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "UnSubscribe Request with QPN: 0x%06X\n", - cl_ntoh32(qpn)); - } - - /* If record exists with matching InformInfo */ - p_infr = osm_infr_get_by_rec(sa->p_subn, sa->p_log, &inform_info_rec); - - /* check to see if the request was for subscribe */ - if (p_recvd_inform_info->subscribe) { - /* validate the request for a new or update InformInfo */ - if (validate_infr(sa, &inform_info_rec) != TRUE) { - cl_plock_release(sa->p_lock); - - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4305: " - "Failed to validate a new inform object\n"); - - /* o13-13.1.1: we need to set the subscribe bit to 0 */ - p_recvd_inform_info->subscribe = 0; - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* ok - we can try and create a new entry */ - if (p_infr == NULL) { - /* Create the instance of the osm_infr_t object */ - p_infr = osm_infr_new(&inform_info_rec); - if (p_infr == NULL) { - cl_plock_release(sa->p_lock); - - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4306: " - "Failed to create a new inform object\n"); - - /* o13-13.1.1: we need to set the subscribe bit to 0 */ - p_recvd_inform_info->subscribe = 0; - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_NO_RESOURCES); - goto Exit; - } - - /* Add this new osm_infr_t object to subnet object */ - osm_infr_insert_to_db(sa->p_subn, sa->p_log, p_infr); - } else - /* Update the old instance of the osm_infr_t object */ - p_infr->inform_record = inform_info_rec.inform_record; - /* We got an UnSubscribe request */ - } else if (p_infr == NULL) { - cl_plock_release(sa->p_lock); - - /* No Such Item - So Error */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4307: " - "Failed to UnSubscribe to non existing inform object\n"); - - /* o13-13.1.1: we need to set the subscribe bit to 0 */ - p_recvd_inform_info->subscribe = 0; - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } else - /* Delete this object from the subnet list of informs */ - osm_infr_remove_from_db(sa->p_subn, sa->p_log, p_infr); - - cl_plock_release(sa->p_lock); - - /* send the success response */ - infr_rcv_respond(sa, p_madw); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -void osm_infr_rcv_process(IN void *context, IN void *data) -{ - osm_sa_t *sa = context; - osm_madw_t *p_madw = data; - ib_sa_mad_t *p_sa_mad; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - - CL_ASSERT(p_sa_mad->attr_id == IB_MAD_ATTR_INFORM_INFO); - - if (p_sa_mad->method != IB_MAD_METHOD_SET) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_sa_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - infr_rcv_process_set_method(sa, p_madw); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -void osm_infir_rcv_process(IN void *context, IN void *data) -{ - osm_sa_t *sa = context; - osm_madw_t *p_madw = data; - ib_sa_mad_t *p_sa_mad; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - - CL_ASSERT(p_sa_mad->attr_id == IB_MAD_ATTR_INFORM_INFO_RECORD); - - if (p_sa_mad->method != IB_MAD_METHOD_GET && - p_sa_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_sa_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - infr_rcv_process_get_method(sa, p_madw); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_lft_record.c b/branches/opensm_3/user/opensm/osm_sa_lft_record.c deleted file mode 100644 index 96b86e28..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_lft_record.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_lftr_rcv_t. - * This object represents the LinearForwardingTable Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_lftr_item { - cl_list_item_t list_item; - ib_lft_record_t rec; -} osm_lftr_item_t; - -typedef struct osm_lftr_search_ctxt { - const ib_lft_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; -} osm_lftr_search_ctxt_t; - -static ib_api_status_t lftr_rcv_new_lftr(IN osm_sa_t * sa, - IN const osm_switch_t * p_sw, - IN cl_qlist_t * p_list, - IN ib_net16_t lid, IN uint16_t block) -{ - osm_lftr_item_t *p_rec_item; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4402: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New LinearForwardingTable: sw 0x%016" PRIx64 - "\n\t\t\t\tblock 0x%02X lid %u\n", - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node)), - block, cl_ntoh16(lid)); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = lid; - p_rec_item->rec.block_num = cl_hton16(block); - - /* copy the lft block */ - osm_switch_get_lft_block(p_sw, block, p_rec_item->rec.lft); - - cl_qlist_insert_tail(p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void lftr_rcv_by_comp_mask(IN cl_map_item_t * p_map_item, IN void *cxt) -{ - const osm_lftr_search_ctxt_t *p_ctxt = cxt; - const osm_switch_t *p_sw = (osm_switch_t *) p_map_item; - const ib_lft_record_t *const p_rcvd_rec = p_ctxt->p_rcvd_rec; - osm_sa_t *sa = p_ctxt->sa; - ib_net64_t const comp_mask = p_ctxt->comp_mask; - const osm_physp_t *const p_req_physp = p_ctxt->p_req_physp; - osm_port_t *p_port; - uint16_t min_lid_ho, max_lid_ho; - uint16_t min_block, max_block, block; - const osm_physp_t *p_physp; - - /* In switches, the port guid is the node guid. */ - p_port = osm_get_port_by_guid(sa->p_subn, - p_sw->p_node->node_info.port_guid); - if (!p_port) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4405: " - "Failed to find Port by Node Guid:0x%016" PRIx64 - "\n", cl_ntoh64(p_sw->p_node->node_info.node_guid)); - return; - } - - /* check that the requester physp and the current physp are under - the same partition. */ - p_physp = p_port->p_physp; - if (!p_physp) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4406: " - "Failed to find default physical Port by Node Guid:0x%016" - PRIx64 "\n", - cl_ntoh64(p_sw->p_node->node_info.node_guid)); - return; - } - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp)) - return; - - /* get the port 0 of the switch */ - osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho); - - /* compare the lids - if required */ - if (comp_mask & IB_LFTR_COMPMASK_LID) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Comparing lid:%u to port lid range: %u .. %u\n", - cl_ntoh16(p_rcvd_rec->lid), min_lid_ho, max_lid_ho); - /* ok we are ready for range check */ - if (min_lid_ho > cl_ntoh16(p_rcvd_rec->lid) || - max_lid_ho < cl_ntoh16(p_rcvd_rec->lid)) - return; - } - - /* now we need to decide which blocks to output */ - max_block = osm_switch_get_max_block_id_in_use(p_sw); - if (comp_mask & IB_LFTR_COMPMASK_BLOCK) { - min_block = cl_ntoh16(p_rcvd_rec->block_num); - if (min_block > max_block) - return; - max_block = min_block; - } else /* use as many blocks as "in use" */ - min_block = 0; - - /* so we can add these blocks one by one ... */ - for (block = min_block; block <= max_block; block++) - lftr_rcv_new_lftr(sa, p_sw, p_ctxt->p_list, - osm_port_get_base_lid(p_port), block); -} - -void osm_lftr_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *p_rcvd_mad; - const ib_lft_record_t *p_rcvd_rec; - cl_qlist_t rec_list; - osm_lftr_search_ctxt_t context; - osm_physp_t *p_req_physp; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_rcvd_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = (ib_lft_record_t *) ib_sa_mad_get_payload_ptr(p_rcvd_mad); - - CL_ASSERT(p_rcvd_mad->attr_id == IB_MAD_ATTR_LFT_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (p_rcvd_mad->method != IB_MAD_METHOD_GET && - p_rcvd_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4408: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_rcvd_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4407: " - "Cannot find requester physical port\n"); - goto Exit; - } - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = p_rcvd_mad->comp_mask; - context.sa = sa; - context.p_req_physp = p_req_physp; - - cl_plock_acquire(sa->p_lock); - - /* Go over all switches */ - cl_qmap_apply_func(&sa->p_subn->sw_guid_tbl, lftr_rcv_by_comp_mask, - &context); - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_lft_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_link_record.c b/branches/opensm_3/user/opensm/osm_sa_link_record.c deleted file mode 100644 index 966a3af7..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_link_record.c +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_lr_rcv_t. - * This object represents the LinkRecord Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_lr_item { - cl_list_item_t list_item; - ib_link_record_t link_rec; -} osm_lr_item_t; - -static void lr_rcv_build_physp_link(IN osm_sa_t * sa, IN ib_net16_t from_lid, - IN ib_net16_t to_lid, IN uint8_t from_port, - IN uint8_t to_port, IN cl_qlist_t * p_list) -{ - osm_lr_item_t *p_lr_item; - - p_lr_item = malloc(sizeof(*p_lr_item)); - if (p_lr_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1801: " - "Unable to acquire link record\n" - "\t\t\t\tFrom port %u\n" "\t\t\t\tTo port %u\n" - "\t\t\t\tFrom lid %u\n" "\t\t\t\tTo lid %u\n", - from_port, to_port, - cl_ntoh16(from_lid), cl_ntoh16(to_lid)); - return; - } - memset(p_lr_item, 0, sizeof(*p_lr_item)); - - p_lr_item->link_rec.from_port_num = from_port; - p_lr_item->link_rec.to_port_num = to_port; - p_lr_item->link_rec.to_lid = to_lid; - p_lr_item->link_rec.from_lid = from_lid; - - cl_qlist_insert_tail(p_list, &p_lr_item->list_item); -} - -static ib_net16_t get_base_lid(IN const osm_physp_t * p_physp) -{ - if (p_physp->p_node->node_info.node_type == IB_NODE_TYPE_SWITCH) - p_physp = osm_node_get_physp_ptr(p_physp->p_node, 0); - return osm_physp_get_base_lid(p_physp); -} - -static void lr_rcv_get_physp_link(IN osm_sa_t * sa, - IN const ib_link_record_t * p_lr, - IN const osm_physp_t * p_src_physp, - IN const osm_physp_t * p_dest_physp, - IN const ib_net64_t comp_mask, - IN cl_qlist_t * p_list, - IN const osm_physp_t * p_req_physp) -{ - uint8_t src_port_num; - uint8_t dest_port_num; - ib_net16_t from_base_lid; - ib_net16_t to_base_lid; - ib_net16_t lmc_mask; - - OSM_LOG_ENTER(sa->p_log); - - /* - If only one end of the link is specified, determine - the other side. - */ - if (p_src_physp) { - if (p_dest_physp) { - /* - Ensure the two physp's are actually connected. - If not, bail out. - */ - if (osm_physp_get_remote(p_src_physp) != p_dest_physp) - goto Exit; - } else { - p_dest_physp = osm_physp_get_remote(p_src_physp); - if (p_dest_physp == NULL) - goto Exit; - } - } else { - if (p_dest_physp) { - p_src_physp = osm_physp_get_remote(p_dest_physp); - if (p_src_physp == NULL) - goto Exit; - } else - goto Exit; /* no physp's, so nothing to do */ - } - - /* Check that the p_src_physp, p_dest_physp and p_req_physp - all share a pkey (doesn't have to be the same p_key). */ - if (!osm_physp_share_pkey(sa->p_log, p_src_physp, p_dest_physp)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Source and Dest PhysPorts do not share PKey\n"); - goto Exit; - } - if (!osm_physp_share_pkey(sa->p_log, p_src_physp, p_req_physp)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Source and Requester PhysPorts do not share PKey\n"); - goto Exit; - } - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_dest_physp)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Requester and Dest PhysPorts do not share PKey\n"); - goto Exit; - } - - src_port_num = osm_physp_get_port_num(p_src_physp); - dest_port_num = osm_physp_get_port_num(p_dest_physp); - - if (comp_mask & IB_LR_COMPMASK_FROM_PORT) - if (src_port_num != p_lr->from_port_num) - goto Exit; - - if (comp_mask & IB_LR_COMPMASK_TO_PORT) - if (dest_port_num != p_lr->to_port_num) - goto Exit; - - from_base_lid = get_base_lid(p_src_physp); - to_base_lid = get_base_lid(p_dest_physp); - - lmc_mask = ~((1 << sa->p_subn->opt.lmc) - 1); - lmc_mask = cl_hton16(lmc_mask); - - if (comp_mask & IB_LR_COMPMASK_FROM_LID) - if (from_base_lid != (p_lr->from_lid & lmc_mask)) - goto Exit; - - if (comp_mask & IB_LR_COMPMASK_TO_LID) - if (to_base_lid != (p_lr->to_lid & lmc_mask)) - goto Exit; - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Acquiring link record\n" - "\t\t\t\tsrc port 0x%" PRIx64 " (port %u)" - ", dest port 0x%" PRIx64 " (port %u)\n", - cl_ntoh64(osm_physp_get_port_guid(p_src_physp)), src_port_num, - cl_ntoh64(osm_physp_get_port_guid(p_dest_physp)), - dest_port_num); - - lr_rcv_build_physp_link(sa, from_base_lid, to_base_lid, src_port_num, - dest_port_num, p_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void lr_rcv_get_port_links(IN osm_sa_t * sa, - IN const ib_link_record_t * p_lr, - IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const ib_net64_t comp_mask, - IN cl_qlist_t * p_list, - IN const osm_physp_t * p_req_physp) -{ - const osm_physp_t *p_src_physp; - const osm_physp_t *p_dest_physp; - const cl_qmap_t *p_node_tbl; - osm_node_t *p_node; - uint8_t port_num; - uint8_t num_ports; - uint8_t dest_num_ports; - uint8_t dest_port_num; - - OSM_LOG_ENTER(sa->p_log); - - if (p_src_port) { - if (p_dest_port) { - /* - Build an LR for every link connected between both ports. - The inner function will discard physp combinations - that do not actually connect. Don't bother screening - for that here. - */ - num_ports = osm_node_get_num_physp(p_src_port->p_node); - dest_num_ports = - osm_node_get_num_physp(p_dest_port->p_node); - for (port_num = 1; port_num < num_ports; port_num++) { - p_src_physp = - osm_node_get_physp_ptr(p_src_port->p_node, - port_num); - for (dest_port_num = 1; - dest_port_num < dest_num_ports; - dest_port_num++) { - p_dest_physp = - osm_node_get_physp_ptr(p_dest_port-> - p_node, - dest_port_num); - /* both physical ports should be with data */ - if (p_src_physp && p_dest_physp) - lr_rcv_get_physp_link - (sa, p_lr, p_src_physp, - p_dest_physp, comp_mask, - p_list, p_req_physp); - } - } - } else { - /* - Build an LR for every link connected from the source port. - */ - if (comp_mask & IB_LR_COMPMASK_FROM_PORT) { - port_num = p_lr->from_port_num; - /* If the port number is out of the range of the p_src_port, then - this couldn't be a relevant record. */ - if (port_num < - p_src_port->p_node->physp_tbl_size) { - p_src_physp = - osm_node_get_physp_ptr(p_src_port-> - p_node, - port_num); - if (p_src_physp) - lr_rcv_get_physp_link - (sa, p_lr, p_src_physp, - NULL, comp_mask, p_list, - p_req_physp); - } - } else { - num_ports = - osm_node_get_num_physp(p_src_port->p_node); - for (port_num = 1; port_num < num_ports; - port_num++) { - p_src_physp = - osm_node_get_physp_ptr(p_src_port-> - p_node, - port_num); - if (p_src_physp) - lr_rcv_get_physp_link - (sa, p_lr, p_src_physp, - NULL, comp_mask, p_list, - p_req_physp); - } - } - } - } else { - if (p_dest_port) { - /* - Build an LR for every link connected to the dest port. - */ - if (comp_mask & IB_LR_COMPMASK_TO_PORT) { - port_num = p_lr->to_port_num; - /* If the port number is out of the range of the p_dest_port, then - this couldn't be a relevant record. */ - if (port_num < - p_dest_port->p_node->physp_tbl_size) { - p_dest_physp = - osm_node_get_physp_ptr(p_dest_port-> - p_node, - port_num); - if (p_dest_physp) - lr_rcv_get_physp_link - (sa, p_lr, NULL, - p_dest_physp, comp_mask, - p_list, p_req_physp); - } - } else { - num_ports = - osm_node_get_num_physp(p_dest_port->p_node); - for (port_num = 1; port_num < num_ports; - port_num++) { - p_dest_physp = - osm_node_get_physp_ptr(p_dest_port-> - p_node, - port_num); - if (p_dest_physp) - lr_rcv_get_physp_link - (sa, p_lr, NULL, - p_dest_physp, comp_mask, - p_list, p_req_physp); - } - } - } else { - /* - Process the world (recurse once back into this function). - */ - p_node_tbl = &sa->p_subn->node_guid_tbl; - p_node = (osm_node_t *) cl_qmap_head(p_node_tbl); - - while (p_node != (osm_node_t *) cl_qmap_end(p_node_tbl)) { - num_ports = osm_node_get_num_physp(p_node); - for (port_num = 1; port_num < num_ports; - port_num++) { - p_src_physp = - osm_node_get_physp_ptr(p_node, - port_num); - if (p_src_physp) - lr_rcv_get_physp_link - (sa, p_lr, p_src_physp, - NULL, comp_mask, p_list, - p_req_physp); - } - p_node = (osm_node_t *) cl_qmap_next(&p_node-> - map_item); - } - } - } - - OSM_LOG_EXIT(sa->p_log); -} - -/********************************************************************** - Returns the SA status to return to the client. - **********************************************************************/ -static ib_net16_t lr_rcv_get_end_points(IN osm_sa_t * sa, - IN const osm_madw_t * p_madw, - OUT const osm_port_t ** pp_src_port, - OUT const osm_port_t ** pp_dest_port) -{ - const ib_link_record_t *p_lr; - const ib_sa_mad_t *p_sa_mad; - ib_net64_t comp_mask; - ib_net16_t sa_status = IB_SA_MAD_STATUS_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - /* - Determine what fields are valid and then get a pointer - to the source and destination port objects, if possible. - */ - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_lr = (ib_link_record_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - - comp_mask = p_sa_mad->comp_mask; - *pp_src_port = NULL; - *pp_dest_port = NULL; - - if (p_sa_mad->comp_mask & IB_LR_COMPMASK_FROM_LID) { - *pp_src_port = osm_get_port_by_lid(sa->p_subn, p_lr->from_lid); - if (!*pp_src_port) { - /* - This 'error' is the client's fault (bad lid) so - don't enter it as an error in our own log. - Return an error response to the client. - */ - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "No source port with LID %u\n", - cl_ntoh16(p_lr->from_lid)); - - sa_status = IB_SA_MAD_STATUS_NO_RECORDS; - goto Exit; - } - } - - if (p_sa_mad->comp_mask & IB_LR_COMPMASK_TO_LID) { - *pp_dest_port = osm_get_port_by_lid(sa->p_subn, p_lr->to_lid); - if (!*pp_dest_port) { - /* - This 'error' is the client's fault (bad lid) so - don't enter it as an error in our own log. - Return an error response to the client. - */ - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "No dest port with LID %u\n", - cl_ntoh16(p_lr->to_lid)); - - sa_status = IB_SA_MAD_STATUS_NO_RECORDS; - goto Exit; - } - } - -Exit: - OSM_LOG_EXIT(sa->p_log); - return sa_status; -} - -void osm_lr_rcv_process(IN void *context, IN void *data) -{ - osm_sa_t *sa = context; - osm_madw_t *p_madw = data; - const ib_link_record_t *p_lr; - const ib_sa_mad_t *p_sa_mad; - const osm_port_t *p_src_port; - const osm_port_t *p_dest_port; - cl_qlist_t lr_list; - ib_net16_t status; - osm_physp_t *p_req_physp; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_lr = ib_sa_mad_get_payload_ptr(p_sa_mad); - - CL_ASSERT(p_sa_mad->attr_id == IB_MAD_ATTR_LINK_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (p_sa_mad->method != IB_MAD_METHOD_GET && - p_sa_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1804: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_sa_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1805: " - "Cannot find requester physical port\n"); - goto Exit; - } - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_link_record(sa->p_log, p_lr, OSM_LOG_DEBUG); - - cl_qlist_init(&lr_list); - - /* - Most SA functions (including this one) are read-only on the - subnet object, so we grab the lock non-exclusively. - */ - cl_plock_acquire(sa->p_lock); - - status = lr_rcv_get_end_points(sa, p_madw, &p_src_port, &p_dest_port); - - if (status == IB_SA_MAD_STATUS_SUCCESS) - lr_rcv_get_port_links(sa, p_lr, p_src_port, p_dest_port, - p_sa_mad->comp_mask, &lr_list, - p_req_physp); - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_link_record_t), &lr_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_mad_ctrl.c b/branches/opensm_3/user/opensm/osm_sa_mad_ctrl.c deleted file mode 100644 index 81aa30d4..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_mad_ctrl.c +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_sa_mad_ctrl_t. - * This object is part of the SA object. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include - -/****f* opensm: SA/sa_mad_ctrl_disp_done_callback - * NAME - * sa_mad_ctrl_disp_done_callback - * - * DESCRIPTION - * This function is the Dispatcher callback that indicates - * a received MAD has been processed by the recipient. - * - * SYNOPSIS - */ -static void sa_mad_ctrl_disp_done_callback(IN void *context, IN void *p_data) -{ - osm_sa_mad_ctrl_t *p_ctrl = context; - osm_madw_t *p_madw = p_data; - - OSM_LOG_ENTER(p_ctrl->p_log); - - CL_ASSERT(p_madw); - /* - Return the MAD & wrapper to the pool. - */ - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/************/ - -/****f* opensm: SA/sa_mad_ctrl_process - * NAME - * sa_mad_ctrl_process - * - * DESCRIPTION - * This function handles known methods for received MADs. - * - * SYNOPSIS - */ -static void sa_mad_ctrl_process(IN osm_sa_mad_ctrl_t * p_ctrl, - IN osm_madw_t * p_madw) -{ - ib_sa_mad_t *p_sa_mad; - cl_status_t status; - cl_disp_msgid_t msg_id = CL_DISP_MSGID_NONE; - uint64_t last_dispatched_msg_queue_time_msec; - uint32_t num_messages; - - OSM_LOG_ENTER(p_ctrl->p_log); - - /* - If the dispatcher is showing us that it is overloaded - there is no point in placing the request in. We should instead - provide immediate response - IB_RESOURCE_BUSY - But how do we know? - The dispatcher reports back the number of outstanding messages and - the time the last message stayed in the queue. - HACK: Actually, we cannot send a mad from within the receive callback; - thus - we will just drop it. - */ - cl_disp_get_queue_status(p_ctrl->h_disp, &num_messages, - &last_dispatched_msg_queue_time_msec); - if (num_messages > 1 && p_ctrl->p_subn->opt.max_msg_fifo_timeout && - last_dispatched_msg_queue_time_msec > - p_ctrl->p_subn->opt.max_msg_fifo_timeout) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_INFO, - /* "Responding BUSY status since the dispatcher is already" */ - "Dropping MAD since the dispatcher is already" - " overloaded with %u messages and queue time of:" - "%" PRIu64 "[msec]\n", - num_messages, last_dispatched_msg_queue_time_msec); - - /* send a busy response */ - /* osm_sa_send_error(p_ctrl->p_resp, p_madw, IB_RESOURCE_BUSY); */ - - /* return the request to the pool */ - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - - goto Exit; - } - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - - /* - Note that attr_id (like the rest of the MAD) is in - network byte order. - */ - switch (p_sa_mad->attr_id) { - case IB_MAD_ATTR_CLASS_PORT_INFO: - msg_id = OSM_MSG_MAD_CLASS_PORT_INFO; - break; - - case IB_MAD_ATTR_NODE_RECORD: - msg_id = OSM_MSG_MAD_NODE_RECORD; - break; - - case IB_MAD_ATTR_PORTINFO_RECORD: - msg_id = OSM_MSG_MAD_PORTINFO_RECORD; - break; - - case IB_MAD_ATTR_LINK_RECORD: - msg_id = OSM_MSG_MAD_LINK_RECORD; - break; - - case IB_MAD_ATTR_SMINFO_RECORD: - msg_id = OSM_MSG_MAD_SMINFO_RECORD; - break; - - case IB_MAD_ATTR_SERVICE_RECORD: - msg_id = OSM_MSG_MAD_SERVICE_RECORD; - break; - - case IB_MAD_ATTR_PATH_RECORD: - msg_id = OSM_MSG_MAD_PATH_RECORD; - break; - - case IB_MAD_ATTR_MCMEMBER_RECORD: - msg_id = OSM_MSG_MAD_MCMEMBER_RECORD; - break; - - case IB_MAD_ATTR_INFORM_INFO: - msg_id = OSM_MSG_MAD_INFORM_INFO; - break; - - case IB_MAD_ATTR_VLARB_RECORD: - msg_id = OSM_MSG_MAD_VL_ARB_RECORD; - break; - - case IB_MAD_ATTR_SLVL_RECORD: - msg_id = OSM_MSG_MAD_SLVL_TBL_RECORD; - break; - - case IB_MAD_ATTR_PKEY_TBL_RECORD: - msg_id = OSM_MSG_MAD_PKEY_TBL_RECORD; - break; - - case IB_MAD_ATTR_LFT_RECORD: - msg_id = OSM_MSG_MAD_LFT_RECORD; - break; - - case IB_MAD_ATTR_GUIDINFO_RECORD: - msg_id = OSM_MSG_MAD_GUIDINFO_RECORD; - break; - - case IB_MAD_ATTR_INFORM_INFO_RECORD: - msg_id = OSM_MSG_MAD_INFORM_INFO_RECORD; - break; - - case IB_MAD_ATTR_SWITCH_INFO_RECORD: - msg_id = OSM_MSG_MAD_SWITCH_INFO_RECORD; - break; - - case IB_MAD_ATTR_MFT_RECORD: - msg_id = OSM_MSG_MAD_MFT_RECORD; - break; - -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - case IB_MAD_ATTR_MULTIPATH_RECORD: - msg_id = OSM_MSG_MAD_MULTIPATH_RECORD; - break; -#endif - - default: - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 1A01: " - "Unsupported attribute 0x%X\n", - cl_ntoh16(p_sa_mad->attr_id)); - osm_dump_sa_mad(p_ctrl->p_log, p_sa_mad, OSM_LOG_ERROR); - } - - if (msg_id != CL_DISP_MSGID_NONE) { - /* - Post this MAD to the dispatcher for asynchronous - processing by the appropriate controller. - */ - - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, - "Posting Dispatcher message %s\n", - osm_get_disp_msg_str(msg_id)); - - status = cl_disp_post(p_ctrl->h_disp, msg_id, p_madw, - sa_mad_ctrl_disp_done_callback, p_ctrl); - - if (status != CL_SUCCESS) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 1A02: " - "Dispatcher post message failed (%s) for attribute 0x%X (%s)\n", - CL_STATUS_MSG(status), - cl_ntoh16(p_sa_mad->attr_id), - ib_get_sa_attr_str(p_sa_mad->attr_id)); - - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - } else { - /* - There is an unknown MAD attribute type for which there is - no recipient. Simply retire the MAD here. - */ - cl_atomic_inc(&p_ctrl->p_stats->sa_mads_rcvd_unknown); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - } - -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/* - * PARAMETERS - * - * RETURN VALUES - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* opensm: SA/sa_mad_ctrl_rcv_callback - * NAME - * sa_mad_ctrl_rcv_callback - * - * DESCRIPTION - * This is the callback from the transport layer for received MADs. - * - * SYNOPSIS - */ -static void sa_mad_ctrl_rcv_callback(IN osm_madw_t * p_madw, IN void *context, - IN osm_madw_t * p_req_madw) -{ - osm_sa_mad_ctrl_t *p_ctrl = context; - ib_sa_mad_t *p_sa_mad; - - OSM_LOG_ENTER(p_ctrl->p_log); - - CL_ASSERT(p_madw); - - /* - A MAD was received from the wire, possibly in response to a request. - */ - cl_atomic_inc(&p_ctrl->p_stats->sa_mads_rcvd); - - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, - "%u SA MADs received\n", p_ctrl->p_stats->sa_mads_rcvd); - - /* - * C15-0.1.3 requires not responding to any MAD if the SM is - * not in active state! - * We will not respond if the sm_state is not MASTER, or if the - * first_time_master_sweep flag (of the subnet) is TRUE - this - * flag indicates that the master still didn't finish its first - * sweep, so the subnet is not up and stable yet. - */ - if (p_ctrl->p_subn->sm_state != IB_SMINFO_STATE_MASTER) { - cl_atomic_inc(&p_ctrl->p_stats->sa_mads_ignored); - OSM_LOG(p_ctrl->p_log, OSM_LOG_VERBOSE, - "Received SA MAD while SM not MASTER. MAD ignored\n"); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - if (p_ctrl->p_subn->first_time_master_sweep == TRUE) { - cl_atomic_inc(&p_ctrl->p_stats->sa_mads_ignored); - OSM_LOG(p_ctrl->p_log, OSM_LOG_VERBOSE, - "Received SA MAD while SM in first sweep. MAD ignored\n"); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - - if (osm_log_is_active(p_ctrl->p_log, OSM_LOG_FRAMES)) - osm_dump_sa_mad(p_ctrl->p_log, p_sa_mad, OSM_LOG_FRAMES); - - /* - * C15-0.1.5 - Table 185: SA Header - p884 - * SM_key should be either 0 or match the current SM_Key - * otherwise discard the MAD. - */ - if (p_sa_mad->sm_key != 0 && - p_sa_mad->sm_key != p_ctrl->p_subn->opt.sa_key) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 1A04: " - "Non-Zero SA MAD SM_Key: 0x%" PRIx64 " != SM_Key: 0x%" - PRIx64 "; MAD ignored\n", cl_ntoh64(p_sa_mad->sm_key), - cl_ntoh64(p_ctrl->p_subn->opt.sa_key)); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - - switch (p_sa_mad->method) { - case IB_MAD_METHOD_REPORT_RESP: - /* we do not really do anything with report represses - - just retire the transaction */ - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, - "Received Report Repress. Retiring the transaction\n"); - - if (p_req_madw) - osm_mad_pool_put(p_ctrl->p_mad_pool, p_req_madw); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - - break; - - case IB_MAD_METHOD_GET: - case IB_MAD_METHOD_GETTABLE: -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - case IB_MAD_METHOD_GETMULTI: -#endif - case IB_MAD_METHOD_SET: - case IB_MAD_METHOD_DELETE: - sa_mad_ctrl_process(p_ctrl, p_madw); - break; - - default: - cl_atomic_inc(&p_ctrl->p_stats->sa_mads_rcvd_unknown); - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 1A05: " - "Unsupported method = 0x%X\n", p_sa_mad->method); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/* - * PARAMETERS - * - * RETURN VALUES - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* opensm: SA/sa_mad_ctrl_send_err_callback - * NAME - * sa_mad_ctrl_send_err_callback - * - * DESCRIPTION - * This is the callback from the transport layer for send errors - * on MADs that were expecting a response. - * - * SYNOPSIS - */ -static void sa_mad_ctrl_send_err_callback(IN void *context, - IN osm_madw_t * p_madw) -{ - osm_sa_mad_ctrl_t *p_ctrl = context; - cl_status_t status; - - OSM_LOG_ENTER(p_ctrl->p_log); - - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 1A06: " - "MAD transaction completed in error\n"); - - /* - We should never be here since the SA never originates a request. - Unless we generated a Report(Notice) - */ - - CL_ASSERT(p_madw); - - /* - An error occurred. No response was received to a request MAD. - Retire the original request MAD. - */ - - osm_dump_sa_mad(p_ctrl->p_log, osm_madw_get_sa_mad_ptr(p_madw), - OSM_LOG_ERROR); - - /* sm_mad_ctrl_update_wire_stats( p_ctrl ); */ - - if (osm_madw_get_err_msg(p_madw) != CL_DISP_MSGID_NONE) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, - "Posting Dispatcher message %s\n", - osm_get_disp_msg_str(osm_madw_get_err_msg(p_madw))); - - status = cl_disp_post(p_ctrl->h_disp, - osm_madw_get_err_msg(p_madw), p_madw, - sa_mad_ctrl_disp_done_callback, p_ctrl); - if (status != CL_SUCCESS) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 1A07: " - "Dispatcher post message failed (%s)\n", - CL_STATUS_MSG(status)); - } - } else /* No error message was provided, just retire the MAD. */ - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/* - * PARAMETERS - * - * RETURN VALUES - * - * NOTES - * - * SEE ALSO - *********/ - -void osm_sa_mad_ctrl_construct(IN osm_sa_mad_ctrl_t * p_ctrl) -{ - CL_ASSERT(p_ctrl); - memset(p_ctrl, 0, sizeof(*p_ctrl)); - p_ctrl->h_disp = CL_DISP_INVALID_HANDLE; -} - -void osm_sa_mad_ctrl_destroy(IN osm_sa_mad_ctrl_t * p_ctrl) -{ - CL_ASSERT(p_ctrl); - cl_disp_unregister(p_ctrl->h_disp); -} - -ib_api_status_t osm_sa_mad_ctrl_init(IN osm_sa_mad_ctrl_t * p_ctrl, - IN osm_sa_t * sa, - IN osm_mad_pool_t * p_mad_pool, - IN osm_vendor_t * p_vendor, - IN osm_subn_t * p_subn, - IN osm_log_t * p_log, - IN osm_stats_t * p_stats, - IN cl_dispatcher_t * p_disp) -{ - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_log); - - osm_sa_mad_ctrl_construct(p_ctrl); - - p_ctrl->sa = sa; - p_ctrl->p_log = p_log; - p_ctrl->p_disp = p_disp; - p_ctrl->p_mad_pool = p_mad_pool; - p_ctrl->p_vendor = p_vendor; - p_ctrl->p_stats = p_stats; - p_ctrl->p_subn = p_subn; - - p_ctrl->h_disp = cl_disp_register(p_disp, CL_DISP_MSGID_NONE, NULL, - p_ctrl); - - if (p_ctrl->h_disp == CL_DISP_INVALID_HANDLE) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 1A08: " - "Dispatcher registration failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -ib_api_status_t osm_sa_mad_ctrl_bind(IN osm_sa_mad_ctrl_t * p_ctrl, - IN ib_net64_t port_guid) -{ - osm_bind_info_t bind_info; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_ctrl->p_log); - - if (p_ctrl->h_bind != OSM_BIND_INVALID_HANDLE) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 1A09: " - "Multiple binds not allowed\n"); - status = IB_ERROR; - goto Exit; - } - - bind_info.class_version = 2; - bind_info.is_responder = TRUE; - bind_info.is_report_processor = FALSE; - bind_info.is_trap_processor = FALSE; - bind_info.mad_class = IB_MCLASS_SUBN_ADM; - bind_info.port_guid = port_guid; - bind_info.recv_q_size = OSM_SM_DEFAULT_QP1_RCV_SIZE; - bind_info.send_q_size = OSM_SM_DEFAULT_QP1_SEND_SIZE; - bind_info.timeout = p_ctrl->sa->p_subn->opt.transaction_timeout; - bind_info.retries = p_ctrl->sa->p_subn->opt.transaction_retries; - - OSM_LOG(p_ctrl->p_log, OSM_LOG_VERBOSE, - "Binding to port GUID 0x%" PRIx64 "\n", cl_ntoh64(port_guid)); - - p_ctrl->h_bind = osm_vendor_bind(p_ctrl->p_vendor, &bind_info, - p_ctrl->p_mad_pool, - sa_mad_ctrl_rcv_callback, - sa_mad_ctrl_send_err_callback, p_ctrl); - - if (p_ctrl->h_bind == OSM_BIND_INVALID_HANDLE) { - status = IB_ERROR; - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 1A10: " - "Vendor specific bind failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); - return status; -} - -ib_api_status_t osm_sa_mad_ctrl_unbind(IN osm_sa_mad_ctrl_t * p_ctrl) -{ - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_ctrl->p_log); - - if (p_ctrl->h_bind == OSM_BIND_INVALID_HANDLE) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 1A11: " - "No previous bind\n"); - status = IB_ERROR; - goto Exit; - } - - osm_vendor_unbind(p_ctrl->h_bind); -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); - return status; -} diff --git a/branches/opensm_3/user/opensm/osm_sa_mcmember_record.c b/branches/opensm_3/user/opensm/osm_sa_mcmember_record.c deleted file mode 100644 index 6698d6fb..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_mcmember_record.c +++ /dev/null @@ -1,1513 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_mcmr_recv_t. - * This object represents the MCMemberRecord Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define JOIN_MC_COMP_MASK (IB_MCR_COMPMASK_MGID | \ - IB_MCR_COMPMASK_PORT_GID | \ - IB_MCR_COMPMASK_JOIN_STATE) - -#define REQUIRED_MC_CREATE_COMP_MASK (IB_MCR_COMPMASK_MGID | \ - IB_MCR_COMPMASK_PORT_GID | \ - IB_MCR_COMPMASK_JOIN_STATE | \ - IB_MCR_COMPMASK_QKEY | \ - IB_MCR_COMPMASK_TCLASS | \ - IB_MCR_COMPMASK_PKEY | \ - IB_MCR_COMPMASK_FLOW | \ - IB_MCR_COMPMASK_SL) - -typedef struct osm_mcmr_item { - cl_list_item_t list_item; - ib_member_rec_t rec; -} osm_mcmr_item_t; - -/********************************************************************* - Copy certain fields between two mcmember records - used during the process of join request to copy data from the mgrp - to the port record. -**********************************************************************/ -static void copy_from_create_mc_rec(IN ib_member_rec_t * dest, - IN const ib_member_rec_t * src) -{ - dest->qkey = src->qkey; - dest->mlid = src->mlid; - dest->tclass = src->tclass; - dest->pkey = src->pkey; - dest->sl_flow_hop = src->sl_flow_hop; - dest->mtu = src->mtu; - dest->rate = src->rate; - dest->pkt_life = src->pkt_life; -} - -/********************************************************************* - Return mlid to the pool of free mlids. - But this implementation is not a pool - it simply scans through - the MGRP database for unused mlids... -*********************************************************************/ -static void free_mlid(IN osm_sa_t * sa, IN uint16_t mlid) -{ - UNUSED_PARAM(sa); - UNUSED_PARAM(mlid); -} - -/********************************************************************* - Get a new unused mlid by scanning all the used ones in the subnet. -**********************************************************************/ -/* Special Case IPv6 Solicited Node Multicast (SNM) addresses */ -/* 0xff1Z601bXXXX0000 : 0x00000001ffYYYYYY */ -/* Where Z is the scope, XXXX is the P_Key, and - * YYYYYY is the last 24 bits of the port guid */ -#define PREFIX_MASK CL_HTON64(0xff10ffff0000ffffULL) -#define PREFIX_SIGNATURE CL_HTON64(0xff10601b00000000ULL) -#define INT_ID_MASK CL_HTON64(0xfffffff1ff000000ULL) -#define INT_ID_SIGNATURE CL_HTON64(0x00000001ff000000ULL) - -static int compare_ipv6_snm_mgids(const void *m1, const void *m2) -{ - return memcmp(m1, m2, sizeof(ib_gid_t) - 6); -} - -static ib_net16_t find_ipv6_snm_mlid(osm_subn_t *subn, ib_gid_t *mgid) -{ - osm_mgrp_t *m = (osm_mgrp_t *)cl_fmap_match(&subn->mgrp_mgid_tbl, mgid, - compare_ipv6_snm_mgids); - if (m != (osm_mgrp_t *)cl_fmap_end(&subn->mgrp_mgid_tbl)) - return m->mlid; - return 0; -} - -static unsigned match_ipv6_snm_mgid(ib_gid_t * mgid) -{ - return ((mgid->unicast.prefix & PREFIX_MASK) == PREFIX_SIGNATURE && - (mgid->unicast.interface_id & INT_ID_MASK) == INT_ID_SIGNATURE); -} - -static ib_net16_t get_new_mlid(osm_sa_t * sa, ib_member_rec_t * mcmr) -{ - osm_subn_t *p_subn = sa->p_subn; - ib_net16_t requested_mlid = mcmr->mlid; - unsigned i, max; - - if (requested_mlid && cl_ntoh16(requested_mlid) >= IB_LID_MCAST_START_HO - && cl_ntoh16(requested_mlid) <= p_subn->max_mcast_lid_ho - && !osm_get_mbox_by_mlid(p_subn, requested_mlid)) - return requested_mlid; - - if (sa->p_subn->opt.consolidate_ipv6_snm_req - && match_ipv6_snm_mgid(&mcmr->mgid) - && (requested_mlid = find_ipv6_snm_mlid(sa->p_subn, &mcmr->mgid))) { - char str[INET6_ADDRSTRLEN]; - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Special Case Solicited Node Mcast Join for MGID %s\n", - inet_ntop(AF_INET6, mcmr->mgid.raw, str, sizeof(str))); - return requested_mlid; - } - - max = p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO + 1; - for (i = 0; i < max; i++) - if (!sa->p_subn->mboxes[i]) - return cl_hton16(i + IB_LID_MCAST_START_HO); - - return 0; -} - -static inline boolean_t check_join_comp_mask(ib_net64_t comp_mask) -{ - return ((comp_mask & JOIN_MC_COMP_MASK) == JOIN_MC_COMP_MASK); -} - -static boolean_t check_create_comp_mask(ib_net64_t comp_mask, - ib_member_rec_t * p_recvd_mcmember_rec) -{ - return ((comp_mask & REQUIRED_MC_CREATE_COMP_MASK) == - REQUIRED_MC_CREATE_COMP_MASK); -} - -/********************************************************************** - Generate the response MAD -**********************************************************************/ -static void mcmr_rcv_respond(IN osm_sa_t * sa, IN osm_madw_t * p_madw, - IN ib_member_rec_t * p_mcmember_rec) -{ - cl_qlist_t rec_list; - osm_mcmr_item_t *item; - - OSM_LOG_ENTER(sa->p_log); - - item = malloc(sizeof(*item)); - if (!item) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B16: " - "rec_item alloc failed\n"); - goto Exit; - } - - item->rec = *p_mcmember_rec; - - /* Fill in the mtu, rate, and packet lifetime selectors */ - item->rec.mtu &= 0x3f; - item->rec.mtu |= 2 << 6; /* exactly */ - item->rec.rate &= 0x3f; - item->rec.rate |= 2 << 6; /* exactly */ - item->rec.pkt_life &= 0x3f; - item->rec.pkt_life |= 2 << 6; /* exactly */ - - cl_qlist_init(&rec_list); - cl_qlist_insert_tail(&rec_list, &item->list_item); - - osm_sa_respond(sa, p_madw, sizeof(ib_member_rec_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -/********************************************************************* - In joining an existing group, or when querying the mc groups, - we make sure the following components provided match: MTU and RATE - HACK: Currently we ignore the PKT_LIFETIME field. -**********************************************************************/ -static boolean_t validate_more_comp_fields(osm_log_t * p_log, - const osm_mgrp_t * p_mgrp, - const ib_member_rec_t * - p_recvd_mcmember_rec, - ib_net64_t comp_mask) -{ - uint8_t mtu_sel; - uint8_t mtu_required; - uint8_t mtu_mgrp; - uint8_t rate_sel; - uint8_t rate_required; - uint8_t rate_mgrp; - - if (comp_mask & IB_MCR_COMPMASK_MTU_SEL) { - mtu_sel = (uint8_t) (p_recvd_mcmember_rec->mtu >> 6); - /* Clearing last 2 bits */ - mtu_required = (uint8_t) (p_recvd_mcmember_rec->mtu & 0x3F); - mtu_mgrp = (uint8_t) (p_mgrp->mcmember_rec.mtu & 0x3F); - switch (mtu_sel) { - case 0: /* Greater than MTU specified */ - if (mtu_mgrp <= mtu_required) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Requested mcast group has MTU %x, " - "which is not greater than %x\n", - mtu_mgrp, mtu_required); - return FALSE; - } - break; - case 1: /* Less than MTU specified */ - if (mtu_mgrp >= mtu_required) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Requested mcast group has MTU %x, " - "which is not less than %x\n", - mtu_mgrp, mtu_required); - return FALSE; - } - break; - case 2: /* Exactly MTU specified */ - if (mtu_mgrp != mtu_required) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Requested mcast group has MTU %x, " - "which is not equal to %x\n", - mtu_mgrp, mtu_required); - return FALSE; - } - break; - default: - break; - } - } - - /* what about rate ? */ - if (comp_mask & IB_MCR_COMPMASK_RATE_SEL) { - rate_sel = (uint8_t) (p_recvd_mcmember_rec->rate >> 6); - /* Clearing last 2 bits */ - rate_required = (uint8_t) (p_recvd_mcmember_rec->rate & 0x3F); - rate_mgrp = (uint8_t) (p_mgrp->mcmember_rec.rate & 0x3F); - switch (rate_sel) { - case 0: /* Greater than RATE specified */ - if (rate_mgrp <= rate_required) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Requested mcast group has RATE %x, " - "which is not greater than %x\n", - rate_mgrp, rate_required); - return FALSE; - } - break; - case 1: /* Less than RATE specified */ - if (rate_mgrp >= rate_required) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Requested mcast group has RATE %x, " - "which is not less than %x\n", - rate_mgrp, rate_required); - return FALSE; - } - break; - case 2: /* Exactly RATE specified */ - if (rate_mgrp != rate_required) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Requested mcast group has RATE %x, " - "which is not equal to %x\n", - rate_mgrp, rate_required); - return FALSE; - } - break; - default: - break; - } - } - - return TRUE; -} - -/********************************************************************* - In joining an existing group, we make sure the following components - are physically realizable: MTU and RATE -**********************************************************************/ -static boolean_t validate_port_caps(osm_log_t * p_log, - const osm_mgrp_t * p_mgrp, - const osm_physp_t * p_physp) -{ - uint8_t mtu_required; - uint8_t mtu_mgrp; - uint8_t rate_required; - uint8_t rate_mgrp; - - mtu_required = ib_port_info_get_mtu_cap(&p_physp->port_info); - mtu_mgrp = (uint8_t) (p_mgrp->mcmember_rec.mtu & 0x3F); - if (mtu_required < mtu_mgrp) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Port's MTU %x is less than %x\n", - mtu_required, mtu_mgrp); - return FALSE; - } - - rate_required = ib_port_info_compute_rate(&p_physp->port_info); - rate_mgrp = (uint8_t) (p_mgrp->mcmember_rec.rate & 0x3F); - if (rate_required < rate_mgrp) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Port's RATE %x is less than %x\n", - rate_required, rate_mgrp); - return FALSE; - } - - return TRUE; -} - -/********************************************************************** - * o15-0.2.1: If SA supports UD multicast, then if SA receives a SubnAdmSet() - * or SubnAdmDelete() method that would modify an existing - * MCMemberRecord, SA shall not modify that MCMemberRecord and shall - * return an error status of ERR_REQ_INVALID in response in the - * following cases: - * 1. Saved MCMemberRecord.ProxyJoin is not set and the request is - * issued by a requester with a GID other than the Port-GID. - * 2. Saved MCMemberRecord.ProxyJoin is set and the requester is not - * part of the partition for that MCMemberRecord. - **********************************************************************/ -static boolean_t validate_modify(IN osm_sa_t * sa, IN osm_mgrp_t * p_mgrp, - IN osm_mad_addr_t * p_mad_addr, - IN ib_member_rec_t * p_recvd_mcmember_rec, - OUT osm_mcm_port_t ** pp_mcm_port) -{ - ib_net64_t portguid; - ib_gid_t request_gid; - osm_physp_t *p_request_physp; - ib_api_status_t res; - - portguid = p_recvd_mcmember_rec->port_gid.unicast.interface_id; - - *pp_mcm_port = osm_mgrp_get_mcm_port(p_mgrp, portguid); - - /* o15-0.2.1: If this is a new port being added - nothing to check */ - if (!*pp_mcm_port) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "This is a new port in the MC group\n"); - return TRUE; - } - - /* We validate the request according the the proxy_join. - Check if the proxy_join is set or not */ - if ((*pp_mcm_port)->proxy_join == FALSE) { - /* The proxy_join is not set. Modifying can by done only - if the requester GID == PortGID */ - res = osm_get_gid_by_mad_addr(sa->p_log, sa->p_subn, p_mad_addr, - &request_gid); - if (res != IB_SUCCESS) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Could not find port for requested address\n"); - return FALSE; - } - - if (memcmp(&(*pp_mcm_port)->port_gid, &request_gid, - sizeof(ib_gid_t))) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "No ProxyJoin but different ports: stored:" - "0x%016" PRIx64 " request:0x%016" PRIx64 "\n", - cl_ntoh64((*pp_mcm_port)->port_gid.unicast. - interface_id), - cl_ntoh64(p_mad_addr->addr_type.gsi.grh_info. - src_gid.unicast.interface_id)); - return FALSE; - } - } else { - /* The proxy_join is set. Modification allowed only if the - requester is part of the partition for this MCMemberRecord */ - p_request_physp = osm_get_physp_by_mad_addr(sa->p_log, - sa->p_subn, - p_mad_addr); - if (p_request_physp == NULL) - return FALSE; - - if (!osm_physp_has_pkey(sa->p_log, p_mgrp->mcmember_rec.pkey, - p_request_physp)) { - /* the request port is not part of the partition for this mgrp */ - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "ProxyJoin but port not in partition. stored:" - "0x%016" PRIx64 " request:0x%016" PRIx64 "\n", - cl_ntoh64((*pp_mcm_port)->port->guid), - cl_ntoh64(p_mad_addr->addr_type.gsi.grh_info. - src_gid.unicast.interface_id)); - return FALSE; - } - } - return TRUE; -} - -/* - * Check legality of the requested MGID DELETE - * o15-0.1.14 = VALID DELETE: - * To be a valid delete MAD needs to: - * 1 the MADs PortGID and MGID components match the PortGID and - * MGID of a stored MCMemberRecord; - * 2 the MADs JoinState component contains at least one bit set to 1 - * in the same position as that stored MCMemberRecords JoinState - * has a bit set to 1, - * i.e., the logical AND of the two JoinState components - * is not all zeros; - * 3 the MADs JoinState component does not have some bits set - * which are not set in the stored MCMemberRecords JoinState component; - * 4 either the stored MCMemberRecord:ProxyJoin is reset (0), and the - * MADs source is the stored PortGID; - * OR - * the stored MCMemberRecord:ProxyJoin is set (1), (see o15- - * 0.1.2:); and the MADs source is a member of the partition indicated - * by the stored MCMemberRecord:P_Key. - */ -static boolean_t validate_delete(IN osm_sa_t * sa, IN osm_mgrp_t * p_mgrp, - IN osm_mad_addr_t * p_mad_addr, - IN ib_member_rec_t * p_recvd_mcmember_rec, - OUT osm_mcm_port_t ** pp_mcm_port) -{ - ib_net64_t portguid; - - portguid = p_recvd_mcmember_rec->port_gid.unicast.interface_id; - - *pp_mcm_port = osm_mgrp_get_mcm_port(p_mgrp, portguid); - - /* 1 */ - if (!*pp_mcm_port) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Failed to find the port in the MC group\n"); - return FALSE; - } - - /* 2 */ - if (!(p_recvd_mcmember_rec->scope_state & 0x0F & - (*pp_mcm_port)->scope_state)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Could not find any matching bits in the stored " - "and requested JoinStates\n"); - return FALSE; - } - - /* 3 */ - if (((p_recvd_mcmember_rec->scope_state & 0x0F) | - (0x0F & (*pp_mcm_port)->scope_state)) != - (0x0F & (*pp_mcm_port)->scope_state)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Some bits in the request JoinState (0x%X) are not " - "set in the stored port (0x%X)\n", - (p_recvd_mcmember_rec->scope_state & 0x0F), - (0x0F & (*pp_mcm_port)->scope_state)); - return FALSE; - } - - /* 4 */ - /* Validate according the the proxy_join (o15-0.1.2) */ - if (validate_modify(sa, p_mgrp, p_mad_addr, p_recvd_mcmember_rec, - pp_mcm_port) == FALSE) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "proxy_join validation failure\n"); - return FALSE; - } - return TRUE; -} - -/* - * Check legality of the requested MGID (note this does not hold for SA - * created MGIDs) - * - * Implementing o15-0.1.5: - * A multicast GID is considered to be invalid if: - * 1. It does not comply with the rules as specified in 4.1.1 "GID Usage and - * Properties" on page 145: - * - * 14) The multicast GID format is (bytes are comma sep): - * 0xff,,,,

,

,

,

,

,

,

,

,,,, - * Fl 4bit = Flags (b) - * Sc 4bit = Scope (c) - * Si 16bit = Signature (2) - * P 64bit = GID Prefix (should be a subnet unique ID - normally Subnet Prefix) - * Id 32bit = Unique ID in the Subnet (might be MLID or Pkey ?) - * - * a) 8-bits of 11111111 at the start of the GID identifies this as being a - * multicast GID. - * b) Flags is a set of four 1-bit flags: 000T with three flags reserved - * and defined as zero (0). The T flag is defined as follows: - * i) T = 0 indicates this is a permanently assigned (i.e. wellknown) - * multicast GID. See RFC 2373 and RFC 2375 as reference - * for these permanently assigned GIDs. - * ii) T = 1 indicates this is a non-permanently assigned (i.e. transient) - * multicast GID. - * c) Scope is a 4-bit multicast scope value used to limit the scope of - * the multicast group. The following table defines scope value and - * interpretation. - * - * Multicast Address Scope Values: - * 0x2 Link-local - * 0x5 Site-local - * 0x8 Organization-local - * 0xE Global - * - * 2. It contains the SA-specific signature of 0xA01B and has the link-local - * scope bits set. (EZ: the idea here is that SA created MGIDs are the - * only source for this signature with link-local scope) - */ -static ib_api_status_t validate_requested_mgid(IN osm_sa_t * sa, - IN const ib_member_rec_t * - p_mcm_rec) -{ - uint16_t signature; - boolean_t valid = TRUE; - - OSM_LOG_ENTER(sa->p_log); - - /* 14-a: mcast GID must start with 0xFF */ - if (p_mcm_rec->mgid.multicast.header[0] != 0xFF) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B01: " - "Wrong MGID Prefix 0x%02X must be 0xFF\n", - cl_ntoh16(p_mcm_rec->mgid.multicast.header[0])); - valid = FALSE; - goto Exit; - } - - /* the MGID signature can mark IPoIB or SA assigned MGIDs */ - memcpy(&signature, &(p_mcm_rec->mgid.multicast.raw_group_id), - sizeof(signature)); - signature = cl_ntoh16(signature); - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "MGID Signed as 0x%04X\n", signature); - - /* - * We skip any checks for MGIDs that follow IPoIB - * GID structure as defined by the IETF ipoib-link-multicast. - * - * For IPv4 over IB, the signature will be "0x401B". - * - * | 8 | 4 | 4 | 16 bits | 16 bits | 48 bits | 32 bits | - * +--------+----+----+-----------------+---------+----------+---------+ - * |11111111|0001|scop||< P_Key >|00.......0|| - * +--------+----+----+-----------------+---------+----------+---------+ - * - * For IPv6 over IB, the signature will be "0x601B". - * - * | 8 | 4 | 4 | 16 bits | 16 bits | 80 bits | - * +--------+----+----+-----------------+---------+--------------------+ - * |11111111|0001|scop||< P_Key >|000.............0001| - * +--------+----+----+-----------------+---------+--------------------+ - * - */ - if (signature == 0x401B || signature == 0x601B) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Skipping MGID Validation for IPoIB Signed (0x%04X) MGIDs\n", - signature); - goto Exit; - } - - /* 14-b: the 3 upper bits in the "flags" should be zero: */ - if (p_mcm_rec->mgid.multicast.header[1] & 0xE0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B28: " - "MGID uses Reserved Flags: flags=0x%X\n", - (p_mcm_rec->mgid.multicast.header[1] & 0xE0) >> 4); - valid = FALSE; - goto Exit; - } - - /* 2 - now what if the link local format 0xA01B is used - - the scope should not be link local */ - if (signature == 0xA01B && - (p_mcm_rec->mgid.multicast.header[1] & 0x0F) == - IB_MC_SCOPE_LINK_LOCAL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B24: " - "MGID uses 0xA01B signature but with link-local scope\n"); - valid = FALSE; - goto Exit; - } - - /* - * For SA assigned MGIDs (signature 0xA01B): - * There is no real way to make sure the Unique MGID Prefix is really unique. - * If we could enforce using the Subnet Prefix for that purpose it would - * have been nice. But the spec does not require it. - */ - -Exit: - OSM_LOG_EXIT(sa->p_log); - return valid; -} - -/********************************************************************** - Check if the requested new MC group parameters are realizable. - Also set the default MTU and Rate if not provided by the user. -**********************************************************************/ -static boolean_t mgrp_request_is_realizable(IN osm_sa_t * sa, - IN ib_net64_t comp_mask, - IN ib_member_rec_t * p_mcm_rec, - IN const osm_physp_t * p_physp) -{ - uint8_t mtu_sel = 2; /* exactly */ - uint8_t mtu_required, mtu, port_mtu; - uint8_t rate_sel = 2; /* exactly */ - uint8_t rate_required, rate, port_rate; - osm_log_t *p_log = sa->p_log; - - OSM_LOG_ENTER(sa->p_log); - - /* - * End of o15-0.2.3 specifies: - * .... - * The entity may also supply the other components such as HopLimit, - * MTU, etc. during group creation time. If these components are not - * provided during group creation time, SA will provide them for the - * group. The values chosen are vendor-dependent and beyond the scope - * of the specification. - * - * so we might also need to assign RATE/MTU if they are not comp - * masked in. - */ - - port_mtu = p_physp ? ib_port_info_get_mtu_cap(&p_physp->port_info) : 0; - if (!(comp_mask & IB_MCR_COMPMASK_MTU) || - !(comp_mask & IB_MCR_COMPMASK_MTU_SEL) || - (mtu_sel = (p_mcm_rec->mtu >> 6)) == 3) - mtu = port_mtu ? port_mtu : sa->p_subn->min_ca_mtu; - else { - mtu_required = (uint8_t) (p_mcm_rec->mtu & 0x3F); - mtu = mtu_required; - switch (mtu_sel) { - case 0: /* Greater than MTU specified */ - if (port_mtu && mtu_required >= port_mtu) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Requested MTU %x >= the port\'s mtu:%x\n", - mtu_required, port_mtu); - return FALSE; - } - /* we provide the largest MTU possible if we can */ - if (port_mtu) - mtu = port_mtu; - else if (mtu_required < sa->p_subn->min_ca_mtu) - mtu = sa->p_subn->min_ca_mtu; - else - mtu++; - break; - case 1: /* Less than MTU specified */ - /* use the smaller of the two: - a. one lower then the required - b. the mtu of the requesting port (if exists) */ - if (port_mtu && mtu_required > port_mtu) - mtu = port_mtu; - else - mtu--; - break; - case 2: /* Exactly MTU specified */ - default: - break; - } - /* make sure it still be in the range */ - if (mtu < IB_MIN_MTU || mtu > IB_MAX_MTU) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Calculated MTU %x is out of range\n", mtu); - return FALSE; - } - } - p_mcm_rec->mtu = (mtu_sel << 6) | mtu; - - port_rate = - p_physp ? ib_port_info_compute_rate(&p_physp->port_info) : 0; - if (!(comp_mask & IB_MCR_COMPMASK_RATE) - || !(comp_mask & IB_MCR_COMPMASK_RATE_SEL) - || (rate_sel = (p_mcm_rec->rate >> 6)) == 3) - rate = port_rate ? port_rate : sa->p_subn->min_ca_rate; - else { - rate_required = (uint8_t) (p_mcm_rec->rate & 0x3F); - rate = rate_required; - switch (rate_sel) { - case 0: /* Greater than RATE specified */ - if (port_rate && rate_required >= port_rate) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Requested RATE %x >= the port\'s rate:%x\n", - rate_required, port_rate); - return FALSE; - } - /* we provide the largest RATE possible if we can */ - if (port_rate) - rate = port_rate; - else if (rate_required < sa->p_subn->min_ca_rate) - rate = sa->p_subn->min_ca_rate; - else - rate++; - break; - case 1: /* Less than RATE specified */ - /* use the smaller of the two: - a. one lower then the required - b. the rate of the requesting port (if exists) */ - if (port_rate && rate_required > port_rate) - rate = port_rate; - else - rate--; - break; - case 2: /* Exactly RATE specified */ - default: - break; - } - /* make sure it still is in the range */ - if (rate < IB_MIN_RATE || rate > IB_MAX_RATE) { - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Calculated RATE %x is out of range\n", rate); - return FALSE; - } - } - p_mcm_rec->rate = (rate_sel << 6) | rate; - - OSM_LOG_EXIT(sa->p_log); - return TRUE; -} - -static unsigned build_new_mgid(osm_sa_t * sa, ib_net64_t comp_mask, - ib_member_rec_t * mcmr) -{ - static uint32_t uniq_count; - ib_gid_t *mgid = &mcmr->mgid; - uint8_t scope; - unsigned i; - - /* use the given scope state only if requested! */ - if (comp_mask & IB_MCR_COMPMASK_SCOPE) - ib_member_get_scope_state(mcmr->scope_state, &scope, NULL); - else - /* to guarantee no collision with other subnets use local scope! */ - scope = IB_MC_SCOPE_LINK_LOCAL; - - mgid->raw[0] = 0xff; - mgid->raw[1] = 0x10 | scope; - mgid->raw[2] = 0xa0; - mgid->raw[3] = 0x1b; - - /* HACK: use the SA port gid to make it globally unique */ - memcpy(&mgid->raw[4], &sa->p_subn->opt.subnet_prefix, sizeof(uint64_t)); - - for (i = 0; i < 1000; i++) { - memcpy(&mgid->raw[10], &uniq_count, 4); - uniq_count++; - if (!osm_get_mgrp_by_mgid(sa->p_subn, mgid)) - return 1; - } - - return 0; -} - -/********************************************************************** - Call this function to create a new mgrp. -**********************************************************************/ -static ib_api_status_t mcmr_rcv_create_new_mgrp(IN osm_sa_t * sa, - IN ib_net64_t comp_mask, - IN const ib_member_rec_t * - p_recvd_mcmember_rec, - IN const osm_physp_t * p_physp, - OUT osm_mgrp_t ** pp_mgrp) -{ - ib_net16_t mlid; - ib_api_status_t status = IB_SUCCESS; - ib_member_rec_t mcm_rec = *p_recvd_mcmember_rec; /* copy for modifications */ - - OSM_LOG_ENTER(sa->p_log); - - /* we need to create the new MGID if it was not defined */ - if (!ib_gid_is_notzero(&p_recvd_mcmember_rec->mgid)) { - /* create a new MGID */ - char gid_str[INET6_ADDRSTRLEN]; - - if (!build_new_mgid(sa, comp_mask, &mcm_rec)) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B23: " - "cannot allocate unique MGID value\n"); - status = IB_SA_MAD_STATUS_NO_RESOURCES; - goto Exit; - } - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Allocated new MGID:%s\n", - inet_ntop(AF_INET6, mcm_rec.mgid.raw, gid_str, - sizeof gid_str)); - } else if (!validate_requested_mgid(sa, &mcm_rec)) { - /* a specific MGID was requested so validate the resulting MGID */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B22: " - "Invalid requested MGID\n"); - status = IB_SA_MAD_STATUS_REQ_INVALID; - goto Exit; - } - - /* check the requested parameters are realizable */ - if (mgrp_request_is_realizable(sa, comp_mask, &mcm_rec, p_physp) == - FALSE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B26: " - "Requested MGRP parameters are not realizable\n"); - status = IB_SA_MAD_STATUS_REQ_INVALID; - goto Exit; - } - - mlid = get_new_mlid(sa, &mcm_rec); - if (mlid == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B19: " - "get_new_mlid failed request mlid 0x%04x\n", - cl_ntoh16(mcm_rec.mlid)); - status = IB_SA_MAD_STATUS_NO_RESOURCES; - goto Exit; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Obtained new mlid 0x%X\n", - cl_ntoh16(mlid)); - - mcm_rec.mlid = mlid; - /* create a new MC Group */ - *pp_mgrp = osm_mgrp_new(sa->p_subn, mlid, &mcm_rec); - if (*pp_mgrp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B08: " - "osm_mgrp_new failed\n"); - free_mlid(sa, mlid); - status = IB_SA_MAD_STATUS_NO_RESOURCES; - goto Exit; - } - - /* the mcmember_record should have mtu_sel, rate_sel, and pkt_lifetime_sel = 2 */ - (*pp_mgrp)->mcmember_rec.mtu &= 0x3f; - (*pp_mgrp)->mcmember_rec.mtu |= 2 << 6; /* exactly */ - (*pp_mgrp)->mcmember_rec.rate &= 0x3f; - (*pp_mgrp)->mcmember_rec.rate |= 2 << 6; /* exactly */ - (*pp_mgrp)->mcmember_rec.pkt_life &= 0x3f; - (*pp_mgrp)->mcmember_rec.pkt_life |= 2 << 6; /* exactly */ - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -/********************************************************************** - Call this function to find or create a new mgrp. -**********************************************************************/ -ib_api_status_t osm_mcmr_rcv_find_or_create_new_mgrp(IN osm_sa_t * sa, - IN ib_net64_t comp_mask, - IN ib_member_rec_t * - p_recvd_mcmember_rec, - OUT osm_mgrp_t ** pp_mgrp) -{ - osm_mgrp_t *mgrp; - - if ((mgrp = osm_get_mgrp_by_mgid(sa->p_subn, - &p_recvd_mcmember_rec->mgid))) { - *pp_mgrp = mgrp; - return IB_SUCCESS; - } - return mcmr_rcv_create_new_mgrp(sa, comp_mask, p_recvd_mcmember_rec, - NULL, pp_mgrp); -} - -/********************************************************************* -Process a request for leaving the group -**********************************************************************/ -static void mcmr_rcv_leave_mgrp(IN osm_sa_t * sa, IN osm_madw_t * p_madw) -{ - osm_mgrp_t *p_mgrp; - ib_sa_mad_t *p_sa_mad; - ib_member_rec_t *p_recvd_mcmember_rec; - ib_member_rec_t mcmember_rec; - ib_net64_t portguid; - osm_mcm_port_t *p_mcm_port; - - OSM_LOG_ENTER(sa->p_log); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_recvd_mcmember_rec = - (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - - mcmember_rec = *p_recvd_mcmember_rec; - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Dump of record\n"); - osm_dump_mc_record(sa->p_log, &mcmember_rec, OSM_LOG_DEBUG); - } - - CL_PLOCK_EXCL_ACQUIRE(sa->p_lock); - p_mgrp = osm_get_mgrp_by_mgid(sa->p_subn, &p_recvd_mcmember_rec->mgid); - if (!p_mgrp) { - char gid_str[INET6_ADDRSTRLEN]; - CL_PLOCK_RELEASE(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Failed since multicast group %s not present\n", - inet_ntop(AF_INET6, p_recvd_mcmember_rec->mgid.raw, - gid_str, sizeof gid_str)); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - portguid = p_recvd_mcmember_rec->port_gid.unicast.interface_id; - - /* check validity of the delete request o15-0.1.14 */ - if (!validate_delete(sa, p_mgrp, osm_madw_get_mad_addr_ptr(p_madw), - p_recvd_mcmember_rec, &p_mcm_port)) { - char gid_str[INET6_ADDRSTRLEN]; - char gid_str2[INET6_ADDRSTRLEN]; - CL_PLOCK_RELEASE(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B25: " - "Received an invalid delete request for " - "MGID: %s for PortGID: %s\n", - inet_ntop(AF_INET6, p_recvd_mcmember_rec->mgid.raw, - gid_str, sizeof gid_str), - inet_ntop(AF_INET6, p_recvd_mcmember_rec->port_gid.raw, - gid_str2, sizeof gid_str2)); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* remove port and/or update join state */ - osm_mgrp_remove_port(sa->p_subn, sa->p_log, p_mgrp, p_mcm_port, - &mcmember_rec); - CL_PLOCK_RELEASE(sa->p_lock); - - mcmr_rcv_respond(sa, p_madw, &mcmember_rec); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -/********************************************************************** - Handle a join (or create) request -**********************************************************************/ -static void mcmr_rcv_join_mgrp(IN osm_sa_t * sa, IN osm_madw_t * p_madw) -{ - osm_mgrp_t *p_mgrp = NULL; - ib_api_status_t status; - ib_sa_mad_t *p_sa_mad; - ib_member_rec_t *p_recvd_mcmember_rec; - ib_member_rec_t mcmember_rec; - osm_mcm_port_t *p_mcmr_port; - ib_net64_t portguid; - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_physp_t *p_request_physp; - uint8_t is_new_group; /* TRUE = there is a need to create a group */ - uint8_t join_state; - boolean_t proxy; - - OSM_LOG_ENTER(sa->p_log); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_recvd_mcmember_rec = ib_sa_mad_get_payload_ptr(p_sa_mad); - - portguid = p_recvd_mcmember_rec->port_gid.unicast.interface_id; - - mcmember_rec = *p_recvd_mcmember_rec; - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Dump of incoming record\n"); - osm_dump_mc_record(sa->p_log, &mcmember_rec, OSM_LOG_DEBUG); - } - - CL_PLOCK_EXCL_ACQUIRE(sa->p_lock); - - /* make sure the requested port guid is known to the SM */ - p_port = osm_get_port_by_guid(sa->p_subn, portguid); - if (!p_port) { - CL_PLOCK_RELEASE(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Unknown port GUID 0x%016" PRIx64 "\n", - cl_ntoh64(portguid)); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - p_physp = p_port->p_physp; - /* Check that the p_physp and the requester physp are in the same - partition. */ - p_request_physp = - osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr(p_madw)); - if (p_request_physp == NULL) { - CL_PLOCK_RELEASE(sa->p_lock); - goto Exit; - } - - proxy = (p_physp != p_request_physp); - - if (proxy && !osm_physp_share_pkey(sa->p_log, p_physp, p_request_physp)) { - CL_PLOCK_RELEASE(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "Port and requester don't share pkey\n"); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - ib_member_get_scope_state(p_recvd_mcmember_rec->scope_state, NULL, - &join_state); - - /* do we need to create a new group? */ - p_mgrp = osm_get_mgrp_by_mgid(sa->p_subn, &p_recvd_mcmember_rec->mgid); - if (!p_mgrp) { - /* check for JoinState.FullMember = 1 o15.0.1.9 */ - if ((join_state & 0x01) != 0x01) { - char gid_str[INET6_ADDRSTRLEN]; - CL_PLOCK_RELEASE(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B10: " - "Provided Join State != FullMember - " - "required for create, " - "MGID: %s from port 0x%016" PRIx64 " (%s)\n", - inet_ntop(AF_INET6, - p_recvd_mcmember_rec->mgid.raw, - gid_str, sizeof gid_str), - cl_ntoh64(portguid), - p_port->p_node->print_desc); - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* check the comp_mask */ - if (!check_create_comp_mask(p_sa_mad->comp_mask, - p_recvd_mcmember_rec)) { - char gid_str[INET6_ADDRSTRLEN]; - CL_PLOCK_RELEASE(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B11: " - "method = %s, scope_state = 0x%x, " - "component mask = 0x%016" PRIx64 ", " - "expected comp mask = 0x%016" PRIx64 ", " - "MGID: %s from port 0x%016" PRIx64 " (%s)\n", - ib_get_sa_method_str(p_sa_mad->method), - p_recvd_mcmember_rec->scope_state, - cl_ntoh64(p_sa_mad->comp_mask), - CL_NTOH64(REQUIRED_MC_CREATE_COMP_MASK), - inet_ntop(AF_INET6, - p_recvd_mcmember_rec->mgid.raw, - gid_str, sizeof gid_str), - cl_ntoh64(portguid), - p_port->p_node->print_desc); - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_INSUF_COMPS); - goto Exit; - } - - status = mcmr_rcv_create_new_mgrp(sa, p_sa_mad->comp_mask, - p_recvd_mcmember_rec, - p_physp, &p_mgrp); - if (status != IB_SUCCESS) { - CL_PLOCK_RELEASE(sa->p_lock); - osm_sa_send_error(sa, p_madw, status); - goto Exit; - } - /* copy the MGID to the result */ - mcmember_rec.mgid = p_mgrp->mcmember_rec.mgid; - is_new_group = 1; - } else - /* no need for a new group */ - is_new_group = 0; - - CL_ASSERT(p_mgrp); - - /* - * o15-0.2.4: If SA supports UD multicast, then SA shall cause an - * endport to join an existing multicast group if: - * 1. It receives a SubnAdmSet() method for a MCMemberRecord, and - * - WE KNOW THAT ALREADY - * 2. The MGID is specified and matches an existing multicast - * group, and - * - WE KNOW THAT ALREADY - * 3. The MCMemberRecord:JoinState is not all 0s, and - * 4. PortGID is specified and - * - WE KNOW THAT ALREADY (as it matched a real one) - * 5. All other components match that existing group, either by - * being wildcarded or by having values identical to those specified - * by the component mask and in use by the group with the exception - * of components such as ProxyJoin and Reserved, which are ignored - * by SA. - * - * We need to check #3 and #5 here: - */ - if (!validate_more_comp_fields(sa->p_log, p_mgrp, p_recvd_mcmember_rec, - p_sa_mad->comp_mask) - || !validate_port_caps(sa->p_log, p_mgrp, p_physp) - || !(join_state != 0)) { - /* since we might have created the new group we need to cleanup */ - osm_mgrp_cleanup(sa->p_subn, p_mgrp); - CL_PLOCK_RELEASE(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B12: " - "validate_more_comp_fields, validate_port_caps, " - "or JoinState = 0 failed from port 0x%016" PRIx64 - " (%s), " "sending IB_SA_MAD_STATUS_REQ_INVALID\n", - cl_ntoh64(portguid), p_port->p_node->print_desc); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* - * o15-0.2.1 requires validation of the requesting port - * in the case of modification: - */ - if (!is_new_group && - !validate_modify(sa, p_mgrp, osm_madw_get_mad_addr_ptr(p_madw), - p_recvd_mcmember_rec, &p_mcmr_port)) { - CL_PLOCK_RELEASE(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B13: " - "validate_modify failed from port 0x%016" PRIx64 - " (%s), sending IB_SA_MAD_STATUS_REQ_INVALID\n", - cl_ntoh64(portguid), p_port->p_node->print_desc); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* copy qkey mlid tclass pkey sl_flow_hop mtu rate pkt_life sl_flow_hop */ - copy_from_create_mc_rec(&mcmember_rec, &p_mgrp->mcmember_rec); - - /* create or update existing port (join-state will be updated) */ - p_mcmr_port = osm_mgrp_add_port(sa->p_subn, sa->p_log, p_mgrp, p_port, - &mcmember_rec, proxy); - if (!p_mcmr_port) { - /* we fail to add the port so we might need to delete the group */ - osm_mgrp_cleanup(sa->p_subn, p_mgrp); - CL_PLOCK_RELEASE(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B06: " - "osm_mgrp_add_port failed\n"); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_NO_RESOURCES); - goto Exit; - } - - /* Release the lock as we don't need it. */ - CL_PLOCK_RELEASE(sa->p_lock); - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_mc_record(sa->p_log, &mcmember_rec, OSM_LOG_DEBUG); - - mcmr_rcv_respond(sa, p_madw, &mcmember_rec); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -/********************************************************************** - Add a patched multicast group to the results list -**********************************************************************/ -static ib_api_status_t mcmr_rcv_new_mcmr(IN osm_sa_t * sa, - IN const ib_member_rec_t * p_rcvd_rec, - IN cl_qlist_t * p_list) -{ - osm_mcmr_item_t *p_rec_item; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B15: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - /* HACK: Untrusted requesters should result with 0 Join - State, Port Guid, and Proxy */ - p_rec_item->rec = *p_rcvd_rec; - cl_qlist_insert_tail(p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -/********************************************************************** - Match the given mgrp to the requested mcmr -**********************************************************************/ -static void mcmr_by_comp_mask(osm_sa_t * sa, const ib_member_rec_t * p_rcvd_rec, - ib_net64_t comp_mask, osm_mgrp_t * p_mgrp, - const osm_physp_t * p_req_physp, - boolean_t trusted_req, cl_qlist_t * list) -{ - /* since we might change scope_state */ - ib_member_rec_t match_rec; - osm_mcm_port_t *p_mcm_port; - ib_net64_t portguid = p_rcvd_rec->port_gid.unicast.interface_id; - /* will be used for group or port info */ - uint8_t scope_state; - uint8_t scope_state_mask = 0; - cl_map_item_t *p_item; - ib_gid_t port_gid; - boolean_t proxy_join = FALSE; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Checking mlid:0x%X\n", cl_ntoh16(p_mgrp->mlid)); - - /* first try to eliminate the group by MGID, MLID, or P_Key */ - if ((IB_MCR_COMPMASK_MGID & comp_mask) && - memcmp(&p_rcvd_rec->mgid, &p_mgrp->mcmember_rec.mgid, - sizeof(ib_gid_t))) - goto Exit; - - if ((IB_MCR_COMPMASK_MLID & comp_mask) && - memcmp(&p_rcvd_rec->mlid, &p_mgrp->mcmember_rec.mlid, - sizeof(uint16_t))) - goto Exit; - - /* if the requester physical port doesn't have the pkey that is defined - for the group - exit. */ - if (!osm_physp_has_pkey(sa->p_log, p_mgrp->mcmember_rec.pkey, - p_req_physp)) - goto Exit; - - /* now do the rest of the match */ - if ((IB_MCR_COMPMASK_QKEY & comp_mask) && - p_rcvd_rec->qkey != p_mgrp->mcmember_rec.qkey) - goto Exit; - - if ((IB_MCR_COMPMASK_PKEY & comp_mask) && - p_rcvd_rec->pkey != p_mgrp->mcmember_rec.pkey) - goto Exit; - - if ((IB_MCR_COMPMASK_TCLASS & comp_mask) && - p_rcvd_rec->tclass != p_mgrp->mcmember_rec.tclass) - goto Exit; - - /* check SL, Flow, and Hop limit */ - { - uint8_t mgrp_sl, query_sl; - uint32_t mgrp_flow, query_flow; - uint8_t mgrp_hop, query_hop; - - ib_member_get_sl_flow_hop(p_rcvd_rec->sl_flow_hop, - &query_sl, &query_flow, &query_hop); - - ib_member_get_sl_flow_hop(p_mgrp->mcmember_rec.sl_flow_hop, - &mgrp_sl, &mgrp_flow, &mgrp_hop); - - if ((IB_MCR_COMPMASK_SL & comp_mask) && query_sl != mgrp_sl) - goto Exit; - - if ((IB_MCR_COMPMASK_FLOW & comp_mask) && - query_flow != mgrp_flow) - goto Exit; - - if ((IB_MCR_COMPMASK_HOP & comp_mask) && query_hop != mgrp_hop) - goto Exit; - } - - if ((IB_MCR_COMPMASK_PROXY & comp_mask) && - p_rcvd_rec->proxy_join != p_mgrp->mcmember_rec.proxy_join) - goto Exit; - - /* need to validate mtu, rate, and pkt_lifetime fields */ - if (validate_more_comp_fields(sa->p_log, p_mgrp, p_rcvd_rec, - comp_mask) == FALSE) - goto Exit; - - /* Port specific fields */ - /* so did we get the PortGUID mask */ - if (IB_MCR_COMPMASK_PORT_GID & comp_mask) { - /* try to find this port */ - p_mcm_port = osm_mgrp_get_mcm_port(p_mgrp, portguid); - if (!p_mcm_port) /* port not in group */ - goto Exit; - scope_state = p_mcm_port->scope_state; - memcpy(&port_gid, &(p_mcm_port->port_gid), sizeof(ib_gid_t)); - proxy_join = p_mcm_port->proxy_join; - } else /* point to the group information */ - scope_state = p_mgrp->mcmember_rec.scope_state; - - if (IB_MCR_COMPMASK_SCOPE & comp_mask) - scope_state_mask = 0xF0; - - if (IB_MCR_COMPMASK_JOIN_STATE & comp_mask) - scope_state_mask = scope_state_mask | 0x0F; - - /* Many MC records returned */ - if (trusted_req == TRUE && !(IB_MCR_COMPMASK_PORT_GID & comp_mask)) { - char gid_str[INET6_ADDRSTRLEN]; - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Trusted req is TRUE and no specific port defined\n"); - - /* return all the ports that match in this MC group */ - p_item = cl_qmap_head(&(p_mgrp->mcm_port_tbl)); - while (p_item != cl_qmap_end(&(p_mgrp->mcm_port_tbl))) { - p_mcm_port = (osm_mcm_port_t *) p_item; - - if ((scope_state_mask & p_rcvd_rec->scope_state) == - (scope_state_mask & p_mcm_port->scope_state)) { - /* add to the list */ - match_rec = p_mgrp->mcmember_rec; - match_rec.scope_state = p_mcm_port->scope_state; - memcpy(&match_rec.port_gid, - &p_mcm_port->port_gid, sizeof(ib_gid_t)); - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Record of port_gid: %s" - " in multicast_lid: 0x%X is returned\n", - inet_ntop(AF_INET6, - match_rec.port_gid.raw, - gid_str, sizeof gid_str), - cl_ntoh16(p_mgrp->mlid)); - - match_rec.proxy_join = - (uint8_t) (p_mcm_port->proxy_join); - - mcmr_rcv_new_mcmr(sa, &match_rec, list); - } - p_item = cl_qmap_next(p_item); - } - } else { /* One MC record returned */ - if ((scope_state_mask & p_rcvd_rec->scope_state) != - (scope_state_mask & scope_state)) - goto Exit; - - /* add to the list */ - match_rec = p_mgrp->mcmember_rec; - match_rec.scope_state = scope_state; - memcpy(&(match_rec.port_gid), &port_gid, sizeof(ib_gid_t)); - match_rec.proxy_join = (uint8_t) proxy_join; - - mcmr_rcv_new_mcmr(sa, &match_rec, list); - } - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -/********************************************************************** - Handle a query request -**********************************************************************/ -static void mcmr_query_mgrp(IN osm_sa_t * sa, IN osm_madw_t * p_madw) -{ - const ib_sa_mad_t *p_rcvd_mad; - const ib_member_rec_t *p_rcvd_rec; - cl_qlist_t rec_list; - ib_net64_t comp_mask; - osm_physp_t *p_req_physp; - boolean_t trusted_req; - osm_mgrp_t *p_mgrp; - - OSM_LOG_ENTER(sa->p_log); - - p_rcvd_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(p_rcvd_mad); - comp_mask = p_rcvd_mad->comp_mask; - - /* - if sm_key is not zero and does not match we never get here - see main SA receiver - */ - trusted_req = (p_rcvd_mad->sm_key != 0); - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B04: " - "Cannot find requester physical port\n"); - goto Exit; - } - - cl_qlist_init(&rec_list); - - CL_PLOCK_ACQUIRE(sa->p_lock); - - /* simply go over all MCGs and match */ - for (p_mgrp = (osm_mgrp_t *) cl_fmap_head(&sa->p_subn->mgrp_mgid_tbl); - p_mgrp != (osm_mgrp_t *) cl_fmap_end(&sa->p_subn->mgrp_mgid_tbl); - p_mgrp = (osm_mgrp_t *) cl_fmap_next(&p_mgrp->map_item)) - mcmr_by_comp_mask(sa, p_rcvd_rec, comp_mask, p_mgrp, - p_req_physp, trusted_req, &rec_list); - - CL_PLOCK_RELEASE(sa->p_lock); - - /* - p923 - The PortGID, JoinState and ProxyJoin shall be zero, - except in the case of a trusted request. - Note: In the mad controller we check that the SM_Key received on - the mad is valid. Meaning - is either zero or equal to the local - sm_key. - */ - - if (!p_rcvd_mad->sm_key) { - osm_mcmr_item_t *item; - for (item = (osm_mcmr_item_t *) cl_qlist_head(&rec_list); - item != (osm_mcmr_item_t *) cl_qlist_end(&rec_list); - item = - (osm_mcmr_item_t *) cl_qlist_next(&item->list_item)) { - memset(&item->rec.port_gid, 0, sizeof(ib_gid_t)); - ib_member_set_join_state(&item->rec, 0); - item->rec.proxy_join = 0; - } - } - - osm_sa_respond(sa, p_madw, sizeof(ib_member_rec_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -void osm_mcmr_rcv_process(IN void *context, IN void *data) -{ - osm_sa_t *sa = context; - osm_madw_t *p_madw = data; - ib_sa_mad_t *p_sa_mad; - ib_member_rec_t *p_recvd_mcmember_rec; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_recvd_mcmember_rec = - (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - - CL_ASSERT(p_sa_mad->attr_id == IB_MAD_ATTR_MCMEMBER_RECORD); - - switch (p_sa_mad->method) { - case IB_MAD_METHOD_SET: - if (!check_join_comp_mask(p_sa_mad->comp_mask)) { - char gid_str[INET6_ADDRSTRLEN]; - char gid_str2[INET6_ADDRSTRLEN]; - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B18: " - "component mask = 0x%016" PRIx64 ", " - "expected comp mask = 0x%016" PRIx64 ", " - "MGID: %s for PortGID: %s\n", - cl_ntoh64(p_sa_mad->comp_mask), - CL_NTOH64(JOIN_MC_COMP_MASK), - inet_ntop(AF_INET6, - p_recvd_mcmember_rec->mgid.raw, - gid_str, sizeof gid_str), - inet_ntop(AF_INET6, - p_recvd_mcmember_rec->port_gid.raw, - gid_str2, sizeof gid_str2)); - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* - * Join or Create Multicast Group - */ - mcmr_rcv_join_mgrp(sa, p_madw); - break; - case IB_MAD_METHOD_DELETE: - if (!check_join_comp_mask(p_sa_mad->comp_mask)) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B20: " - "component mask = 0x%016" PRIx64 ", " - "expected comp mask = 0x%016" PRIx64 "\n", - cl_ntoh64(p_sa_mad->comp_mask), - CL_NTOH64(JOIN_MC_COMP_MASK)); - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* - * Leave Multicast Group - */ - mcmr_rcv_leave_mgrp(sa, p_madw); - break; - case IB_MAD_METHOD_GET: - case IB_MAD_METHOD_GETTABLE: - /* - * Querying a Multicast Group - */ - mcmr_query_mgrp(sa, p_madw); - break; - default: - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B21: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_sa_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - break; - } - -Exit: - OSM_LOG_EXIT(sa->p_log); - return; -} diff --git a/branches/opensm_3/user/opensm/osm_sa_mft_record.c b/branches/opensm_3/user/opensm/osm_sa_mft_record.c deleted file mode 100644 index a38ee51c..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_mft_record.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_mftr_rcv_t. - * This object represents the MulticastForwardingTable Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_mftr_item { - cl_list_item_t list_item; - ib_mft_record_t rec; -} osm_mftr_item_t; - -typedef struct osm_mftr_search_ctxt { - const ib_mft_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; -} osm_mftr_search_ctxt_t; - -static ib_api_status_t mftr_rcv_new_mftr(IN osm_sa_t * sa, - IN osm_switch_t * p_sw, - IN cl_qlist_t * p_list, - IN ib_net16_t lid, IN uint16_t block, - IN uint8_t position) -{ - osm_mftr_item_t *p_rec_item; - ib_api_status_t status = IB_SUCCESS; - uint16_t position_block_num; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4A02: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New MulticastForwardingTable: sw 0x%016" PRIx64 - "\n\t\t\t\tblock %u position %u lid %u\n", - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node)), - block, position, cl_ntoh16(lid)); - - position_block_num = ((uint16_t) position << 12) | - (block & IB_MCAST_BLOCK_ID_MASK_HO); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = lid; - p_rec_item->rec.position_block_num = cl_hton16(position_block_num); - - /* copy the mft block */ - osm_switch_get_mft_block(p_sw, block, position, p_rec_item->rec.mft); - - cl_qlist_insert_tail(p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void mftr_rcv_by_comp_mask(IN cl_map_item_t * p_map_item, IN void *cxt) -{ - const osm_mftr_search_ctxt_t *p_ctxt = cxt; - osm_switch_t *p_sw = (osm_switch_t *) p_map_item; - const ib_mft_record_t *const p_rcvd_rec = p_ctxt->p_rcvd_rec; - osm_sa_t *sa = p_ctxt->sa; - ib_net64_t const comp_mask = p_ctxt->comp_mask; - const osm_physp_t *const p_req_physp = p_ctxt->p_req_physp; - osm_port_t *p_port; - uint16_t min_lid_ho, max_lid_ho; - uint16_t position_block_num_ho; - uint16_t min_block, max_block, block; - const osm_physp_t *p_physp; - uint8_t min_position, max_position, position; - - /* In switches, the port guid is the node guid. */ - p_port = - osm_get_port_by_guid(sa->p_subn, p_sw->p_node->node_info.port_guid); - if (!p_port) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4A05: " - "Failed to find Port by Node Guid:0x%016" PRIx64 - "\n", cl_ntoh64(p_sw->p_node->node_info.node_guid)); - return; - } - - /* check that the requester physp and the current physp are under - the same partition. */ - p_physp = p_port->p_physp; - if (!p_physp) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4A06: " - "Failed to find default physical Port by Node Guid:0x%016" - PRIx64 "\n", - cl_ntoh64(p_sw->p_node->node_info.node_guid)); - return; - } - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp)) - return; - - /* get the port 0 of the switch */ - osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho); - - /* compare the lids - if required */ - if (comp_mask & IB_MFTR_COMPMASK_LID) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Comparing lid:%u to port lid range: %u .. %u\n", - cl_ntoh16(p_rcvd_rec->lid), min_lid_ho, max_lid_ho); - /* ok we are ready for range check */ - if (min_lid_ho > cl_ntoh16(p_rcvd_rec->lid) || - max_lid_ho < cl_ntoh16(p_rcvd_rec->lid)) - return; - } - - if (!osm_switch_supports_mcast(p_sw)) - return; - - /* Are there any blocks in use ? */ - if (osm_switch_get_mft_max_block_in_use(p_sw) == -1) - return; - - position_block_num_ho = cl_ntoh16(p_rcvd_rec->position_block_num); - - /* now we need to decide which blocks to output */ - if (comp_mask & IB_MFTR_COMPMASK_BLOCK) { - max_block = min_block = - position_block_num_ho & IB_MCAST_BLOCK_ID_MASK_HO; - if (max_block > osm_switch_get_mft_max_block_in_use(p_sw)) - return; - } else { - /* use as many blocks as needed */ - min_block = 0; - max_block = osm_switch_get_mft_max_block_in_use(p_sw); - } - - /* need to decide which positions to output */ - if (comp_mask & IB_MFTR_COMPMASK_POSITION) { - min_position = max_position = - (position_block_num_ho & 0xF000) >> 12; - if (max_position > osm_switch_get_mft_max_position(p_sw)) - return; - } else { - /* use as many positions as needed */ - min_position = 0; - max_position = osm_switch_get_mft_max_position(p_sw); - } - - /* so we can add these one by one ... */ - for (block = min_block; block <= max_block; block++) - for (position = min_position; position <= max_position; - position++) - mftr_rcv_new_mftr(sa, p_sw, p_ctxt->p_list, - osm_port_get_base_lid(p_port), block, - position); -} - -void osm_mftr_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *p_rcvd_mad; - const ib_mft_record_t *p_rcvd_rec; - cl_qlist_t rec_list; - osm_mftr_search_ctxt_t context; - osm_physp_t *p_req_physp; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_rcvd_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = (ib_mft_record_t *) ib_sa_mad_get_payload_ptr(p_rcvd_mad); - - CL_ASSERT(p_rcvd_mad->attr_id == IB_MAD_ATTR_MFT_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (p_rcvd_mad->method != IB_MAD_METHOD_GET && - p_rcvd_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4A08: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_rcvd_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4A07: " - "Cannot find requester physical port\n"); - goto Exit; - } - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = p_rcvd_mad->comp_mask; - context.sa = sa; - context.p_req_physp = p_req_physp; - - cl_plock_acquire(sa->p_lock); - - /* Go over all switches */ - cl_qmap_apply_func(&sa->p_subn->sw_guid_tbl, mftr_rcv_by_comp_mask, - &context); - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_mft_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_multipath_record.c b/branches/opensm_3/user/opensm/osm_sa_multipath_record.c deleted file mode 100644 index 9712bd5c..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_multipath_record.c +++ /dev/null @@ -1,1482 +0,0 @@ -/* - * Copyright (c) 2006-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_mpr_rcv_t. - * This object represents the MultiPath Record Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define OSM_SA_MPR_MAX_NUM_PATH 127 - -typedef struct osm_mpr_item { - cl_list_item_t list_item; - ib_path_rec_t path_rec; - const osm_port_t *p_src_port; - const osm_port_t *p_dest_port; - int hops; -} osm_mpr_item_t; - -typedef struct osm_path_parms { - ib_net16_t pkey; - uint8_t mtu; - uint8_t rate; - uint8_t sl; - uint8_t pkt_life; - boolean_t reversible; - int hops; -} osm_path_parms_t; - -static boolean_t sa_multipath_rec_is_tavor_port(IN const osm_port_t * p_port) -{ - osm_node_t const *p_node; - ib_net32_t vend_id; - - p_node = p_port->p_node; - vend_id = ib_node_info_get_vendor_id(&p_node->node_info); - - return ((p_node->node_info.device_id == CL_HTON16(23108)) && - ((vend_id == CL_HTON32(OSM_VENDOR_ID_MELLANOX)) || - (vend_id == CL_HTON32(OSM_VENDOR_ID_TOPSPIN)) || - (vend_id == CL_HTON32(OSM_VENDOR_ID_SILVERSTORM)) || - (vend_id == CL_HTON32(OSM_VENDOR_ID_VOLTAIRE)))); -} - -static boolean_t -sa_multipath_rec_apply_tavor_mtu_limit(IN const ib_multipath_rec_t * p_mpr, - IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const ib_net64_t comp_mask) -{ - uint8_t required_mtu; - - /* only if at least one of the ports is a Tavor device */ - if (!sa_multipath_rec_is_tavor_port(p_src_port) && - !sa_multipath_rec_is_tavor_port(p_dest_port)) - return FALSE; - - /* - we can apply the patch if either: - 1. No MTU required - 2. Required MTU < - 3. Required MTU = 1K or 512 or 256 - 4. Required MTU > 256 or 512 - */ - required_mtu = ib_multipath_rec_mtu(p_mpr); - if ((comp_mask & IB_MPR_COMPMASK_MTUSELEC) && - (comp_mask & IB_MPR_COMPMASK_MTU)) { - switch (ib_multipath_rec_mtu_sel(p_mpr)) { - case 0: /* must be greater than */ - case 2: /* exact match */ - if (IB_MTU_LEN_1024 < required_mtu) - return FALSE; - break; - - case 1: /* must be less than */ - /* can't be disqualified by this one */ - break; - - case 3: /* largest available */ - /* the ULP intentionally requested */ - /* the largest MTU possible */ - return FALSE; - break; - - default: - /* if we're here, there's a bug in ib_multipath_rec_mtu_sel() */ - CL_ASSERT(FALSE); - break; - } - } - - return TRUE; -} - -static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, - IN const ib_multipath_rec_t * - p_mpr, - IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const uint16_t dest_lid_ho, - IN const ib_net64_t comp_mask, - OUT osm_path_parms_t * p_parms) -{ - const osm_node_t *p_node; - const osm_physp_t *p_physp; - const osm_physp_t *p_src_physp; - const osm_physp_t *p_dest_physp; - const osm_prtn_t *p_prtn = NULL; - const ib_port_info_t *p_pi; - ib_slvl_table_t *p_slvl_tbl; - ib_api_status_t status = IB_SUCCESS; - uint8_t mtu; - uint8_t rate; - uint8_t pkt_life; - uint8_t required_mtu; - uint8_t required_rate; - ib_net16_t required_pkey; - uint8_t required_sl; - uint8_t required_pkt_life; - ib_net16_t dest_lid; - int hops = 0; - int in_port_num = 0; - uint8_t i; - osm_qos_level_t *p_qos_level = NULL; - uint16_t valid_sl_mask = 0xffff; - - OSM_LOG_ENTER(sa->p_log); - - dest_lid = cl_hton16(dest_lid_ho); - - p_dest_physp = p_dest_port->p_physp; - p_physp = p_src_port->p_physp; - p_src_physp = p_physp; - p_pi = &p_physp->port_info; - - mtu = ib_port_info_get_mtu_cap(p_pi); - rate = ib_port_info_compute_rate(p_pi); - - /* - Mellanox Tavor device performance is better using 1K MTU. - If required MTU and MTU selector are such that 1K is OK - and at least one end of the path is Tavor we override the - port MTU with 1K. - */ - if (sa->p_subn->opt.enable_quirks && - sa_multipath_rec_apply_tavor_mtu_limit(p_mpr, p_src_port, - p_dest_port, comp_mask)) - if (mtu > IB_MTU_LEN_1024) { - mtu = IB_MTU_LEN_1024; - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Optimized Path MTU to 1K for Mellanox Tavor device\n"); - } - - /* - Walk the subnet object from source to destination, - tracking the most restrictive rate and mtu values along the way... - - If source port node is a switch, then p_physp should - point to the port that routes the destination lid - */ - - p_node = osm_physp_get_node_ptr(p_physp); - - if (p_node->sw) { - /* - * Source node is a switch. - * Make sure that p_physp points to the out port of the - * switch that routes to the destination lid (dest_lid_ho) - */ - p_physp = osm_switch_get_route_by_lid(p_node->sw, dest_lid); - if (p_physp == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4514: " - "Can't find routing to LID %u from switch for GUID 0x%016" - PRIx64 "\n", dest_lid_ho, - cl_ntoh64(osm_node_get_node_guid(p_node))); - status = IB_NOT_FOUND; - goto Exit; - } - } - - if (sa->p_subn->opt.qos) { - - /* - * Whether this node is switch or CA, the IN port for - * the sl2vl table is 0, because this is a source node. - */ - p_slvl_tbl = osm_physp_get_slvl_tbl(p_physp, 0); - - /* update valid SLs that still exist on this route */ - for (i = 0; i < IB_MAX_NUM_VLS; i++) { - if (valid_sl_mask & (1 << i) && - ib_slvl_table_get(p_slvl_tbl, i) == IB_DROP_VL) - valid_sl_mask &= ~(1 << i); - } - if (!valid_sl_mask) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "All the SLs lead to VL15 on this path\n"); - status = IB_NOT_FOUND; - goto Exit; - } - } - - /* - * Same as above - */ - p_node = osm_physp_get_node_ptr(p_dest_physp); - - if (p_node->sw) { - /* - * if destination is switch, we want p_dest_physp to point to port 0 - */ - p_dest_physp = - osm_switch_get_route_by_lid(p_node->sw, dest_lid); - - if (p_dest_physp == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4515: " - "Can't find routing to LID %u from switch for GUID 0x%016" - PRIx64 "\n", dest_lid_ho, - cl_ntoh64(osm_node_get_node_guid(p_node))); - status = IB_NOT_FOUND; - goto Exit; - } - - } - - /* - * Now go through the path step by step - */ - - while (p_physp != p_dest_physp) { - - p_node = osm_physp_get_node_ptr(p_physp); - p_physp = osm_physp_get_remote(p_physp); - - if (p_physp == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4505: " - "Can't find remote phys port when routing to LID %u from node GUID 0x%016" - PRIx64 "\n", dest_lid_ho, - cl_ntoh64(osm_node_get_node_guid(p_node))); - status = IB_ERROR; - goto Exit; - } - - hops++; - in_port_num = osm_physp_get_port_num(p_physp); - - /* - This is point to point case (no switch in between) - */ - if (p_physp == p_dest_physp) - break; - - p_node = osm_physp_get_node_ptr(p_physp); - - if (!p_node->sw) { - /* - There is some sort of problem in the subnet object! - If this isn't a switch, we should have reached - the destination by now! - */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4503: " - "Internal error, bad path\n"); - status = IB_ERROR; - goto Exit; - } - - /* - Check parameters for the ingress port in this switch. - */ - p_pi = &p_physp->port_info; - - if (mtu > ib_port_info_get_mtu_cap(p_pi)) - mtu = ib_port_info_get_mtu_cap(p_pi); - - if (rate > ib_port_info_compute_rate(p_pi)) - rate = ib_port_info_compute_rate(p_pi); - - /* - Continue with the egress port on this switch. - */ - p_physp = osm_switch_get_route_by_lid(p_node->sw, dest_lid); - if (p_physp == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4516: " - "Dead end on path to LID %u from switch for GUID 0x%016" - PRIx64 "\n", dest_lid_ho, - cl_ntoh64(osm_node_get_node_guid(p_node))); - status = IB_ERROR; - goto Exit; - } - - p_pi = &p_physp->port_info; - - if (mtu > ib_port_info_get_mtu_cap(p_pi)) - mtu = ib_port_info_get_mtu_cap(p_pi); - - if (rate > ib_port_info_compute_rate(p_pi)) - rate = ib_port_info_compute_rate(p_pi); - - if (sa->p_subn->opt.qos) { - /* - * Check SL2VL table of the switch and update valid SLs - */ - p_slvl_tbl = - osm_physp_get_slvl_tbl(p_physp, in_port_num); - for (i = 0; i < IB_MAX_NUM_VLS; i++) { - if (valid_sl_mask & (1 << i) && - ib_slvl_table_get(p_slvl_tbl, - i) == IB_DROP_VL) - valid_sl_mask &= ~(1 << i); - } - if (!valid_sl_mask) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "All the SLs lead to VL15 " - "on this path\n"); - status = IB_NOT_FOUND; - goto Exit; - } - } - } - - /* - p_physp now points to the destination - */ - p_pi = &p_physp->port_info; - - if (mtu > ib_port_info_get_mtu_cap(p_pi)) - mtu = ib_port_info_get_mtu_cap(p_pi); - - if (rate > ib_port_info_compute_rate(p_pi)) - rate = ib_port_info_compute_rate(p_pi); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Path min MTU = %u, min rate = %u\n", mtu, rate); - - /* - * Get QoS Level object according to the MultiPath request - * and adjust MultiPath parameters according to QoS settings - */ - if (sa->p_subn->opt.qos && sa->p_subn->p_qos_policy && - (p_qos_level = - osm_qos_policy_get_qos_level_by_mpr(sa->p_subn->p_qos_policy, - p_mpr, p_src_physp, - p_dest_physp, comp_mask))) { - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "MultiPathRecord request matches QoS Level '%s' (%s)\n", - p_qos_level->name, - p_qos_level->use ? p_qos_level->use : "no description"); - - if (p_qos_level->mtu_limit_set - && (mtu > p_qos_level->mtu_limit)) - mtu = p_qos_level->mtu_limit; - - if (p_qos_level->rate_limit_set - && (rate > p_qos_level->rate_limit)) - rate = p_qos_level->rate_limit; - - if (p_qos_level->sl_set) { - required_sl = p_qos_level->sl; - if (!(valid_sl_mask & (1 << required_sl))) { - status = IB_NOT_FOUND; - goto Exit; - } - } - } - - /* - Determine if these values meet the user criteria - */ - - /* we silently ignore cases where only the MTU selector is defined */ - if ((comp_mask & IB_MPR_COMPMASK_MTUSELEC) && - (comp_mask & IB_MPR_COMPMASK_MTU)) { - required_mtu = ib_multipath_rec_mtu(p_mpr); - switch (ib_multipath_rec_mtu_sel(p_mpr)) { - case 0: /* must be greater than */ - if (mtu <= required_mtu) - status = IB_NOT_FOUND; - break; - - case 1: /* must be less than */ - if (mtu >= required_mtu) { - /* adjust to use the highest mtu - lower then the required one */ - if (required_mtu > 1) - mtu = required_mtu - 1; - else - status = IB_NOT_FOUND; - } - break; - - case 2: /* exact match */ - if (mtu < required_mtu) - status = IB_NOT_FOUND; - else - mtu = required_mtu; - break; - - case 3: /* largest available */ - /* can't be disqualified by this one */ - break; - - default: - /* if we're here, there's a bug in ib_multipath_rec_mtu_sel() */ - CL_ASSERT(FALSE); - status = IB_ERROR; - break; - } - } - if (status != IB_SUCCESS) - goto Exit; - - /* we silently ignore cases where only the Rate selector is defined */ - if ((comp_mask & IB_MPR_COMPMASK_RATESELEC) && - (comp_mask & IB_MPR_COMPMASK_RATE)) { - required_rate = ib_multipath_rec_rate(p_mpr); - switch (ib_multipath_rec_rate_sel(p_mpr)) { - case 0: /* must be greater than */ - if (rate <= required_rate) - status = IB_NOT_FOUND; - break; - - case 1: /* must be less than */ - if (rate >= required_rate) { - /* adjust the rate to use the highest rate - lower then the required one */ - if (required_rate > 2) - rate = required_rate - 1; - else - status = IB_NOT_FOUND; - } - break; - - case 2: /* exact match */ - if (rate < required_rate) - status = IB_NOT_FOUND; - else - rate = required_rate; - break; - - case 3: /* largest available */ - /* can't be disqualified by this one */ - break; - - default: - /* if we're here, there's a bug in ib_multipath_rec_mtu_sel() */ - CL_ASSERT(FALSE); - status = IB_ERROR; - break; - } - } - if (status != IB_SUCCESS) - goto Exit; - - /* Verify the pkt_life_time */ - /* According to spec definition IBA 1.2 Table 205 PacketLifeTime description, - for loopback paths, packetLifeTime shall be zero. */ - if (p_src_port == p_dest_port) - pkt_life = 0; /* loopback */ - else if (p_qos_level && p_qos_level->pkt_life_set) - pkt_life = p_qos_level->pkt_life; - else - pkt_life = sa->p_subn->opt.subnet_timeout; - - /* we silently ignore cases where only the PktLife selector is defined */ - if ((comp_mask & IB_MPR_COMPMASK_PKTLIFETIMESELEC) && - (comp_mask & IB_MPR_COMPMASK_PKTLIFETIME)) { - required_pkt_life = ib_multipath_rec_pkt_life(p_mpr); - switch (ib_multipath_rec_pkt_life_sel(p_mpr)) { - case 0: /* must be greater than */ - if (pkt_life <= required_pkt_life) - status = IB_NOT_FOUND; - break; - - case 1: /* must be less than */ - if (pkt_life >= required_pkt_life) { - /* adjust the lifetime to use the highest possible - lower then the required one */ - if (required_pkt_life > 1) - pkt_life = required_pkt_life - 1; - else - status = IB_NOT_FOUND; - } - break; - - case 2: /* exact match */ - if (pkt_life < required_pkt_life) - status = IB_NOT_FOUND; - else - pkt_life = required_pkt_life; - break; - - case 3: /* smallest available */ - /* can't be disqualified by this one */ - break; - - default: - /* if we're here, there's a bug in ib_path_rec_pkt_life_sel() */ - CL_ASSERT(FALSE); - status = IB_ERROR; - break; - } - } - - if (status != IB_SUCCESS) - goto Exit; - - /* - * set Pkey for this MultiPath record request - */ - - if (comp_mask & IB_MPR_COMPMASK_RAWTRAFFIC && - cl_ntoh32(p_mpr->hop_flow_raw) & (1 << 31)) - required_pkey = - osm_physp_find_common_pkey(p_src_physp, p_dest_physp); - - else if (comp_mask & IB_MPR_COMPMASK_PKEY) { - /* - * MPR request has a specific pkey: - * Check that source and destination share this pkey. - * If QoS level has pkeys, check that this pkey exists - * in the QoS level pkeys. - * MPR returned pkey is the requested pkey. - */ - required_pkey = p_mpr->pkey; - if (!osm_physp_share_this_pkey - (p_src_physp, p_dest_physp, required_pkey)) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4518: " - "Ports do not share specified PKey 0x%04x\n" - "\t\tsrc %" PRIx64 " dst %" PRIx64 "\n", - cl_ntoh16(required_pkey), - cl_ntoh64(osm_physp_get_port_guid(p_src_physp)), - cl_ntoh64(osm_physp_get_port_guid - (p_dest_physp))); - status = IB_NOT_FOUND; - goto Exit; - } - if (p_qos_level && p_qos_level->pkey_range_len && - !osm_qos_level_has_pkey(p_qos_level, required_pkey)) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 451C: " - "Ports do not share PKeys defined by QoS level\n"); - status = IB_NOT_FOUND; - goto Exit; - } - - } else if (p_qos_level && p_qos_level->pkey_range_len) { - /* - * MPR request doesn't have a specific pkey, but QoS level - * has pkeys - get shared pkey from QoS level pkeys - */ - required_pkey = osm_qos_level_get_shared_pkey(p_qos_level, - p_src_physp, - p_dest_physp); - if (!required_pkey) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 451D: " - "Ports do not share PKeys defined by QoS level\n"); - status = IB_NOT_FOUND; - goto Exit; - } - - } else { - /* - * Neither MPR request nor QoS level have pkey. - * Just get any shared pkey. - */ - required_pkey = - osm_physp_find_common_pkey(p_src_physp, p_dest_physp); - if (!required_pkey) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4519: " - "Ports do not have any shared PKeys\n" - "\t\tsrc %" PRIx64 " dst %" PRIx64 "\n", - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - cl_ntoh64(osm_physp_get_port_guid - (p_dest_physp))); - status = IB_NOT_FOUND; - goto Exit; - } - } - - if (required_pkey) { - p_prtn = - (osm_prtn_t *) cl_qmap_get(&sa->p_subn->prtn_pkey_tbl, - required_pkey & - cl_ntoh16((uint16_t) ~ 0x8000)); - if (p_prtn == - (osm_prtn_t *) cl_qmap_end(&sa->p_subn->prtn_pkey_tbl)) - p_prtn = NULL; - } - - /* - * Set MultiPathRecord SL. - */ - - if (comp_mask & IB_MPR_COMPMASK_SL) { - /* - * Specific SL was requested - */ - required_sl = ib_multipath_rec_sl(p_mpr); - - if (p_qos_level && p_qos_level->sl_set && - p_qos_level->sl != required_sl) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 451E: " - "QoS constraints: required MultiPathRecord SL (%u) " - "doesn't match QoS policy SL (%u)\n", - required_sl, p_qos_level->sl); - status = IB_NOT_FOUND; - goto Exit; - } - - } else if (p_qos_level && p_qos_level->sl_set) { - /* - * No specific SL was requested, - * but there is an SL in QoS level. - */ - required_sl = p_qos_level->sl; - - if (required_pkey && p_prtn && p_prtn->sl != p_qos_level->sl) - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "QoS level SL (%u) overrides partition SL (%u)\n", - p_qos_level->sl, p_prtn->sl); - - } else if (required_pkey) { - /* - * No specific SL in request or in QoS level - use partition SL - */ - p_prtn = - (osm_prtn_t *) cl_qmap_get(&sa->p_subn->prtn_pkey_tbl, - required_pkey & - cl_ntoh16((uint16_t) ~ 0x8000)); - if (!p_prtn) { - required_sl = OSM_DEFAULT_SL; - /* this may be possible when pkey tables are created somehow in - previous runs or things are going wrong here */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 451A: " - "No partition found for PKey 0x%04x - using default SL %d\n", - cl_ntoh16(required_pkey), required_sl); - } else - required_sl = p_prtn->sl; - - } else if (sa->p_subn->opt.qos) { - if (valid_sl_mask & (1 << OSM_DEFAULT_SL)) - required_sl = OSM_DEFAULT_SL; - else { - for (i = 0; i < IB_MAX_NUM_VLS; i++) - if (valid_sl_mask & (1 << i)) - break; - required_sl = i; - } - } else - required_sl = OSM_DEFAULT_SL; - - if (sa->p_subn->opt.qos && !(valid_sl_mask & (1 << required_sl))) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 451F: " - "Selected SL (%u) leads to VL15\n", required_sl); - status = IB_NOT_FOUND; - goto Exit; - } - - /* reset pkey when raw traffic */ - if (comp_mask & IB_MPR_COMPMASK_RAWTRAFFIC && - cl_ntoh32(p_mpr->hop_flow_raw) & (1 << 31)) - required_pkey = 0; - - p_parms->mtu = mtu; - p_parms->rate = rate; - p_parms->pkey = required_pkey; - p_parms->pkt_life = pkt_life; - p_parms->sl = required_sl; - p_parms->hops = hops; - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "MultiPath params:" - " mtu = %u, rate = %u, packet lifetime = %u," - " pkey = 0x%04X, sl = %u, hops = %u\n", mtu, rate, - pkt_life, cl_ntoh16(required_pkey), required_sl, hops); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void mpr_rcv_build_pr(IN osm_sa_t * sa, IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN uint16_t src_lid_ho, IN uint16_t dest_lid_ho, - IN uint8_t preference, - IN const osm_path_parms_t * p_parms, - OUT ib_path_rec_t * p_pr) -{ - const osm_physp_t *p_src_physp; - const osm_physp_t *p_dest_physp; - - OSM_LOG_ENTER(sa->p_log); - - p_src_physp = p_src_port->p_physp; - p_dest_physp = p_dest_port->p_physp; - - p_pr->dgid.unicast.prefix = osm_physp_get_subnet_prefix(p_dest_physp); - p_pr->dgid.unicast.interface_id = osm_physp_get_port_guid(p_dest_physp); - - p_pr->sgid.unicast.prefix = osm_physp_get_subnet_prefix(p_src_physp); - p_pr->sgid.unicast.interface_id = osm_physp_get_port_guid(p_src_physp); - - p_pr->dlid = cl_hton16(dest_lid_ho); - p_pr->slid = cl_hton16(src_lid_ho); - - p_pr->hop_flow_raw &= cl_hton32(1 << 31); - - p_pr->pkey = p_parms->pkey; - ib_path_rec_set_qos_class(p_pr, 0); - ib_path_rec_set_sl(p_pr, p_parms->sl); - p_pr->mtu = (uint8_t) (p_parms->mtu | 0x80); - p_pr->rate = (uint8_t) (p_parms->rate | 0x80); - - /* According to 1.2 spec definition Table 205 PacketLifeTime description, - for loopback paths, packetLifeTime shall be zero. */ - if (p_src_port == p_dest_port) - p_pr->pkt_life = 0x80; /* loopback */ - else - p_pr->pkt_life = (uint8_t) (p_parms->pkt_life | 0x80); - - p_pr->preference = preference; - - /* always return num_path = 0 so this is only the reversible component */ - if (p_parms->reversible) - p_pr->num_path = 0x80; - - OSM_LOG_EXIT(sa->p_log); -} - -static osm_mpr_item_t *mpr_rcv_get_lid_pair_path(IN osm_sa_t * sa, - IN const ib_multipath_rec_t * - p_mpr, - IN const osm_port_t * - p_src_port, - IN const osm_port_t * - p_dest_port, - IN const uint16_t src_lid_ho, - IN const uint16_t dest_lid_ho, - IN const ib_net64_t comp_mask, - IN const uint8_t preference) -{ - osm_path_parms_t path_parms; - osm_path_parms_t rev_path_parms; - osm_mpr_item_t *p_pr_item; - ib_api_status_t status, rev_path_status; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Src LID %u, Dest LID %u\n", - src_lid_ho, dest_lid_ho); - - p_pr_item = malloc(sizeof(*p_pr_item)); - if (p_pr_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4501: " - "Unable to allocate path record\n"); - goto Exit; - } - memset(p_pr_item, 0, sizeof(*p_pr_item)); - - status = mpr_rcv_get_path_parms(sa, p_mpr, p_src_port, p_dest_port, - dest_lid_ho, comp_mask, &path_parms); - - if (status != IB_SUCCESS) { - free(p_pr_item); - p_pr_item = NULL; - goto Exit; - } - - /* now try the reversible path */ - rev_path_status = mpr_rcv_get_path_parms(sa, p_mpr, p_dest_port, - p_src_port, src_lid_ho, - comp_mask, &rev_path_parms); - path_parms.reversible = (rev_path_status == IB_SUCCESS); - - /* did we get a Reversible Path compmask ? */ - /* - NOTE that if the reversible component = 0, it is a don't care - rather then requiring non-reversible paths ... - see Vol1 Ver1.2 p900 l16 - */ - if (comp_mask & IB_MPR_COMPMASK_REVERSIBLE) { - if ((!path_parms.reversible && (p_mpr->num_path & 0x80))) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Requested reversible path but failed to get one\n"); - - free(p_pr_item); - p_pr_item = NULL; - goto Exit; - } - } - - p_pr_item->p_src_port = p_src_port; - p_pr_item->p_dest_port = p_dest_port; - p_pr_item->hops = path_parms.hops; - - mpr_rcv_build_pr(sa, p_src_port, p_dest_port, src_lid_ho, dest_lid_ho, - preference, &path_parms, &p_pr_item->path_rec); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return p_pr_item; -} - -static uint32_t mpr_rcv_get_port_pair_paths(IN osm_sa_t * sa, - IN const ib_multipath_rec_t * p_mpr, - IN const osm_port_t * p_req_port, - IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const uint32_t rem_paths, - IN const ib_net64_t comp_mask, - IN cl_qlist_t * p_list) -{ - osm_mpr_item_t *p_pr_item; - uint16_t src_lid_min_ho; - uint16_t src_lid_max_ho; - uint16_t dest_lid_min_ho; - uint16_t dest_lid_max_ho; - uint16_t src_lid_ho; - uint16_t dest_lid_ho; - uint32_t path_num = 0; - uint8_t preference; - unsigned src_offset, dest_offset; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Src port 0x%016" PRIx64 ", Dst port 0x%016" PRIx64 "\n", - cl_ntoh64(osm_port_get_guid(p_src_port)), - cl_ntoh64(osm_port_get_guid(p_dest_port))); - - /* Check that the req_port, src_port and dest_port all share a - pkey. The check is done on the default physical port of the ports. */ - if (osm_port_share_pkey(sa->p_log, p_req_port, p_src_port) == FALSE - || osm_port_share_pkey(sa->p_log, p_req_port, - p_dest_port) == FALSE - || osm_port_share_pkey(sa->p_log, p_src_port, p_dest_port) == FALSE) - /* One of the pairs doesn't share a pkey so the path is disqualified. */ - goto Exit; - - /* - We shouldn't be here if the paths are disqualified in some way... - Thus, we assume every possible connection is valid. - - We desire to return high-quality paths first. - In OpenSM, higher quality mean least overlap with other paths. - This is acheived in practice by returning paths with - different LID value on each end, which means these - paths are more redundant that paths with the same LID repeated - on one side. For example, in OpenSM the paths between two - endpoints with LMC = 1 might be as follows: - - Port A, LID 1 <-> Port B, LID 3 - Port A, LID 1 <-> Port B, LID 4 - Port A, LID 2 <-> Port B, LID 3 - Port A, LID 2 <-> Port B, LID 4 - - The OpenSM unicast routing algorithms attempt to disperse each path - to as varied a physical path as is reasonable. 1<->3 and 1<->4 have - more physical overlap (hence less redundancy) than 1<->3 and 2<->4. - - OpenSM ranks paths in three preference groups: - - Preference Value Description - ---------------- ------------------------------------------- - 0 Redundant in both directions with other - pref value = 0 paths - - 1 Redundant in one direction with other - pref value = 0 and pref value = 1 paths - - 2 Not redundant in either direction with - other paths - - 3-FF Unused - - SA clients don't need to know these details, only that the lower - preference paths are preferred, as stated in the spec. The paths - may not actually be physically redundant depending on the topology - of the subnet, but the point of LMC > 0 is to offer redundancy, - so I assume the subnet is physically appropriate for the specified - LMC value. A more advanced implementation could inspect for physical - redundancy, but I'm not going to bother with that now. - */ - - osm_port_get_lid_range_ho(p_src_port, &src_lid_min_ho, &src_lid_max_ho); - osm_port_get_lid_range_ho(p_dest_port, &dest_lid_min_ho, - &dest_lid_max_ho); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Src LID [%u-%u], Dest LID [%u-%u]\n", - src_lid_min_ho, src_lid_max_ho, - dest_lid_min_ho, dest_lid_max_ho); - - src_lid_ho = src_lid_min_ho; - dest_lid_ho = dest_lid_min_ho; - - /* - Preferred paths come first in OpenSM - */ - preference = 0; - - while (path_num < rem_paths) { - /* - These paths are "fully redundant" - */ - p_pr_item = mpr_rcv_get_lid_pair_path(sa, p_mpr, p_src_port, - p_dest_port, src_lid_ho, - dest_lid_ho, comp_mask, - preference); - - if (p_pr_item) { - cl_qlist_insert_tail(p_list, &p_pr_item->list_item); - ++path_num; - } - - if (++src_lid_ho > src_lid_max_ho) - break; - - if (++dest_lid_ho > dest_lid_max_ho) - break; - } - - /* - Check if we've accumulated all the paths that the user cares to see - */ - if (path_num == rem_paths) - goto Exit; - - /* - Don't bother reporting preference 1 paths for now. - It's more trouble than it's worth and can only occur - if ports have different LMC values, which isn't supported - by OpenSM right now anyway. - */ - preference = 2; - src_lid_ho = src_lid_min_ho; - dest_lid_ho = dest_lid_min_ho; - src_offset = 0; - dest_offset = 0; - - /* - Iterate over the remaining paths - */ - while (path_num < rem_paths) { - dest_offset++; - dest_lid_ho++; - - if (dest_lid_ho > dest_lid_max_ho) { - src_offset++; - src_lid_ho++; - - if (src_lid_ho > src_lid_max_ho) - break; /* done */ - - dest_offset = 0; - dest_lid_ho = dest_lid_min_ho; - } - - /* - These paths are "fully non-redundant" with paths already - identified above and consequently not of much value. - - Don't return paths we already identified above, as indicated - by the offset values being equal. - */ - if (src_offset == dest_offset) - continue; /* already reported */ - - p_pr_item = mpr_rcv_get_lid_pair_path(sa, p_mpr, p_src_port, - p_dest_port, src_lid_ho, - dest_lid_ho, comp_mask, - preference); - - if (p_pr_item) { - cl_qlist_insert_tail(p_list, &p_pr_item->list_item); - ++path_num; - } - } - -Exit: - OSM_LOG_EXIT(sa->p_log); - return path_num; -} - -#undef min -#define min(x,y) (((x) < (y)) ? (x) : (y)) - -static osm_mpr_item_t *mpr_rcv_get_apm_port_pair_paths(IN osm_sa_t * sa, - IN const - ib_multipath_rec_t * - p_mpr, - IN const osm_port_t * - p_src_port, - IN const osm_port_t * - p_dest_port, - IN int base_offs, - IN const ib_net64_t - comp_mask, - IN cl_qlist_t * p_list) -{ - osm_mpr_item_t *p_pr_item = 0; - uint16_t src_lid_min_ho; - uint16_t src_lid_max_ho; - uint16_t dest_lid_min_ho; - uint16_t dest_lid_max_ho; - uint16_t src_lid_ho; - uint16_t dest_lid_ho; - unsigned iterations; - int src_lids, dest_lids; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Src port 0x%016" PRIx64 ", " - "Dst port 0x%016" PRIx64 ", base offs %d\n", - cl_ntoh64(osm_port_get_guid(p_src_port)), - cl_ntoh64(osm_port_get_guid(p_dest_port)), base_offs); - - osm_port_get_lid_range_ho(p_src_port, &src_lid_min_ho, &src_lid_max_ho); - osm_port_get_lid_range_ho(p_dest_port, &dest_lid_min_ho, - &dest_lid_max_ho); - - src_lid_ho = src_lid_min_ho; - dest_lid_ho = dest_lid_min_ho; - - src_lids = src_lid_max_ho - src_lid_min_ho + 1; - dest_lids = dest_lid_max_ho - dest_lid_min_ho + 1; - - src_lid_ho += base_offs % src_lids; - dest_lid_ho += base_offs % dest_lids; - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Src LIDs [%u-%u] hashed %u, " - "Dest LIDs [%u-%u] hashed %u\n", - src_lid_min_ho, src_lid_max_ho, src_lid_ho, - dest_lid_min_ho, dest_lid_max_ho, dest_lid_ho); - - iterations = min(src_lids, dest_lids); - - while (iterations--) { - /* - These paths are "fully redundant" - */ - p_pr_item = mpr_rcv_get_lid_pair_path(sa, p_mpr, p_src_port, - p_dest_port, src_lid_ho, - dest_lid_ho, comp_mask, - 0); - - if (p_pr_item) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Found matching path from Src LID %u to Dest LID %u with %d hops\n", - src_lid_ho, dest_lid_ho, p_pr_item->hops); - break; - } - - if (++src_lid_ho > src_lid_max_ho) - src_lid_ho = src_lid_min_ho; - - if (++dest_lid_ho > dest_lid_max_ho) - dest_lid_ho = dest_lid_min_ho; - } - - OSM_LOG_EXIT(sa->p_log); - return p_pr_item; -} - -static ib_net16_t mpr_rcv_get_gids(IN osm_sa_t * sa, IN const ib_gid_t * gids, - IN int ngids, IN int is_sgid, - OUT osm_port_t ** pp_port) -{ - osm_port_t *p_port; - ib_net16_t ib_status = IB_SUCCESS; - int i; - - OSM_LOG_ENTER(sa->p_log); - - for (i = 0; i < ngids; i++, gids++) { - if (!ib_gid_is_link_local(gids)) { - if ((is_sgid && ib_gid_is_multicast(gids)) || - (ib_gid_get_subnet_prefix(gids) != - sa->p_subn->opt.subnet_prefix)) { - /* - This 'error' is the client's fault (bad gid) - so don't enter it as an error in our own log. - Return an error response to the client. - */ - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, "ERR 451B: " - "%sGID 0x%016" PRIx64 - " is multicast or non local subnet prefix\n", - is_sgid ? "S" : "D", - cl_ntoh64(gids->unicast.prefix)); - - ib_status = IB_SA_MAD_STATUS_INVALID_GID; - goto Exit; - } - } - - p_port = - osm_get_port_by_guid(sa->p_subn, - gids->unicast.interface_id); - if (!p_port) { - /* - This 'error' is the client's fault (bad gid) so - don't enter it as an error in our own log. - Return an error response to the client. - */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4506: " - "No port with GUID 0x%016" PRIx64 "\n", - cl_ntoh64(gids->unicast.interface_id)); - - ib_status = IB_SA_MAD_STATUS_INVALID_GID; - goto Exit; - } - - pp_port[i] = p_port; - } - -Exit: - OSM_LOG_EXIT(sa->p_log); - - return ib_status; -} - -static ib_net16_t mpr_rcv_get_end_points(IN osm_sa_t * sa, - IN const osm_madw_t * p_madw, - OUT osm_port_t ** pp_ports, - OUT int *nsrc, OUT int *ndest) -{ - const ib_multipath_rec_t *p_mpr; - const ib_sa_mad_t *p_sa_mad; - ib_net64_t comp_mask; - ib_net16_t sa_status = IB_SA_MAD_STATUS_SUCCESS; - ib_gid_t *gids; - - OSM_LOG_ENTER(sa->p_log); - - /* - Determine what fields are valid and then get a pointer - to the source and destination port objects, if possible. - */ - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_mpr = (ib_multipath_rec_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - gids = (ib_gid_t *) p_mpr->gids; - - comp_mask = p_sa_mad->comp_mask; - - /* - Check a few easy disqualifying cases up front before getting - into the endpoints. - */ - *nsrc = *ndest = 0; - - if (comp_mask & IB_MPR_COMPMASK_SGIDCOUNT) { - *nsrc = p_mpr->sgid_count; - if (*nsrc > IB_MULTIPATH_MAX_GIDS) - *nsrc = IB_MULTIPATH_MAX_GIDS; - sa_status = mpr_rcv_get_gids(sa, gids, *nsrc, 1, pp_ports); - if (sa_status != IB_SUCCESS) - goto Exit; - } - - if (comp_mask & IB_MPR_COMPMASK_DGIDCOUNT) { - *ndest = p_mpr->dgid_count; - if (*ndest + *nsrc > IB_MULTIPATH_MAX_GIDS) - *ndest = IB_MULTIPATH_MAX_GIDS - *nsrc; - sa_status = - mpr_rcv_get_gids(sa, gids + *nsrc, *ndest, 0, - pp_ports + *nsrc); - } - -Exit: - OSM_LOG_EXIT(sa->p_log); - return sa_status; -} - -#define hash_lids(a, b, lmc) \ - (((((a) >> (lmc)) << 4) | ((b) >> (lmc))) % 103) - -static void mpr_rcv_get_apm_paths(IN osm_sa_t * sa, - IN const ib_multipath_rec_t * p_mpr, - IN const osm_port_t * p_req_port, - IN osm_port_t ** _pp_ports, - IN const ib_net64_t comp_mask, - IN cl_qlist_t * p_list) -{ - osm_port_t *pp_ports[4]; - osm_mpr_item_t *matrix[2][2]; - int base_offs, src_lid_ho, dest_lid_ho; - int sumA, sumB, minA, minB; - - OSM_LOG_ENTER(sa->p_log); - - /* - * We want to: - * 1. use different lid offsets (from base) for the resultant paths - * to increase the probability of redundant paths or in case - * of Clos - to ensure it (different offset => different spine!) - * 2. keep consistent paths no matter of direction and order of ports - * 3. distibute the lid offsets to balance the load - * So, we sort the ports (within the srcs, and within the dests), - * hash the lids of S0, D0 (after the sort), and call mpr_rcv_get_apm_port_pair_paths - * with base_lid for S0, D0 and base_lid + 1 for S1, D1. This way we will get - * always the same offsets - order independent, and make sure different spines are used. - * Note that the diagonals on a Clos have the same number of hops, so it doesn't - * really matter which diagonal we use. - */ - if (_pp_ports[0]->guid < _pp_ports[1]->guid) { - pp_ports[0] = _pp_ports[0]; - pp_ports[1] = _pp_ports[1]; - } else { - pp_ports[0] = _pp_ports[1]; - pp_ports[1] = _pp_ports[0]; - } - if (_pp_ports[2]->guid < _pp_ports[3]->guid) { - pp_ports[2] = _pp_ports[2]; - pp_ports[3] = _pp_ports[3]; - } else { - pp_ports[2] = _pp_ports[3]; - pp_ports[3] = _pp_ports[2]; - } - - src_lid_ho = osm_port_get_base_lid(pp_ports[0]); - dest_lid_ho = osm_port_get_base_lid(pp_ports[2]); - - base_offs = src_lid_ho < dest_lid_ho ? - hash_lids(src_lid_ho, dest_lid_ho, sa->p_subn->opt.lmc) : - hash_lids(dest_lid_ho, src_lid_ho, sa->p_subn->opt.lmc); - - matrix[0][0] = - mpr_rcv_get_apm_port_pair_paths(sa, p_mpr, pp_ports[0], pp_ports[2], - base_offs, comp_mask, p_list); - matrix[0][1] = - mpr_rcv_get_apm_port_pair_paths(sa, p_mpr, pp_ports[0], pp_ports[3], - base_offs, comp_mask, p_list); - matrix[1][0] = - mpr_rcv_get_apm_port_pair_paths(sa, p_mpr, pp_ports[1], pp_ports[2], - base_offs + 1, comp_mask, p_list); - matrix[1][1] = - mpr_rcv_get_apm_port_pair_paths(sa, p_mpr, pp_ports[1], pp_ports[3], - base_offs + 1, comp_mask, p_list); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "APM matrix:\n" - "\t{0,0} 0x%X->0x%X (%d)\t| {0,1} 0x%X->0x%X (%d)\n" - "\t{1,0} 0x%X->0x%X (%d)\t| {1,1} 0x%X->0x%X (%d)\n", - matrix[0][0]->path_rec.slid, matrix[0][0]->path_rec.dlid, - matrix[0][0]->hops, matrix[0][1]->path_rec.slid, - matrix[0][1]->path_rec.dlid, matrix[0][1]->hops, - matrix[1][0]->path_rec.slid, matrix[1][0]->path_rec.dlid, - matrix[1][0]->hops, matrix[1][1]->path_rec.slid, - matrix[1][1]->path_rec.dlid, matrix[1][1]->hops); - - /* check diagonal A {(0,0), (1,1)} */ - sumA = matrix[0][0]->hops + matrix[1][1]->hops; - minA = min(matrix[0][0]->hops, matrix[1][1]->hops); - - /* check diagonal B {(0,1), (1,0)} */ - sumB = matrix[0][1]->hops + matrix[1][0]->hops; - minB = min(matrix[0][1]->hops, matrix[1][0]->hops); - - /* and the winner is... */ - if (minA <= minB || (minA == minB && sumA < sumB)) { - /* Diag A */ - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Diag {0,0} & {1,1} is the best:\n" - "\t{0,0} 0x%X->0x%X (%d)\t & {1,1} 0x%X->0x%X (%d)\n", - matrix[0][0]->path_rec.slid, - matrix[0][0]->path_rec.dlid, matrix[0][0]->hops, - matrix[1][1]->path_rec.slid, - matrix[1][1]->path_rec.dlid, matrix[1][1]->hops); - cl_qlist_insert_tail(p_list, &matrix[0][0]->list_item); - cl_qlist_insert_tail(p_list, &matrix[1][1]->list_item); - free(matrix[0][1]); - free(matrix[1][0]); - } else { - /* Diag B */ - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Diag {0,1} & {1,0} is the best:\n" - "\t{0,1} 0x%X->0x%X (%d)\t & {1,0} 0x%X->0x%X (%d)\n", - matrix[0][1]->path_rec.slid, - matrix[0][1]->path_rec.dlid, matrix[0][1]->hops, - matrix[1][0]->path_rec.slid, - matrix[1][0]->path_rec.dlid, matrix[1][0]->hops); - cl_qlist_insert_tail(p_list, &matrix[0][1]->list_item); - cl_qlist_insert_tail(p_list, &matrix[1][0]->list_item); - free(matrix[0][0]); - free(matrix[1][1]); - } - - OSM_LOG_EXIT(sa->p_log); -} - -static void mpr_rcv_process_pairs(IN osm_sa_t * sa, - IN const ib_multipath_rec_t * p_mpr, - IN osm_port_t * p_req_port, - IN osm_port_t ** pp_ports, IN const int nsrc, - IN int ndest, IN ib_net64_t comp_mask, - IN cl_qlist_t * p_list) -{ - osm_port_t **pp_src_port, **pp_es; - osm_port_t **pp_dest_port, **pp_ed; - uint32_t max_paths, num_paths, total_paths = 0; - - OSM_LOG_ENTER(sa->p_log); - - if (comp_mask & IB_MPR_COMPMASK_NUMBPATH) - max_paths = p_mpr->num_path & 0x7F; - else - max_paths = OSM_SA_MPR_MAX_NUM_PATH; - - for (pp_src_port = pp_ports, pp_es = pp_ports + nsrc; - pp_src_port < pp_es; pp_src_port++) { - for (pp_dest_port = pp_es, pp_ed = pp_es + ndest; - pp_dest_port < pp_ed; pp_dest_port++) { - num_paths = - mpr_rcv_get_port_pair_paths(sa, p_mpr, p_req_port, - *pp_src_port, - *pp_dest_port, - max_paths - total_paths, - comp_mask, p_list); - total_paths += num_paths; - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "%d paths %d total paths %d max paths\n", - num_paths, total_paths, max_paths); - /* Just take first NumbPaths found */ - if (total_paths >= max_paths) - goto Exit; - } - } - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -void osm_mpr_rcv_process(IN void *context, IN void *data) -{ - osm_sa_t *sa = context; - osm_madw_t *p_madw = data; - const ib_multipath_rec_t *p_mpr; - ib_sa_mad_t *p_sa_mad; - osm_port_t *requester_port; - osm_port_t *pp_ports[IB_MULTIPATH_MAX_GIDS]; - cl_qlist_t pr_list; - ib_net16_t sa_status; - int nsrc, ndest; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_mpr = (ib_multipath_rec_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - - CL_ASSERT(p_sa_mad->attr_id == IB_MAD_ATTR_MULTIPATH_RECORD); - - if ((p_sa_mad->rmpp_flags & IB_RMPP_FLAG_ACTIVE) != IB_RMPP_FLAG_ACTIVE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4510: " - "Invalid request since RMPP_FLAG_ACTIVE is not set\n"); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* we only support SubnAdmGetMulti method */ - if (p_sa_mad->method != IB_MAD_METHOD_GETMULTI) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4513: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_sa_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - requester_port = osm_get_port_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (requester_port == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4517: " - "Cannot find requester physical port\n"); - goto Exit; - } - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_multipath_record(sa->p_log, p_mpr, OSM_LOG_DEBUG); - - cl_qlist_init(&pr_list); - - /* - Most SA functions (including this one) are read-only on the - subnet object, so we grab the lock non-exclusively. - */ - cl_plock_acquire(sa->p_lock); - - sa_status = mpr_rcv_get_end_points(sa, p_madw, pp_ports, &nsrc, &ndest); - - if (sa_status != IB_SA_MAD_STATUS_SUCCESS || !nsrc || !ndest) { - if (sa_status == IB_SA_MAD_STATUS_SUCCESS && (!nsrc || !ndest)) - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4512: " - "mpr_rcv_get_end_points failed, not enough GIDs " - "(nsrc %d ndest %d)\n", nsrc, ndest); - cl_plock_release(sa->p_lock); - if (sa_status == IB_SA_MAD_STATUS_SUCCESS) - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_REQ_INVALID); - else - osm_sa_send_error(sa, p_madw, sa_status); - goto Exit; - } - - /* APM request */ - if (nsrc == 2 && ndest == 2 && (p_mpr->num_path & 0x7F) == 2) - mpr_rcv_get_apm_paths(sa, p_mpr, requester_port, pp_ports, - p_sa_mad->comp_mask, &pr_list); - else - mpr_rcv_process_pairs(sa, p_mpr, requester_port, pp_ports, - nsrc, ndest, p_sa_mad->comp_mask, - &pr_list); - - cl_plock_release(sa->p_lock); - - /* o15-0.2.7: If MultiPath is supported, then SA shall respond to a - SubnAdmGetMulti() containing a valid MultiPathRecord attribute with - a set of zero or more PathRecords satisfying the constraints - indicated in the MultiPathRecord received. The PathRecord Attribute - ID shall be used in the response. - */ - p_sa_mad->attr_id = IB_MAD_ATTR_PATH_RECORD; - osm_sa_respond(sa, p_madw, sizeof(ib_path_rec_t), &pr_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} -#endif diff --git a/branches/opensm_3/user/opensm/osm_sa_node_record.c b/branches/opensm_3/user/opensm/osm_sa_node_record.c deleted file mode 100644 index 8a2f83a4..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_node_record.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_nr_rcv_t. - * This object represents the NodeInfo Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_nr_item { - cl_list_item_t list_item; - ib_node_record_t rec; -} osm_nr_item_t; - -typedef struct osm_nr_search_ctxt { - const ib_node_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; -} osm_nr_search_ctxt_t; - -static ib_api_status_t nr_rcv_new_nr(osm_sa_t * sa, - IN const osm_node_t * p_node, - IN cl_qlist_t * p_list, - IN ib_net64_t port_guid, IN ib_net16_t lid) -{ - osm_nr_item_t *p_rec_item; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1D02: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New NodeRecord: node 0x%016" PRIx64 - "\n\t\t\t\tport 0x%016" PRIx64 ", lid %u\n", - cl_ntoh64(osm_node_get_node_guid(p_node)), - cl_ntoh64(port_guid), cl_ntoh16(lid)); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = lid; - - p_rec_item->rec.node_info = p_node->node_info; - p_rec_item->rec.node_info.port_guid = port_guid; - memcpy(&(p_rec_item->rec.node_desc), &(p_node->node_desc), - IB_NODE_DESCRIPTION_SIZE); - cl_qlist_insert_tail(p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void nr_rcv_create_nr(IN osm_sa_t * sa, IN osm_node_t * p_node, - IN cl_qlist_t * p_list, - IN ib_net64_t const match_port_guid, - IN ib_net16_t const match_lid, - IN const osm_physp_t * p_req_physp, - IN const ib_net64_t comp_mask) -{ - const osm_physp_t *p_physp; - uint8_t port_num; - uint8_t num_ports; - uint16_t match_lid_ho; - ib_net16_t base_lid; - ib_net16_t base_lid_ho; - ib_net16_t max_lid_ho; - uint8_t lmc; - ib_net64_t port_guid; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Looking for NodeRecord with LID: %u GUID:0x%016" - PRIx64 "\n", cl_ntoh16(match_lid), cl_ntoh64(match_port_guid)); - - /* - For switches, do not return the NodeInfo record - for each port on the switch, just for port 0. - */ - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH) - num_ports = 1; - else - num_ports = osm_node_get_num_physp(p_node); - - for (port_num = 0; port_num < num_ports; port_num++) { - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_physp) - continue; - - /* Check to see if the found p_physp and the requester physp - share a pkey. If not - continue */ - if (!osm_physp_share_pkey(sa->p_log, p_physp, p_req_physp)) - continue; - - port_guid = osm_physp_get_port_guid(p_physp); - - if ((comp_mask & IB_NR_COMPMASK_PORTGUID) - && (port_guid != match_port_guid)) - continue; - - base_lid = osm_physp_get_base_lid(p_physp); - base_lid_ho = cl_ntoh16(base_lid); - lmc = osm_physp_get_lmc(p_physp); - max_lid_ho = (uint16_t) (base_lid_ho + (1 << lmc) - 1); - match_lid_ho = cl_ntoh16(match_lid); - - if (comp_mask & IB_NR_COMPMASK_LID) { - /* - We validate that the lid belongs to this node. - */ - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Comparing LID: %u <= %u <= %u\n", - base_lid_ho, match_lid_ho, max_lid_ho); - - if (match_lid_ho < base_lid_ho - || match_lid_ho > max_lid_ho) - continue; - } - - nr_rcv_new_nr(sa, p_node, p_list, port_guid, base_lid); - } - - OSM_LOG_EXIT(sa->p_log); -} - -static void nr_rcv_by_comp_mask(IN cl_map_item_t * p_map_item, IN void *context) -{ - const osm_nr_search_ctxt_t *p_ctxt = context; - osm_node_t *p_node = (osm_node_t *) p_map_item; - const ib_node_record_t *const p_rcvd_rec = p_ctxt->p_rcvd_rec; - const osm_physp_t *const p_req_physp = p_ctxt->p_req_physp; - osm_sa_t *sa = p_ctxt->sa; - ib_net64_t comp_mask = p_ctxt->comp_mask; - ib_net64_t match_port_guid = 0; - ib_net16_t match_lid = 0; - - OSM_LOG_ENTER(p_ctxt->sa->p_log); - - osm_dump_node_info(p_ctxt->sa->p_log, &p_node->node_info, - OSM_LOG_DEBUG); - - if (comp_mask & IB_NR_COMPMASK_LID) - match_lid = p_rcvd_rec->lid; - - if (comp_mask & IB_NR_COMPMASK_NODEGUID) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Looking for node 0x%016" PRIx64 - ", found 0x%016" PRIx64 "\n", - cl_ntoh64(p_rcvd_rec->node_info.node_guid), - cl_ntoh64(osm_node_get_node_guid(p_node))); - - if (p_node->node_info.node_guid != - p_rcvd_rec->node_info.node_guid) - goto Exit; - } - - if (comp_mask & IB_NR_COMPMASK_PORTGUID) - match_port_guid = p_rcvd_rec->node_info.port_guid; - - if ((comp_mask & IB_NR_COMPMASK_SYSIMAGEGUID) && - p_node->node_info.sys_guid != p_rcvd_rec->node_info.sys_guid) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_BASEVERSION) && - p_node->node_info.base_version != - p_rcvd_rec->node_info.base_version) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_CLASSVERSION) && - p_node->node_info.class_version != - p_rcvd_rec->node_info.class_version) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_NODETYPE) && - p_node->node_info.node_type != p_rcvd_rec->node_info.node_type) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_NUMPORTS) && - p_node->node_info.num_ports != p_rcvd_rec->node_info.num_ports) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_PARTCAP) && - p_node->node_info.partition_cap != - p_rcvd_rec->node_info.partition_cap) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_DEVID) && - p_node->node_info.device_id != p_rcvd_rec->node_info.device_id) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_REV) && - p_node->node_info.revision != - p_rcvd_rec->node_info.revision) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_PORTNUM) && - ib_node_info_get_local_port_num(&p_node->node_info) != - ib_node_info_get_local_port_num(&p_rcvd_rec->node_info)) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_VENDID) && - ib_node_info_get_vendor_id(&p_node->node_info) != - ib_node_info_get_vendor_id(&p_rcvd_rec->node_info)) - goto Exit; - - if ((comp_mask & IB_NR_COMPMASK_NODEDESC) && - strncmp((char *)&p_node->node_desc, (char *)&p_rcvd_rec->node_desc, - sizeof(ib_node_desc_t))) - goto Exit; - - nr_rcv_create_nr(sa, p_node, p_ctxt->p_list, match_port_guid, - match_lid, p_req_physp, comp_mask); - -Exit: - OSM_LOG_EXIT(p_ctxt->sa->p_log); -} - -void osm_nr_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *p_rcvd_mad; - const ib_node_record_t *p_rcvd_rec; - cl_qlist_t rec_list; - osm_nr_search_ctxt_t context; - osm_physp_t *p_req_physp; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_rcvd_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = (ib_node_record_t *) ib_sa_mad_get_payload_ptr(p_rcvd_mad); - - CL_ASSERT(p_rcvd_mad->attr_id == IB_MAD_ATTR_NODE_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (p_rcvd_mad->method != IB_MAD_METHOD_GET && - p_rcvd_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1D05: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_rcvd_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1D04: " - "Cannot find requester physical port\n"); - goto Exit; - } - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_node_record(sa->p_log, p_rcvd_rec, OSM_LOG_DEBUG); - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = p_rcvd_mad->comp_mask; - context.sa = sa; - context.p_req_physp = p_req_physp; - - cl_plock_acquire(sa->p_lock); - - cl_qmap_apply_func(&sa->p_subn->node_guid_tbl, nr_rcv_by_comp_mask, - &context); - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_node_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_path_record.c b/branches/opensm_3/user/opensm/osm_sa_path_record.c deleted file mode 100644 index 203a191c..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_path_record.c +++ /dev/null @@ -1,1611 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * Copyright (c) 2010 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_pr_rcv_t. - * This object represents the PathRecord Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_HOPS 64 - -typedef struct osm_pr_item { - cl_list_item_t list_item; - ib_path_rec_t path_rec; -} osm_pr_item_t; - -typedef struct osm_path_parms { - ib_net16_t pkey; - uint8_t mtu; - uint8_t rate; - uint8_t sl; - uint8_t pkt_life; - boolean_t reversible; -} osm_path_parms_t; - -static inline boolean_t sa_path_rec_is_tavor_port(IN const osm_port_t * p_port) -{ - osm_node_t const *p_node; - ib_net32_t vend_id; - - p_node = p_port->p_node; - vend_id = ib_node_info_get_vendor_id(&p_node->node_info); - - return ((p_node->node_info.device_id == CL_HTON16(23108)) && - ((vend_id == CL_HTON32(OSM_VENDOR_ID_MELLANOX)) || - (vend_id == CL_HTON32(OSM_VENDOR_ID_TOPSPIN)) || - (vend_id == CL_HTON32(OSM_VENDOR_ID_SILVERSTORM)) || - (vend_id == CL_HTON32(OSM_VENDOR_ID_VOLTAIRE)))); -} - -static boolean_t -sa_path_rec_apply_tavor_mtu_limit(IN const ib_path_rec_t * p_pr, - IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const ib_net64_t comp_mask) -{ - uint8_t required_mtu; - - /* only if at least one of the ports is a Tavor device */ - if (!sa_path_rec_is_tavor_port(p_src_port) && - !sa_path_rec_is_tavor_port(p_dest_port)) - return FALSE; - - /* - we can apply the patch if either: - 1. No MTU required - 2. Required MTU < - 3. Required MTU = 1K or 512 or 256 - 4. Required MTU > 256 or 512 - */ - required_mtu = ib_path_rec_mtu(p_pr); - if ((comp_mask & IB_PR_COMPMASK_MTUSELEC) && - (comp_mask & IB_PR_COMPMASK_MTU)) { - switch (ib_path_rec_mtu_sel(p_pr)) { - case 0: /* must be greater than */ - case 2: /* exact match */ - if (IB_MTU_LEN_1024 < required_mtu) - return FALSE; - break; - - case 1: /* must be less than */ - /* can't be disqualified by this one */ - break; - - case 3: /* largest available */ - /* the ULP intentionally requested */ - /* the largest MTU possible */ - return FALSE; - - default: - /* if we're here, there's a bug in ib_path_rec_mtu_sel() */ - CL_ASSERT(FALSE); - break; - } - } - - return TRUE; -} - -static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, - IN const ib_path_rec_t * p_pr, - IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const uint16_t dest_lid_ho, - IN const ib_net64_t comp_mask, - OUT osm_path_parms_t * p_parms) -{ - const osm_node_t *p_node; - const osm_physp_t *p_physp; - const osm_physp_t *p_src_physp; - const osm_physp_t *p_dest_physp; - const osm_prtn_t *p_prtn = NULL; - osm_opensm_t *p_osm; - const ib_port_info_t *p_pi; - ib_api_status_t status = IB_SUCCESS; - ib_net16_t pkey; - uint8_t mtu; - uint8_t rate; - uint8_t pkt_life; - uint8_t required_mtu; - uint8_t required_rate; - uint8_t required_pkt_life; - uint8_t sl; - uint8_t in_port_num; - ib_net16_t dest_lid; - uint8_t i; - ib_slvl_table_t *p_slvl_tbl = NULL; - osm_qos_level_t *p_qos_level = NULL; - uint16_t valid_sl_mask = 0xffff; - int is_lash; - int hops = 0; - - OSM_LOG_ENTER(sa->p_log); - - dest_lid = cl_hton16(dest_lid_ho); - - p_dest_physp = p_dest_port->p_physp; - p_physp = p_src_port->p_physp; - p_src_physp = p_physp; - p_pi = &p_physp->port_info; - p_osm = sa->p_subn->p_osm; - - mtu = ib_port_info_get_mtu_cap(p_pi); - rate = ib_port_info_compute_rate(p_pi); - - /* - Mellanox Tavor device performance is better using 1K MTU. - If required MTU and MTU selector are such that 1K is OK - and at least one end of the path is Tavor we override the - port MTU with 1K. - */ - if (sa->p_subn->opt.enable_quirks && - sa_path_rec_apply_tavor_mtu_limit(p_pr, p_src_port, p_dest_port, - comp_mask)) - if (mtu > IB_MTU_LEN_1024) { - mtu = IB_MTU_LEN_1024; - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Optimized Path MTU to 1K for Mellanox Tavor device\n"); - } - - /* - Walk the subnet object from source to destination, - tracking the most restrictive rate and mtu values along the way... - - If source port node is a switch, then p_physp should - point to the port that routes the destination lid - */ - - p_node = osm_physp_get_node_ptr(p_physp); - - if (p_node->sw) { - /* - * Source node is a switch. - * Make sure that p_physp points to the out port of the - * switch that routes to the destination lid (dest_lid_ho) - */ - p_physp = osm_switch_get_route_by_lid(p_node->sw, dest_lid); - if (p_physp == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F02: " - "Cannot find routing to LID %u from switch for GUID 0x%016" - PRIx64 "\n", dest_lid_ho, - cl_ntoh64(osm_node_get_node_guid(p_node))); - status = IB_NOT_FOUND; - goto Exit; - } - } - - if (sa->p_subn->opt.qos) { - /* - * Whether this node is switch or CA, the IN port for - * the sl2vl table is 0, because this is a source node. - */ - p_slvl_tbl = osm_physp_get_slvl_tbl(p_physp, 0); - - /* update valid SLs that still exist on this route */ - for (i = 0; i < IB_MAX_NUM_VLS; i++) { - if (valid_sl_mask & (1 << i) && - ib_slvl_table_get(p_slvl_tbl, i) == IB_DROP_VL) - valid_sl_mask &= ~(1 << i); - } - if (!valid_sl_mask) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "All the SLs lead to VL15 on this path\n"); - status = IB_NOT_FOUND; - goto Exit; - } - } - - /* - * Same as above - */ - p_node = osm_physp_get_node_ptr(p_dest_physp); - - if (p_node->sw) { - /* - * if destination is switch, we want p_dest_physp to point to port 0 - */ - p_dest_physp = - osm_switch_get_route_by_lid(p_node->sw, dest_lid); - - if (p_dest_physp == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F03: " - "Cannot find routing to LID %u from switch for GUID 0x%016" - PRIx64 "\n", dest_lid_ho, - cl_ntoh64(osm_node_get_node_guid(p_node))); - status = IB_NOT_FOUND; - goto Exit; - } - - } - - /* - * Now go through the path step by step - */ - - while (p_physp != p_dest_physp) { - - p_node = osm_physp_get_node_ptr(p_physp); - p_physp = osm_physp_get_remote(p_physp); - - if (p_physp == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F05: " - "Cannot find remote phys port when routing to LID %u from node GUID 0x%016" - PRIx64 "\n", dest_lid_ho, - cl_ntoh64(osm_node_get_node_guid(p_node))); - status = IB_ERROR; - goto Exit; - } - - in_port_num = osm_physp_get_port_num(p_physp); - - /* - This is point to point case (no switch in between) - */ - if (p_physp == p_dest_physp) - break; - - p_node = osm_physp_get_node_ptr(p_physp); - - if (!p_node->sw) { - /* - There is some sort of problem in the subnet object! - If this isn't a switch, we should have reached - the destination by now! - */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F06: " - "Internal error, bad path\n"); - status = IB_ERROR; - goto Exit; - } - - /* - Check parameters for the ingress port in this switch. - */ - p_pi = &p_physp->port_info; - - if (mtu > ib_port_info_get_mtu_cap(p_pi)) - mtu = ib_port_info_get_mtu_cap(p_pi); - - if (rate > ib_port_info_compute_rate(p_pi)) - rate = ib_port_info_compute_rate(p_pi); - - /* - Continue with the egress port on this switch. - */ - p_physp = osm_switch_get_route_by_lid(p_node->sw, dest_lid); - if (p_physp == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F07: " - "Dead end on path to LID %u from switch for GUID 0x%016" - PRIx64 "\n", dest_lid_ho, - cl_ntoh64(osm_node_get_node_guid(p_node))); - status = IB_ERROR; - goto Exit; - } - - p_pi = &p_physp->port_info; - - if (mtu > ib_port_info_get_mtu_cap(p_pi)) - mtu = ib_port_info_get_mtu_cap(p_pi); - - if (rate > ib_port_info_compute_rate(p_pi)) - rate = ib_port_info_compute_rate(p_pi); - - if (sa->p_subn->opt.qos) { - /* - * Check SL2VL table of the switch and update valid SLs - */ - p_slvl_tbl = - osm_physp_get_slvl_tbl(p_physp, in_port_num); - for (i = 0; i < IB_MAX_NUM_VLS; i++) { - if (valid_sl_mask & (1 << i) && - ib_slvl_table_get(p_slvl_tbl, - i) == IB_DROP_VL) - valid_sl_mask &= ~(1 << i); - } - if (!valid_sl_mask) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "All the SLs " - "lead to VL15 on this path\n"); - status = IB_NOT_FOUND; - goto Exit; - } - } - - /* update number of hops traversed */ - hops++; - if (hops > MAX_HOPS) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, - "Path from GUID 0x%016" PRIx64 " (%s) to" - " lid %u GUID 0x%016" PRIx64 " (%s) needs" - " more than %d hops, max %d hops allowed\n", - cl_ntoh64(osm_physp_get_port_guid(p_src_physp)), - p_src_physp->p_node->print_desc, dest_lid_ho, - cl_ntoh64(osm_physp_get_port_guid - (p_dest_physp)), - p_dest_physp->p_node->print_desc, hops, - MAX_HOPS); - status = IB_NOT_FOUND; - goto Exit; - } - } - - /* - p_physp now points to the destination - */ - p_pi = &p_physp->port_info; - - if (mtu > ib_port_info_get_mtu_cap(p_pi)) - mtu = ib_port_info_get_mtu_cap(p_pi); - - if (rate > ib_port_info_compute_rate(p_pi)) - rate = ib_port_info_compute_rate(p_pi); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Path min MTU = %u, min rate = %u\n", mtu, rate); - - /* - * Get QoS Level object according to the path request - * and adjust path parameters according to QoS settings - */ - if (sa->p_subn->opt.qos && - sa->p_subn->p_qos_policy && - (p_qos_level = - osm_qos_policy_get_qos_level_by_pr(sa->p_subn->p_qos_policy, - p_pr, p_src_physp, p_dest_physp, - comp_mask))) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "PathRecord request matches QoS Level '%s' (%s)\n", - p_qos_level->name, p_qos_level->use ? - p_qos_level->use : "no description"); - - if (p_qos_level->mtu_limit_set - && (mtu > p_qos_level->mtu_limit)) - mtu = p_qos_level->mtu_limit; - - if (p_qos_level->rate_limit_set - && (rate > p_qos_level->rate_limit)) - rate = p_qos_level->rate_limit; - - if (p_qos_level->sl_set) { - sl = p_qos_level->sl; - if (!(valid_sl_mask & (1 << sl))) { - status = IB_NOT_FOUND; - goto Exit; - } - } - } - - /* - * Set packet lifetime. - * According to spec definition IBA 1.2 Table 205 - * PacketLifeTime description, for loopback paths, - * packetLifeTime shall be zero. - */ - if (p_src_port == p_dest_port) - pkt_life = 0; - else if (p_qos_level && p_qos_level->pkt_life_set) - pkt_life = p_qos_level->pkt_life; - else - pkt_life = sa->p_subn->opt.subnet_timeout; - - /* - Determine if these values meet the user criteria - and adjust appropriately - */ - - /* we silently ignore cases where only the MTU selector is defined */ - if ((comp_mask & IB_PR_COMPMASK_MTUSELEC) && - (comp_mask & IB_PR_COMPMASK_MTU)) { - required_mtu = ib_path_rec_mtu(p_pr); - switch (ib_path_rec_mtu_sel(p_pr)) { - case 0: /* must be greater than */ - if (mtu <= required_mtu) - status = IB_NOT_FOUND; - break; - - case 1: /* must be less than */ - if (mtu >= required_mtu) { - /* adjust to use the highest mtu - lower then the required one */ - if (required_mtu > 1) - mtu = required_mtu - 1; - else - status = IB_NOT_FOUND; - } - break; - - case 2: /* exact match */ - if (mtu < required_mtu) - status = IB_NOT_FOUND; - else - mtu = required_mtu; - break; - - case 3: /* largest available */ - /* can't be disqualified by this one */ - break; - - default: - /* if we're here, there's a bug in ib_path_rec_mtu_sel() */ - CL_ASSERT(FALSE); - status = IB_ERROR; - break; - } - } - if (status != IB_SUCCESS) - goto Exit; - - /* we silently ignore cases where only the Rate selector is defined */ - if ((comp_mask & IB_PR_COMPMASK_RATESELEC) && - (comp_mask & IB_PR_COMPMASK_RATE)) { - required_rate = ib_path_rec_rate(p_pr); - switch (ib_path_rec_rate_sel(p_pr)) { - case 0: /* must be greater than */ - if (rate <= required_rate) - status = IB_NOT_FOUND; - break; - - case 1: /* must be less than */ - if (rate >= required_rate) { - /* adjust the rate to use the highest rate - lower then the required one */ - if (required_rate > 2) - rate = required_rate - 1; - else - status = IB_NOT_FOUND; - } - break; - - case 2: /* exact match */ - if (rate < required_rate) - status = IB_NOT_FOUND; - else - rate = required_rate; - break; - - case 3: /* largest available */ - /* can't be disqualified by this one */ - break; - - default: - /* if we're here, there's a bug in ib_path_rec_mtu_sel() */ - CL_ASSERT(FALSE); - status = IB_ERROR; - break; - } - } - if (status != IB_SUCCESS) - goto Exit; - - /* we silently ignore cases where only the PktLife selector is defined */ - if ((comp_mask & IB_PR_COMPMASK_PKTLIFETIMESELEC) && - (comp_mask & IB_PR_COMPMASK_PKTLIFETIME)) { - required_pkt_life = ib_path_rec_pkt_life(p_pr); - switch (ib_path_rec_pkt_life_sel(p_pr)) { - case 0: /* must be greater than */ - if (pkt_life <= required_pkt_life) - status = IB_NOT_FOUND; - break; - - case 1: /* must be less than */ - if (pkt_life >= required_pkt_life) { - /* adjust the lifetime to use the highest possible - lower then the required one */ - if (required_pkt_life > 1) - pkt_life = required_pkt_life - 1; - else - status = IB_NOT_FOUND; - } - break; - - case 2: /* exact match */ - if (pkt_life < required_pkt_life) - status = IB_NOT_FOUND; - else - pkt_life = required_pkt_life; - break; - - case 3: /* smallest available */ - /* can't be disqualified by this one */ - break; - - default: - /* if we're here, there's a bug in ib_path_rec_pkt_life_sel() */ - CL_ASSERT(FALSE); - status = IB_ERROR; - break; - } - } - - if (status != IB_SUCCESS) - goto Exit; - - /* - * set Pkey for this path record request - */ - - if ((comp_mask & IB_PR_COMPMASK_RAWTRAFFIC) && - (cl_ntoh32(p_pr->hop_flow_raw) & (1 << 31))) - pkey = osm_physp_find_common_pkey(p_src_physp, p_dest_physp); - - else if (comp_mask & IB_PR_COMPMASK_PKEY) { - /* - * PR request has a specific pkey: - * Check that source and destination share this pkey. - * If QoS level has pkeys, check that this pkey exists - * in the QoS level pkeys. - * PR returned pkey is the requested pkey. - */ - pkey = p_pr->pkey; - if (!osm_physp_share_this_pkey(p_src_physp, p_dest_physp, pkey)) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F1A: " - "Ports 0x%016" PRIx64 " 0x%016" PRIx64 - " do not share specified PKey 0x%04x\n", - cl_ntoh64(osm_physp_get_port_guid(p_src_physp)), - cl_ntoh64(osm_physp_get_port_guid - (p_dest_physp)), cl_ntoh16(pkey)); - status = IB_NOT_FOUND; - goto Exit; - } - if (p_qos_level && p_qos_level->pkey_range_len && - !osm_qos_level_has_pkey(p_qos_level, pkey)) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F1D: " - "Ports do not share PKeys defined by QoS level\n"); - status = IB_NOT_FOUND; - goto Exit; - } - - } else if (p_qos_level && p_qos_level->pkey_range_len) { - /* - * PR request doesn't have a specific pkey, but QoS level - * has pkeys - get shared pkey from QoS level pkeys - */ - pkey = osm_qos_level_get_shared_pkey(p_qos_level, - p_src_physp, p_dest_physp); - if (!pkey) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F1E: " - "Ports 0x%016" PRIx64 " 0x%016" PRIx64 - " do not share PKeys defined by QoS level\n", - cl_ntoh64(osm_physp_get_port_guid(p_src_physp)), - cl_ntoh64(osm_physp_get_port_guid - (p_dest_physp))); - status = IB_NOT_FOUND; - goto Exit; - } - } else { - /* - * Neither PR request nor QoS level have pkey. - * Just get any shared pkey. - */ - pkey = osm_physp_find_common_pkey(p_src_physp, p_dest_physp); - if (!pkey) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F1B: " - "Ports 0x%016" PRIx64 " 0x%016" PRIx64 - " do not have any shared PKeys\n", - cl_ntoh64(osm_physp_get_port_guid(p_src_physp)), - cl_ntoh64(osm_physp_get_port_guid - (p_dest_physp))); - status = IB_NOT_FOUND; - goto Exit; - } - } - - if (pkey) { - p_prtn = - (osm_prtn_t *) cl_qmap_get(&sa->p_subn->prtn_pkey_tbl, - pkey & cl_hton16((uint16_t) ~ - 0x8000)); - if (p_prtn == - (osm_prtn_t *) cl_qmap_end(&sa->p_subn->prtn_pkey_tbl)) - p_prtn = NULL; - } - - /* - * Set PathRecord SL - */ - - is_lash = (p_osm->routing_engine_used == OSM_ROUTING_ENGINE_TYPE_LASH); - - if (comp_mask & IB_PR_COMPMASK_SL) { - /* - * Specific SL was requested - */ - sl = ib_path_rec_sl(p_pr); - - if (p_qos_level && p_qos_level->sl_set - && (p_qos_level->sl != sl)) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F1F: " - "QoS constraints: required PathRecord SL (%u) " - "doesn't match QoS policy SL (%u)\n", sl, - p_qos_level->sl); - status = IB_NOT_FOUND; - goto Exit; - } - - if (is_lash - && osm_get_lash_sl(p_osm, p_src_port, p_dest_port) != sl) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F23: " - "Required PathRecord SL (%u) doesn't " - "match LASH SL\n", sl); - status = IB_NOT_FOUND; - goto Exit; - } - - } else if (is_lash) { - /* - * No specific SL in PathRecord request. - * If it's LASH routing - use its SL. - * slid and dest_lid are stored in network in lash. - */ - sl = osm_get_lash_sl(p_osm, p_src_port, p_dest_port); - } else if (p_qos_level && p_qos_level->sl_set) { - /* - * No specific SL was requested, and we're not in - * LASH routing, but there is an SL in QoS level. - */ - sl = p_qos_level->sl; - - if (pkey && p_prtn && p_prtn->sl != p_qos_level->sl) - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "QoS level SL (%u) overrides partition SL (%u)\n", - p_qos_level->sl, p_prtn->sl); - - } else if (pkey) { - /* - * No specific SL in request or in QoS level - use partition SL - */ - if (!p_prtn) { - sl = OSM_DEFAULT_SL; - /* this may be possible when pkey tables are created somehow in - previous runs or things are going wrong here */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F1C: " - "No partition found for PKey 0x%04x - using default SL %d\n", - cl_ntoh16(pkey), sl); - } else - sl = p_prtn->sl; - } else if (sa->p_subn->opt.qos) { - if (valid_sl_mask & (1 << OSM_DEFAULT_SL)) - sl = OSM_DEFAULT_SL; - else { - for (i = 0; i < IB_MAX_NUM_VLS; i++) - if (valid_sl_mask & (1 << i)) - break; - sl = i; - } - } else - sl = OSM_DEFAULT_SL; - - if (sa->p_subn->opt.qos && !(valid_sl_mask & (1 << sl))) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F24: " - "Selected SL (%u) leads to VL15\n", sl); - status = IB_NOT_FOUND; - goto Exit; - } - - /* reset pkey when raw traffic */ - if (comp_mask & IB_PR_COMPMASK_RAWTRAFFIC && - cl_ntoh32(p_pr->hop_flow_raw) & (1 << 31)) - pkey = 0; - - p_parms->mtu = mtu; - p_parms->rate = rate; - p_parms->pkt_life = pkt_life; - p_parms->pkey = pkey; - p_parms->sl = sl; - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Path params: mtu = %u, rate = %u," - " packet lifetime = %u, pkey = 0x%04X, sl = %u\n", - mtu, rate, pkt_life, cl_ntoh16(pkey), sl); -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void pr_rcv_build_pr(IN osm_sa_t * sa, IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const ib_gid_t * p_dgid, - IN const uint16_t src_lid_ho, - IN const uint16_t dest_lid_ho, - IN const uint8_t preference, - IN const osm_path_parms_t * p_parms, - OUT ib_path_rec_t * p_pr) -{ - const osm_physp_t *p_src_physp; - const osm_physp_t *p_dest_physp; - - OSM_LOG_ENTER(sa->p_log); - - p_src_physp = p_src_port->p_physp; - - if (p_dgid) - p_pr->dgid = *p_dgid; - else { - p_dest_physp = p_dest_port->p_physp; - - p_pr->dgid.unicast.prefix = - osm_physp_get_subnet_prefix(p_dest_physp); - p_pr->dgid.unicast.interface_id = - osm_physp_get_port_guid(p_dest_physp); - } - - p_pr->sgid.unicast.prefix = osm_physp_get_subnet_prefix(p_src_physp); - p_pr->sgid.unicast.interface_id = osm_physp_get_port_guid(p_src_physp); - - p_pr->dlid = cl_hton16(dest_lid_ho); - p_pr->slid = cl_hton16(src_lid_ho); - - p_pr->hop_flow_raw &= cl_hton32(1 << 31); - - /* Only set HopLimit if going through a router */ - if (p_dgid) - p_pr->hop_flow_raw |= cl_hton32(IB_HOPLIMIT_MAX); - - p_pr->pkey = p_parms->pkey; - ib_path_rec_set_sl(p_pr, p_parms->sl); - ib_path_rec_set_qos_class(p_pr, 0); - p_pr->mtu = (uint8_t) (p_parms->mtu | 0x80); - p_pr->rate = (uint8_t) (p_parms->rate | 0x80); - - /* According to 1.2 spec definition Table 205 PacketLifeTime description, - for loopback paths, packetLifeTime shall be zero. */ - if (p_src_port == p_dest_port) - p_pr->pkt_life = 0x80; /* loopback */ - else - p_pr->pkt_life = (uint8_t) (p_parms->pkt_life | 0x80); - - p_pr->preference = preference; - - /* always return num_path = 0 so this is only the reversible component */ - if (p_parms->reversible) - p_pr->num_path = 0x80; - - OSM_LOG_EXIT(sa->p_log); -} - -static osm_pr_item_t *pr_rcv_get_lid_pair_path(IN osm_sa_t * sa, - IN const ib_path_rec_t * p_pr, - IN const osm_port_t * p_src_port, - IN const osm_port_t * - p_dest_port, - IN const ib_gid_t * p_dgid, - IN const uint16_t src_lid_ho, - IN const uint16_t dest_lid_ho, - IN const ib_net64_t comp_mask, - IN const uint8_t preference) -{ - osm_path_parms_t path_parms; - osm_path_parms_t rev_path_parms; - osm_pr_item_t *p_pr_item; - ib_api_status_t status, rev_path_status; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Src LID %u, Dest LID %u\n", - src_lid_ho, dest_lid_ho); - - p_pr_item = malloc(sizeof(*p_pr_item)); - if (p_pr_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F01: " - "Unable to allocate path record\n"); - goto Exit; - } - memset(p_pr_item, 0, sizeof(*p_pr_item)); - - status = pr_rcv_get_path_parms(sa, p_pr, p_src_port, p_dest_port, - dest_lid_ho, comp_mask, &path_parms); - - if (status != IB_SUCCESS) { - free(p_pr_item); - p_pr_item = NULL; - goto Exit; - } - - /* now try the reversible path */ - rev_path_status = pr_rcv_get_path_parms(sa, p_pr, p_dest_port, - p_src_port, src_lid_ho, - comp_mask, &rev_path_parms); - path_parms.reversible = (rev_path_status == IB_SUCCESS); - - /* did we get a Reversible Path compmask ? */ - /* - NOTE that if the reversible component = 0, it is a don't care - rather then requiring non-reversible paths ... - see Vol1 Ver1.2 p900 l16 - */ - if ((comp_mask & IB_PR_COMPMASK_REVERSIBLE) && - !path_parms.reversible && (p_pr->num_path & 0x80)) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Requested reversible path but failed to get one\n"); - free(p_pr_item); - p_pr_item = NULL; - goto Exit; - } - - pr_rcv_build_pr(sa, p_src_port, p_dest_port, p_dgid, src_lid_ho, - dest_lid_ho, preference, &path_parms, - &p_pr_item->path_rec); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return p_pr_item; -} - -static void pr_rcv_get_port_pair_paths(IN osm_sa_t * sa, - IN const ib_sa_mad_t *sa_mad, - IN const osm_port_t * p_req_port, - IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const ib_gid_t * p_dgid, - IN cl_qlist_t * p_list) -{ - const ib_path_rec_t *p_pr = ib_sa_mad_get_payload_ptr(sa_mad); - ib_net64_t comp_mask = sa_mad->comp_mask; - osm_pr_item_t *p_pr_item; - uint16_t src_lid_min_ho; - uint16_t src_lid_max_ho; - uint16_t dest_lid_min_ho; - uint16_t dest_lid_max_ho; - uint16_t src_lid_ho; - uint16_t dest_lid_ho; - uint32_t path_num; - uint8_t preference; - unsigned iterations, src_offset, dest_offset; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Src port 0x%016" PRIx64 ", Dst port 0x%016" PRIx64 "\n", - cl_ntoh64(osm_port_get_guid(p_src_port)), - cl_ntoh64(osm_port_get_guid(p_dest_port))); - - /* Check that the req_port, src_port and dest_port all share a - pkey. The check is done on the default physical port of the ports. */ - if (osm_port_share_pkey(sa->p_log, p_req_port, p_src_port) == FALSE - || osm_port_share_pkey(sa->p_log, p_req_port, - p_dest_port) == FALSE - || osm_port_share_pkey(sa->p_log, p_src_port, p_dest_port) == FALSE) - /* One of the pairs doesn't share a pkey so the path is disqualified. */ - goto Exit; - - /* - We shouldn't be here if the paths are disqualified in some way... - Thus, we assume every possible connection is valid. - - We desire to return high-quality paths first. - In OpenSM, higher quality means least overlap with other paths. - This is acheived in practice by returning paths with - different LID value on each end, which means these - paths are more redundant that paths with the same LID repeated - on one side. For example, in OpenSM the paths between two - endpoints with LMC = 1 might be as follows: - - Port A, LID 1 <-> Port B, LID 3 - Port A, LID 1 <-> Port B, LID 4 - Port A, LID 2 <-> Port B, LID 3 - Port A, LID 2 <-> Port B, LID 4 - - The OpenSM unicast routing algorithms attempt to disperse each path - to as varied a physical path as is reasonable. 1<->3 and 1<->4 have - more physical overlap (hence less redundancy) than 1<->3 and 2<->4. - - OpenSM ranks paths in three preference groups: - - Preference Value Description - ---------------- ------------------------------------------- - 0 Redundant in both directions with other - pref value = 0 paths - - 1 Redundant in one direction with other - pref value = 0 and pref value = 1 paths - - 2 Not redundant in either direction with - other paths - - 3-FF Unused - - SA clients don't need to know these details, only that the lower - preference paths are preferred, as stated in the spec. The paths - may not actually be physically redundant depending on the topology - of the subnet, but the point of LMC > 0 is to offer redundancy, - so it is assumed that the subnet is physically appropriate for the - specified LMC value. A more advanced implementation would inspect for - physical redundancy, but I'm not going to bother with that now. - */ - - /* - Refine our search if the client specified end-point LIDs - */ - if (comp_mask & IB_PR_COMPMASK_DLID) - dest_lid_max_ho = dest_lid_min_ho = cl_ntoh16(p_pr->dlid); - else - osm_port_get_lid_range_ho(p_dest_port, &dest_lid_min_ho, - &dest_lid_max_ho); - - if (comp_mask & IB_PR_COMPMASK_SLID) - src_lid_max_ho = src_lid_min_ho = cl_ntoh16(p_pr->slid); - else - osm_port_get_lid_range_ho(p_src_port, &src_lid_min_ho, - &src_lid_max_ho); - - if (src_lid_min_ho == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F20:" - "Obtained source LID of 0. No such LID possible\n"); - goto Exit; - } - - if (dest_lid_min_ho == 0) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F21:" - "Obtained destination LID of 0. No such LID possible\n"); - goto Exit; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Src LIDs [%u-%u], Dest LIDs [%u-%u]\n", - src_lid_min_ho, src_lid_max_ho, - dest_lid_min_ho, dest_lid_max_ho); - - src_lid_ho = src_lid_min_ho; - dest_lid_ho = dest_lid_min_ho; - - /* - Preferred paths come first in OpenSM - */ - preference = 0; - path_num = 0; - - /* If SubnAdmGet, assume NumbPaths 1 (1.2 erratum) */ - if (sa_mad->method == IB_MAD_METHOD_GET) - iterations = 1; - else if (comp_mask & IB_PR_COMPMASK_NUMBPATH) - iterations = ib_path_rec_num_path(p_pr); - else - iterations = (unsigned) (-1); - - while (path_num < iterations) { - /* - These paths are "fully redundant" - */ - - p_pr_item = pr_rcv_get_lid_pair_path(sa, p_pr, p_src_port, - p_dest_port, p_dgid, - src_lid_ho, dest_lid_ho, - comp_mask, preference); - - if (p_pr_item) { - cl_qlist_insert_tail(p_list, &p_pr_item->list_item); - ++path_num; - } - - if (++src_lid_ho > src_lid_max_ho) - break; - - if (++dest_lid_ho > dest_lid_max_ho) - break; - } - - /* - Check if we've accumulated all the paths that the user cares to see - */ - if (path_num == iterations) - goto Exit; - - /* - Don't bother reporting preference 1 paths for now. - It's more trouble than it's worth and can only occur - if ports have different LMC values, which isn't supported - by OpenSM right now anyway. - */ - preference = 2; - src_lid_ho = src_lid_min_ho; - dest_lid_ho = dest_lid_min_ho; - src_offset = 0; - dest_offset = 0; - - /* - Iterate over the remaining paths - */ - while (path_num < iterations) { - dest_offset++; - dest_lid_ho++; - - if (dest_lid_ho > dest_lid_max_ho) { - src_offset++; - src_lid_ho++; - - if (src_lid_ho > src_lid_max_ho) - break; /* done */ - - dest_offset = 0; - dest_lid_ho = dest_lid_min_ho; - } - - /* - These paths are "fully non-redundant" with paths already - identified above and consequently not of much value. - - Don't return paths we already identified above, as indicated - by the offset values being equal. - */ - if (src_offset == dest_offset) - continue; /* already reported */ - - p_pr_item = pr_rcv_get_lid_pair_path(sa, p_pr, p_src_port, - p_dest_port, p_dgid, - src_lid_ho, dest_lid_ho, - comp_mask, preference); - - if (p_pr_item) { - cl_qlist_insert_tail(p_list, &p_pr_item->list_item); - ++path_num; - } - } - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -/* Find the router port that is configured to handle this prefix, if any */ -static ib_net64_t find_router(const osm_sa_t *sa, ib_net64_t prefix) -{ - osm_prefix_route_t *route = NULL; - osm_router_t *rtr; - cl_qlist_t *l = &sa->p_subn->prefix_routes_list; - cl_list_item_t *i; - - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, "Non local DGID subnet prefix " - "0x%016" PRIx64 "\n", cl_ntoh64(prefix)); - - for (i = cl_qlist_head(l); i != cl_qlist_end(l); i = cl_qlist_next(i)) { - osm_prefix_route_t *r = (osm_prefix_route_t *)i; - if (!r->prefix || r->prefix == prefix) { - route = r; - break; - } - } - if (!route) - return 0; - - if (route->guid == 0) /* first router */ - rtr = (osm_router_t *) cl_qmap_head(&sa->p_subn->rtr_guid_tbl); - else - rtr = (osm_router_t *) cl_qmap_get(&sa->p_subn->rtr_guid_tbl, - route->guid); - - if (rtr == (osm_router_t *) cl_qmap_end(&sa->p_subn->rtr_guid_tbl)) - return 0; - - return osm_port_get_guid(osm_router_get_port_ptr(rtr)); -} - -static ib_net16_t pr_rcv_get_end_points(IN osm_sa_t * sa, - IN const ib_sa_mad_t *sa_mad, - OUT const osm_port_t ** pp_src_port, - OUT const osm_port_t ** pp_dest_port, - OUT const ib_gid_t ** pp_dgid) -{ - const ib_path_rec_t *p_pr = ib_sa_mad_get_payload_ptr(sa_mad); - ib_net64_t comp_mask = sa_mad->comp_mask; - ib_net64_t dest_guid; - ib_net16_t sa_status = IB_SA_MAD_STATUS_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - /* - Determine what fields are valid and then get a pointer - to the source and destination port objects, if possible. - */ - - /* - Check a few easy disqualifying cases up front before getting - into the endpoints. - */ - - if (comp_mask & IB_PR_COMPMASK_SGID) { - if (!ib_gid_is_link_local(&p_pr->sgid)) { - if (ib_gid_get_subnet_prefix(&p_pr->sgid) != - sa->p_subn->opt.subnet_prefix) { - /* - This 'error' is the client's fault (bad gid) - so don't enter it as an error in our own log. - Return an error response to the client. - */ - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "Non local SGID subnet prefix 0x%016" - PRIx64 "\n", - cl_ntoh64(p_pr->sgid.unicast.prefix)); - sa_status = IB_SA_MAD_STATUS_INVALID_GID; - goto Exit; - } - } - - *pp_src_port = osm_get_port_by_guid(sa->p_subn, - p_pr->sgid.unicast. - interface_id); - if (!*pp_src_port) { - /* - This 'error' is the client's fault (bad gid) so - don't enter it as an error in our own log. - Return an error response to the client. - */ - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "No source port with GUID 0x%016" PRIx64 "\n", - cl_ntoh64(p_pr->sgid.unicast.interface_id)); - sa_status = IB_SA_MAD_STATUS_INVALID_GID; - goto Exit; - } - } else if (comp_mask & IB_PR_COMPMASK_SLID) { - *pp_src_port = osm_get_port_by_lid(sa->p_subn, p_pr->slid); - if (!*pp_src_port) { - /* - This 'error' is the client's fault (bad lid) so - don't enter it as an error in our own log. - Return an error response to the client. - */ - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, "No source port " - "with LID %u\n", cl_ntoh16(p_pr->slid)); - sa_status = IB_SA_MAD_STATUS_NO_RECORDS; - goto Exit; - } - } else - *pp_src_port = NULL; - - if (comp_mask & IB_PR_COMPMASK_DGID) { - if (!ib_gid_is_link_local(&p_pr->dgid) && - !ib_gid_is_multicast(&p_pr->dgid) && - ib_gid_get_subnet_prefix(&p_pr->dgid) != - sa->p_subn->opt.subnet_prefix) { - dest_guid = find_router(sa, p_pr->dgid.unicast.prefix); - if (!dest_guid) { - char gid_str[INET6_ADDRSTRLEN]; - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "Off subnet DGID %s, but router not " - "found\n", - inet_ntop(AF_INET6, p_pr->dgid.raw, - gid_str, sizeof(gid_str))); - sa_status = IB_SA_MAD_STATUS_INVALID_GID; - goto Exit; - } - if (pp_dgid) - *pp_dgid = &p_pr->dgid; - } else - dest_guid = p_pr->dgid.unicast.interface_id; - - *pp_dest_port = osm_get_port_by_guid(sa->p_subn, dest_guid); - if (!*pp_dest_port) { - /* - This 'error' is the client's fault (bad gid) so - don't enter it as an error in our own log. - Return an error response to the client. - */ - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "No dest port with GUID 0x%016" PRIx64 "\n", - cl_ntoh64(dest_guid)); - sa_status = IB_SA_MAD_STATUS_INVALID_GID; - goto Exit; - } - } else if (comp_mask & IB_PR_COMPMASK_DLID) { - *pp_dest_port = osm_get_port_by_lid(sa->p_subn, p_pr->dlid); - if (!*pp_dest_port) { - /* - This 'error' is the client's fault (bad lid) - so don't enter it as an error in our own log. - Return an error response to the client. - */ - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, "No dest port " - "with LID %u\n", cl_ntoh16(p_pr->dlid)); - sa_status = IB_SA_MAD_STATUS_NO_RECORDS; - goto Exit; - } - } else - *pp_dest_port = NULL; - -Exit: - OSM_LOG_EXIT(sa->p_log); - return sa_status; -} - -static void pr_rcv_process_world(IN osm_sa_t * sa, IN const ib_sa_mad_t * sa_mad, - IN const osm_port_t * requester_port, - IN const ib_gid_t * p_dgid, - IN cl_qlist_t * p_list) -{ - const cl_qmap_t *p_tbl; - const osm_port_t *p_dest_port; - const osm_port_t *p_src_port; - - OSM_LOG_ENTER(sa->p_log); - - /* - Iterate the entire port space over itself. - A path record from a port to itself is legit, so no - need for a special case there. - - We compute both A -> B and B -> A, since we don't have - any check to determine the reversability of the paths. - */ - p_tbl = &sa->p_subn->port_guid_tbl; - - p_dest_port = (osm_port_t *) cl_qmap_head(p_tbl); - while (p_dest_port != (osm_port_t *) cl_qmap_end(p_tbl)) { - p_src_port = (osm_port_t *) cl_qmap_head(p_tbl); - while (p_src_port != (osm_port_t *) cl_qmap_end(p_tbl)) { - pr_rcv_get_port_pair_paths(sa, sa_mad, requester_port, - p_src_port, p_dest_port, - p_dgid, p_list); - if (sa_mad->method == IB_MAD_METHOD_GET && - cl_qlist_count(p_list) > 0) - goto Exit; - - p_src_port = - (osm_port_t *) cl_qmap_next(&p_src_port->map_item); - } - - p_dest_port = - (osm_port_t *) cl_qmap_next(&p_dest_port->map_item); - } - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void pr_rcv_process_half(IN osm_sa_t * sa, IN const ib_sa_mad_t * sa_mad, - IN const osm_port_t * requester_port, - IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const ib_gid_t * p_dgid, - IN cl_qlist_t * p_list) -{ - const cl_qmap_t *p_tbl; - const osm_port_t *p_port; - - OSM_LOG_ENTER(sa->p_log); - - /* - Iterate over every port, looking for matches... - A path record from a port to itself is legit, so no - need to special case that one. - */ - p_tbl = &sa->p_subn->port_guid_tbl; - - if (p_src_port) { - /* - The src port if fixed, so iterate over destination ports. - */ - p_port = (osm_port_t *) cl_qmap_head(p_tbl); - while (p_port != (osm_port_t *) cl_qmap_end(p_tbl)) { - pr_rcv_get_port_pair_paths(sa, sa_mad, requester_port, - p_src_port, p_port, p_dgid, - p_list); - if (sa_mad->method == IB_MAD_METHOD_GET && - cl_qlist_count(p_list) > 0) - break; - p_port = (osm_port_t *) cl_qmap_next(&p_port->map_item); - } - } else { - /* - The dest port if fixed, so iterate over source ports. - */ - p_port = (osm_port_t *) cl_qmap_head(p_tbl); - while (p_port != (osm_port_t *) cl_qmap_end(p_tbl)) { - pr_rcv_get_port_pair_paths(sa, sa_mad, requester_port, - p_port, p_dest_port, p_dgid, - p_list); - if (sa_mad->method == IB_MAD_METHOD_GET && - cl_qlist_count(p_list) > 0) - break; - p_port = (osm_port_t *) cl_qmap_next(&p_port->map_item); - } - } - - OSM_LOG_EXIT(sa->p_log); -} - -static void pr_rcv_process_pair(IN osm_sa_t * sa, IN const ib_sa_mad_t * sa_mad, - IN const osm_port_t * requester_port, - IN const osm_port_t * p_src_port, - IN const osm_port_t * p_dest_port, - IN const ib_gid_t * p_dgid, - IN cl_qlist_t * p_list) -{ - OSM_LOG_ENTER(sa->p_log); - - pr_rcv_get_port_pair_paths(sa, sa_mad, requester_port, p_src_port, - p_dest_port, p_dgid, p_list); - - OSM_LOG_EXIT(sa->p_log); -} - -static ib_api_status_t pr_match_mgrp_attributes(IN osm_sa_t * sa, - IN const ib_sa_mad_t * sa_mad, - IN const osm_mgrp_t * p_mgrp) -{ - const ib_path_rec_t *p_pr = ib_sa_mad_get_payload_ptr(sa_mad); - ib_net64_t comp_mask = sa_mad->comp_mask; - const osm_port_t *port; - ib_api_status_t status = IB_ERROR; - uint32_t flow_label; - uint8_t sl, hop_limit; - - OSM_LOG_ENTER(sa->p_log); - - /* check that MLID of the MC group matches the PathRecord DLID */ - if ((comp_mask & IB_PR_COMPMASK_DLID) && p_mgrp->mlid != p_pr->dlid) - goto Exit; - - /* If SGID and/or SLID specified, should validate as member of MC group */ - if (comp_mask & IB_PR_COMPMASK_SGID) { - port = osm_get_port_by_guid(sa->p_subn, - p_pr->sgid.unicast.interface_id); - if (!port || !osm_mgrp_get_mcm_port(p_mgrp, port->guid)) - goto Exit; - } - - if (comp_mask & IB_PR_COMPMASK_SLID) { - port = osm_get_port_by_lid(sa->p_subn, p_pr->slid); - if (!port || !osm_mgrp_get_mcm_port(p_mgrp, port->guid)) - goto Exit; - } - - /* Also, MTU, rate, packet lifetime, and raw traffic requested are not currently checked */ - if ((comp_mask & IB_PR_COMPMASK_PKEY) && - p_pr->pkey != p_mgrp->mcmember_rec.pkey) - goto Exit; - - ib_member_get_sl_flow_hop(p_mgrp->mcmember_rec.sl_flow_hop, - &sl, &flow_label, &hop_limit); - - if ((comp_mask & IB_PR_COMPMASK_SL) && ib_path_rec_sl(p_pr) != sl) - goto Exit; - - /* If SubnAdmGet, assume NumbPaths of 1 (1.2 erratum) */ - if ((comp_mask & IB_PR_COMPMASK_NUMBPATH) && - sa_mad->method != IB_MAD_METHOD_GET && - ib_path_rec_num_path(p_pr) == 0) - goto Exit; - - if ((comp_mask & IB_PR_COMPMASK_FLOWLABEL) && - ib_path_rec_flow_lbl(p_pr) != flow_label) - goto Exit; - - if ((comp_mask & IB_PR_COMPMASK_HOPLIMIT) && - ib_path_rec_hop_limit(p_pr) != hop_limit) - goto Exit; - - if ((comp_mask & IB_PR_COMPMASK_TCLASS) && - p_pr->tclass != p_mgrp->mcmember_rec.tclass) - goto Exit; - - status = IB_SUCCESS; - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void pr_process_multicast(osm_sa_t * sa, const ib_sa_mad_t *sa_mad, - cl_qlist_t *list) -{ - ib_path_rec_t *pr = ib_sa_mad_get_payload_ptr(sa_mad); - osm_mgrp_t *mgrp; - ib_api_status_t status; - osm_pr_item_t *pr_item; - uint32_t flow_label; - uint8_t sl, hop_limit; - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Multicast destination requested\n"); - - mgrp = osm_get_mgrp_by_mgid(sa->p_subn, &pr->dgid); - if (!mgrp) { - char gid_str[INET6_ADDRSTRLEN]; - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F09: " - "No MC group found for PathRecord destination GID %s\n", - inet_ntop(AF_INET6, pr->dgid.raw, gid_str, - sizeof gid_str)); - return; - } - - /* Make sure the rest of the PathRecord matches the MC group attributes */ - status = pr_match_mgrp_attributes(sa, sa_mad, mgrp); - if (status != IB_SUCCESS) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F19: " - "MC group attributes don't match PathRecord request\n"); - return; - } - - pr_item = malloc(sizeof(*pr_item)); - if (pr_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F18: " - "Unable to allocate path record for MC group\n"); - return; - } - memset(pr_item, 0, sizeof(*pr_item)); - - /* Copy PathRecord request into response */ - pr_item->path_rec = *pr; - - /* Now, use the MC info to cruft up the PathRecord response */ - pr_item->path_rec.dgid = mgrp->mcmember_rec.mgid; - pr_item->path_rec.dlid = mgrp->mcmember_rec.mlid; - pr_item->path_rec.tclass = mgrp->mcmember_rec.tclass; - pr_item->path_rec.num_path = 1; - pr_item->path_rec.pkey = mgrp->mcmember_rec.pkey; - - /* MTU, rate, and packet lifetime should be exactly */ - pr_item->path_rec.mtu = (2 << 6) | mgrp->mcmember_rec.mtu; - pr_item->path_rec.rate = (2 << 6) | mgrp->mcmember_rec.rate; - pr_item->path_rec.pkt_life = (2 << 6) | mgrp->mcmember_rec.pkt_life; - - /* SL, Hop Limit, and Flow Label */ - ib_member_get_sl_flow_hop(mgrp->mcmember_rec.sl_flow_hop, - &sl, &flow_label, &hop_limit); - ib_path_rec_set_sl(&pr_item->path_rec, sl); - ib_path_rec_set_qos_class(&pr_item->path_rec, 0); - - /* HopLimit is not yet set in non link local MC groups */ - /* If it were, this would not be needed */ - if (ib_mgid_get_scope(&mgrp->mcmember_rec.mgid) != - IB_MC_SCOPE_LINK_LOCAL) - hop_limit = IB_HOPLIMIT_MAX; - - pr_item->path_rec.hop_flow_raw = - cl_hton32(hop_limit) | (flow_label << 8); - - cl_qlist_insert_tail(list, &pr_item->list_item); -} - -void osm_pr_rcv_process(IN void *context, IN void *data) -{ - osm_sa_t *sa = context; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - ib_path_rec_t *p_pr = ib_sa_mad_get_payload_ptr(p_sa_mad); - cl_qlist_t pr_list; - const ib_gid_t *p_dgid = NULL; - const osm_port_t *p_src_port, *p_dest_port; - osm_port_t *requester_port; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - CL_ASSERT(p_sa_mad->attr_id == IB_MAD_ATTR_PATH_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (p_sa_mad->method != IB_MAD_METHOD_GET && - p_sa_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F17: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_sa_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - requester_port = osm_get_port_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (requester_port == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F16: " - "Cannot find requester physical port\n"); - goto Exit; - } - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_path_record(sa->p_log, p_pr, OSM_LOG_DEBUG); - - cl_qlist_init(&pr_list); - - /* - Most SA functions (including this one) are read-only on the - subnet object, so we grab the lock non-exclusively. - */ - cl_plock_acquire(sa->p_lock); - - /* Handle multicast destinations separately */ - if ((p_sa_mad->comp_mask & IB_PR_COMPMASK_DGID) && - ib_gid_is_multicast(&p_pr->dgid)) { - pr_process_multicast(sa, p_sa_mad, &pr_list); - goto Unlock; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Unicast destination requested\n"); - - if (pr_rcv_get_end_points(sa, p_sa_mad, &p_src_port, &p_dest_port, - &p_dgid) != IB_SA_MAD_STATUS_SUCCESS) - goto Unlock; - /* - What happens next depends on the type of endpoint information - that was specified.... - */ - if (p_src_port) { - if (p_dest_port) - pr_rcv_process_pair(sa, p_sa_mad, requester_port, - p_src_port, p_dest_port, p_dgid, - &pr_list); - else - pr_rcv_process_half(sa, p_sa_mad, requester_port, - p_src_port, NULL, p_dgid, &pr_list); - } else { - if (p_dest_port) - pr_rcv_process_half(sa, p_sa_mad, requester_port, - NULL, p_dest_port, p_dgid, &pr_list); - else - /* - Katie, bar the door! - */ - pr_rcv_process_world(sa, p_sa_mad, requester_port, - p_dgid, &pr_list); - } - -Unlock: - cl_plock_release(sa->p_lock); - - /* Now, (finally) respond to the PathRecord request */ - osm_sa_respond(sa, p_madw, sizeof(ib_path_rec_t), &pr_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_pkey_record.c b/branches/opensm_3/user/opensm/osm_sa_pkey_record.c deleted file mode 100644 index 0bbc7f53..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_pkey_record.c +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_pkey_item { - cl_list_item_t list_item; - ib_pkey_table_record_t rec; -} osm_pkey_item_t; - -typedef struct osm_pkey_search_ctxt { - const ib_pkey_table_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - uint16_t block_num; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; -} osm_pkey_search_ctxt_t; - -static void sa_pkey_create(IN osm_sa_t * sa, IN osm_physp_t * p_physp, - IN osm_pkey_search_ctxt_t * p_ctxt, - IN uint16_t block) -{ - osm_pkey_item_t *p_rec_item; - uint16_t lid; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4602: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - if (p_physp->p_node->node_info.node_type != IB_NODE_TYPE_SWITCH) - lid = p_physp->port_info.base_lid; - else - lid = osm_node_get_base_lid(p_physp->p_node, 0); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New P_Key table for: port 0x%016" PRIx64 - ", lid %u, port %u Block:%u\n", - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - cl_ntoh16(lid), osm_physp_get_port_num(p_physp), block); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = lid; - p_rec_item->rec.block_num = block; - p_rec_item->rec.port_num = osm_physp_get_port_num(p_physp); - p_rec_item->rec.pkey_tbl = - *(osm_pkey_tbl_block_get(osm_physp_get_pkey_tbl(p_physp), block)); - - cl_qlist_insert_tail(p_ctxt->p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_pkey_check_physp(IN osm_sa_t * sa, IN osm_physp_t * p_physp, - osm_pkey_search_ctxt_t * p_ctxt) -{ - ib_net64_t comp_mask = p_ctxt->comp_mask; - uint16_t block, num_blocks; - - OSM_LOG_ENTER(sa->p_log); - - /* we got here with the phys port - all is left is to get the right block */ - if (comp_mask & IB_PKEY_COMPMASK_BLOCK) { - sa_pkey_create(sa, p_physp, p_ctxt, p_ctxt->block_num); - } else { - num_blocks = - osm_pkey_tbl_get_num_blocks(osm_physp_get_pkey_tbl - (p_physp)); - for (block = 0; block < num_blocks; block++) - sa_pkey_create(sa, p_physp, p_ctxt, block); - } - - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_pkey_by_comp_mask(IN osm_sa_t * sa, IN const osm_port_t * p_port, - osm_pkey_search_ctxt_t * p_ctxt) -{ - const ib_pkey_table_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - osm_physp_t *p_physp; - uint8_t port_num; - uint8_t num_ports; - const osm_physp_t *p_req_physp; - - OSM_LOG_ENTER(sa->p_log); - - p_rcvd_rec = p_ctxt->p_rcvd_rec; - comp_mask = p_ctxt->comp_mask; - port_num = p_rcvd_rec->port_num; - p_req_physp = p_ctxt->p_req_physp; - - /* if this is a switch port we can search all ports - otherwise we must be looking on port 0 */ - if (p_port->p_node->node_info.node_type != IB_NODE_TYPE_SWITCH) { - /* we put it in the comp mask and port num */ - port_num = p_port->p_physp->port_num; - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Using Physical Default Port Number: 0x%X (for End Node)\n", - port_num); - comp_mask |= IB_PKEY_COMPMASK_PORT; - } - - if (comp_mask & IB_PKEY_COMPMASK_PORT) { - if (port_num < osm_node_get_num_physp(p_port->p_node)) { - p_physp = - osm_node_get_physp_ptr(p_port->p_node, port_num); - /* Check that the p_physp is valid, and that is shares a pkey - with the p_req_physp. */ - if (p_physp && - osm_physp_share_pkey(sa->p_log, p_req_physp, - p_physp)) - sa_pkey_check_physp(sa, p_physp, p_ctxt); - } else { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4603: " - "Given Physical Port Number: 0x%X is out of range should be < 0x%X\n", - port_num, - osm_node_get_num_physp(p_port->p_node)); - goto Exit; - } - } else { - num_ports = osm_node_get_num_physp(p_port->p_node); - for (port_num = 0; port_num < num_ports; port_num++) { - p_physp = - osm_node_get_physp_ptr(p_port->p_node, port_num); - if (!p_physp) - continue; - - /* if the requester and the p_physp don't share a pkey - - continue */ - if (!osm_physp_share_pkey - (sa->p_log, p_req_physp, p_physp)) - continue; - - sa_pkey_check_physp(sa, p_physp, p_ctxt); - } - } -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_pkey_by_comp_mask_cb(IN cl_map_item_t * p_map_item, IN void *cxt) -{ - const osm_port_t *p_port = (osm_port_t *) p_map_item; - osm_pkey_search_ctxt_t *p_ctxt = cxt; - - sa_pkey_by_comp_mask(p_ctxt->sa, p_port, p_ctxt); -} - -void osm_pkey_rec_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *p_rcvd_mad; - const ib_pkey_table_record_t *p_rcvd_rec; - const osm_port_t *p_port = NULL; - const ib_pkey_table_t *p_pkey; - cl_qlist_t rec_list; - osm_pkey_search_ctxt_t context; - ib_net64_t comp_mask; - osm_physp_t *p_req_physp; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_rcvd_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = - (ib_pkey_table_record_t *) ib_sa_mad_get_payload_ptr(p_rcvd_mad); - comp_mask = p_rcvd_mad->comp_mask; - - CL_ASSERT(p_rcvd_mad->attr_id == IB_MAD_ATTR_PKEY_TBL_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (p_rcvd_mad->method != IB_MAD_METHOD_GET && - p_rcvd_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4605: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_rcvd_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* - p922 - P_KeyTableRecords shall only be provided in response - to trusted requests. - Check that the requester is a trusted one. - */ - if (p_rcvd_mad->sm_key != sa->p_subn->opt.sa_key) { - /* This is not a trusted requester! */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4608: " - "Request from non-trusted requester: " - "Given SM_Key:0x%016" PRIx64 "\n", - cl_ntoh64(p_rcvd_mad->sm_key)); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4604: " - "Cannot find requester physical port\n"); - goto Exit; - } - - p_pkey = ib_sa_mad_get_payload_ptr(p_rcvd_mad); - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = p_rcvd_mad->comp_mask; - context.sa = sa; - context.block_num = p_rcvd_rec->block_num; - context.p_req_physp = p_req_physp; - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Got Query Lid:%u(%02X), Block:0x%02X(%02X), Port:0x%02X(%02X)\n", - cl_ntoh16(p_rcvd_rec->lid), - (comp_mask & IB_PKEY_COMPMASK_LID) != 0, p_rcvd_rec->port_num, - (comp_mask & IB_PKEY_COMPMASK_PORT) != 0, p_rcvd_rec->block_num, - (comp_mask & IB_PKEY_COMPMASK_BLOCK) != 0); - - cl_plock_acquire(sa->p_lock); - - /* - If the user specified a LID, it obviously narrows our - work load, since we don't have to search every port - */ - if (comp_mask & IB_PKEY_COMPMASK_LID) { - p_port = osm_get_port_by_lid(sa->p_subn, p_rcvd_rec->lid); - if (!p_port) - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 460B: " - "No port found with LID %u\n", - cl_ntoh16(p_rcvd_rec->lid)); - else - sa_pkey_by_comp_mask(sa, p_port, &context); - } else - cl_qmap_apply_func(&sa->p_subn->port_guid_tbl, - sa_pkey_by_comp_mask_cb, &context); - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_pkey_table_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_portinfo_record.c b/branches/opensm_3/user/opensm/osm_sa_portinfo_record.c deleted file mode 100644 index 8702d6bd..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_portinfo_record.c +++ /dev/null @@ -1,539 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_pir_rcv_t. - * This object represents the PortInfoRecord Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_pir_item { - cl_list_item_t list_item; - ib_portinfo_record_t rec; -} osm_pir_item_t; - -typedef struct osm_pir_search_ctxt { - const ib_portinfo_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; - boolean_t is_enhanced_comp_mask; -} osm_pir_search_ctxt_t; - -static ib_api_status_t pir_rcv_new_pir(IN osm_sa_t * sa, - IN const osm_physp_t * p_physp, - IN cl_qlist_t * p_list, - IN ib_net16_t const lid) -{ - osm_pir_item_t *p_rec_item; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2102: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New PortInfoRecord: port 0x%016" PRIx64 - ", lid %u, port %u\n", - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - cl_ntoh16(lid), osm_physp_get_port_num(p_physp)); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = lid; - p_rec_item->rec.port_info = p_physp->port_info; - p_rec_item->rec.port_num = osm_physp_get_port_num(p_physp); - - cl_qlist_insert_tail(p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void sa_pir_create(IN osm_sa_t * sa, IN const osm_physp_t * p_physp, - IN osm_pir_search_ctxt_t * p_ctxt) -{ - uint8_t lmc; - uint16_t max_lid_ho; - uint16_t base_lid_ho; - uint16_t match_lid_ho; - osm_physp_t *p_node_physp; - - OSM_LOG_ENTER(sa->p_log); - - if (p_physp->p_node->sw) { - p_node_physp = osm_node_get_physp_ptr(p_physp->p_node, 0); - base_lid_ho = cl_ntoh16(osm_physp_get_base_lid(p_node_physp)); - lmc = - osm_switch_sp0_is_lmc_capable(p_physp->p_node->sw, - sa->p_subn) ? - osm_physp_get_lmc(p_node_physp) : 0; - } else { - lmc = osm_physp_get_lmc(p_physp); - base_lid_ho = cl_ntoh16(osm_physp_get_base_lid(p_physp)); - } - max_lid_ho = (uint16_t) (base_lid_ho + (1 << lmc) - 1); - - if (p_ctxt->comp_mask & IB_PIR_COMPMASK_LID) { - match_lid_ho = cl_ntoh16(p_ctxt->p_rcvd_rec->lid); - - /* - We validate that the lid belongs to this node. - */ - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Comparing LID: %u <= %u <= %u\n", - base_lid_ho, match_lid_ho, max_lid_ho); - - if (match_lid_ho < base_lid_ho || match_lid_ho > max_lid_ho) - goto Exit; - } - - pir_rcv_new_pir(sa, p_physp, p_ctxt->p_list, cl_hton16(base_lid_ho)); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_pir_check_physp(IN osm_sa_t * sa, IN const osm_physp_t * p_physp, - osm_pir_search_ctxt_t * p_ctxt) -{ - const ib_portinfo_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - const ib_port_info_t *p_comp_pi; - const ib_port_info_t *p_pi; - - OSM_LOG_ENTER(sa->p_log); - - p_rcvd_rec = p_ctxt->p_rcvd_rec; - comp_mask = p_ctxt->comp_mask; - p_comp_pi = &p_rcvd_rec->port_info; - p_pi = &p_physp->port_info; - - osm_dump_port_info(sa->p_log, osm_node_get_node_guid(p_physp->p_node), - p_physp->port_guid, p_physp->port_num, - &p_physp->port_info, OSM_LOG_DEBUG); - - /* We have to re-check the base_lid, since if the given - base_lid in p_pi is zero - we are comparing on all ports. */ - if (comp_mask & IB_PIR_COMPMASK_BASELID) { - if (p_comp_pi->base_lid != p_pi->base_lid) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_MKEY) { - if (p_comp_pi->m_key != p_pi->m_key) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_GIDPRE) { - if (p_comp_pi->subnet_prefix != p_pi->subnet_prefix) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_SMLID) { - if (p_comp_pi->master_sm_base_lid != p_pi->master_sm_base_lid) - goto Exit; - } - - /* IBTA 1.2 errata provides support for bitwise compare if the bit 31 - of the attribute modifier of the Get/GetTable is set */ - if (comp_mask & IB_PIR_COMPMASK_CAPMASK) { - if (p_ctxt->is_enhanced_comp_mask) { - if ((p_comp_pi->capability_mask & p_pi-> - capability_mask) != p_comp_pi->capability_mask) - goto Exit; - } else { - if (p_comp_pi->capability_mask != p_pi->capability_mask) - goto Exit; - } - } - - if (comp_mask & IB_PIR_COMPMASK_DIAGCODE) { - if (p_comp_pi->diag_code != p_pi->diag_code) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_MKEYLEASEPRD) { - if (p_comp_pi->m_key_lease_period != p_pi->m_key_lease_period) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LOCALPORTNUM) { - if (p_comp_pi->local_port_num != p_pi->local_port_num) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LNKWIDTHSUPPORT) { - if (p_comp_pi->link_width_supported != - p_pi->link_width_supported) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LNKWIDTHACTIVE) { - if (p_comp_pi->link_width_active != p_pi->link_width_active) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LINKWIDTHENABLED) { - if (p_comp_pi->link_width_enabled != p_pi->link_width_enabled) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LNKSPEEDSUPPORT) { - if (ib_port_info_get_link_speed_sup(p_comp_pi) != - ib_port_info_get_link_speed_sup(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_PORTSTATE) { - if (ib_port_info_get_port_state(p_comp_pi) != - ib_port_info_get_port_state(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_PORTPHYSTATE) { - if (ib_port_info_get_port_phys_state(p_comp_pi) != - ib_port_info_get_port_phys_state(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LINKDWNDFLTSTATE) { - if (ib_port_info_get_link_down_def_state(p_comp_pi) != - ib_port_info_get_link_down_def_state(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_MKEYPROTBITS) { - if (ib_port_info_get_mpb(p_comp_pi) != - ib_port_info_get_mpb(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LMC) { - if (ib_port_info_get_lmc(p_comp_pi) != - ib_port_info_get_lmc(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LINKSPEEDACTIVE) { - if (ib_port_info_get_link_speed_active(p_comp_pi) != - ib_port_info_get_link_speed_active(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LINKSPEEDENABLE) { - if (ib_port_info_get_link_speed_enabled(p_comp_pi) != - ib_port_info_get_link_speed_enabled(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_NEIGHBORMTU) { - if (ib_port_info_get_neighbor_mtu(p_comp_pi) != - ib_port_info_get_neighbor_mtu(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_MASTERSMSL) { - if (ib_port_info_get_master_smsl(p_comp_pi) != - ib_port_info_get_master_smsl(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_VLCAP) { - if (ib_port_info_get_vl_cap(p_comp_pi) != - ib_port_info_get_vl_cap(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_INITTYPE) { - if (ib_port_info_get_init_type(p_comp_pi) != - ib_port_info_get_init_type(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_VLHIGHLIMIT) { - if (p_comp_pi->vl_high_limit != p_pi->vl_high_limit) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_VLARBHIGHCAP) { - if (p_comp_pi->vl_arb_high_cap != p_pi->vl_arb_high_cap) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_VLARBLOWCAP) { - if (p_comp_pi->vl_arb_low_cap != p_pi->vl_arb_low_cap) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_MTUCAP) { - if (ib_port_info_get_mtu_cap(p_comp_pi) != - ib_port_info_get_mtu_cap(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_VLSTALLCNT) { - if (ib_port_info_get_vl_stall_count(p_comp_pi) != - ib_port_info_get_vl_stall_count(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_HOQLIFE) { - if ((p_comp_pi->vl_stall_life & 0x1F) != - (p_pi->vl_stall_life & 0x1F)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_OPVLS) { - if ((p_comp_pi->vl_enforce & 0xF0) != (p_pi->vl_enforce & 0xF0)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_PARENFIN) { - if ((p_comp_pi->vl_enforce & 0x08) != (p_pi->vl_enforce & 0x08)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_PARENFOUT) { - if ((p_comp_pi->vl_enforce & 0x04) != (p_pi->vl_enforce & 0x04)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_FILTERRAWIN) { - if ((p_comp_pi->vl_enforce & 0x02) != (p_pi->vl_enforce & 0x02)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_FILTERRAWOUT) { - if ((p_comp_pi->vl_enforce & 0x01) != (p_pi->vl_enforce & 0x01)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_MKEYVIO) { - if (p_comp_pi->m_key_violations != p_pi->m_key_violations) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_PKEYVIO) { - if (p_comp_pi->p_key_violations != p_pi->p_key_violations) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_QKEYVIO) { - if (p_comp_pi->q_key_violations != p_pi->q_key_violations) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_GUIDCAP) { - if (p_comp_pi->guid_cap != p_pi->guid_cap) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_SUBNTO) { - if (ib_port_info_get_timeout(p_comp_pi) != - ib_port_info_get_timeout(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_RESPTIME) { - if ((p_comp_pi->resp_time_value & 0x1F) != - (p_pi->resp_time_value & 0x1F)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_LOCALPHYERR) { - if (ib_port_info_get_local_phy_err_thd(p_comp_pi) != - ib_port_info_get_local_phy_err_thd(p_pi)) - goto Exit; - } - if (comp_mask & IB_PIR_COMPMASK_OVERRUNERR) { - if (ib_port_info_get_overrun_err_thd(p_comp_pi) != - ib_port_info_get_overrun_err_thd(p_pi)) - goto Exit; - } - - sa_pir_create(sa, p_physp, p_ctxt); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_pir_by_comp_mask(IN osm_sa_t * sa, IN osm_node_t * p_node, - osm_pir_search_ctxt_t * p_ctxt) -{ - const ib_portinfo_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - const osm_physp_t *p_physp; - uint8_t port_num; - uint8_t num_ports; - const osm_physp_t *p_req_physp; - - OSM_LOG_ENTER(sa->p_log); - - p_rcvd_rec = p_ctxt->p_rcvd_rec; - comp_mask = p_ctxt->comp_mask; - p_req_physp = p_ctxt->p_req_physp; - - num_ports = osm_node_get_num_physp(p_node); - - if (comp_mask & IB_PIR_COMPMASK_PORTNUM) { - if (p_rcvd_rec->port_num < num_ports) { - p_physp = - osm_node_get_physp_ptr(p_node, - p_rcvd_rec->port_num); - /* Check that the p_physp is valid, and that the - p_physp and the p_req_physp share a pkey. */ - if (p_physp && - osm_physp_share_pkey(sa->p_log, p_req_physp, - p_physp)) - sa_pir_check_physp(sa, p_physp, p_ctxt); - } - } else { - for (port_num = 0; port_num < num_ports; port_num++) { - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_physp) - continue; - - /* if the requester and the p_physp don't share a pkey - - continue */ - if (!osm_physp_share_pkey - (sa->p_log, p_req_physp, p_physp)) - continue; - - sa_pir_check_physp(sa, p_physp, p_ctxt); - } - } - - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_pir_by_comp_mask_cb(IN cl_map_item_t * p_map_item, IN void *cxt) -{ - osm_node_t *p_node = (osm_node_t *) p_map_item; - osm_pir_search_ctxt_t *p_ctxt = cxt; - - sa_pir_by_comp_mask(p_ctxt->sa, p_node, p_ctxt); -} - -void osm_pir_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *p_rcvd_mad; - const ib_portinfo_record_t *p_rcvd_rec; - const osm_port_t *p_port = NULL; - const ib_port_info_t *p_pi; - cl_qlist_t rec_list; - osm_pir_search_ctxt_t context; - ib_net64_t comp_mask; - osm_physp_t *p_req_physp; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_rcvd_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = - (ib_portinfo_record_t *) ib_sa_mad_get_payload_ptr(p_rcvd_mad); - comp_mask = p_rcvd_mad->comp_mask; - - CL_ASSERT(p_rcvd_mad->attr_id == IB_MAD_ATTR_PORTINFO_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (p_rcvd_mad->method != IB_MAD_METHOD_GET && - p_rcvd_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2105: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_rcvd_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2104: " - "Cannot find requester physical port\n"); - goto Exit; - } - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_portinfo_record(sa->p_log, p_rcvd_rec, OSM_LOG_DEBUG); - - p_pi = &p_rcvd_rec->port_info; - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = p_rcvd_mad->comp_mask; - context.sa = sa; - context.p_req_physp = p_req_physp; - context.is_enhanced_comp_mask = - cl_ntoh32(p_rcvd_mad->attr_mod) & (1 << 31); - - cl_plock_acquire(sa->p_lock); - - /* - If the user specified a LID, it obviously narrows our - work load, since we don't have to search every port - */ - if (comp_mask & (IB_PIR_COMPMASK_LID | IB_PIR_COMPMASK_BASELID)) { - p_port = osm_get_port_by_lid(sa->p_subn, p_rcvd_rec->lid); - if (p_port) - sa_pir_by_comp_mask(sa, p_port->p_node, &context); - else - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2109: " - "No port found with LID %u\n", - cl_ntoh16(p_rcvd_rec->lid)); - } else - cl_qmap_apply_func(&sa->p_subn->node_guid_tbl, - sa_pir_by_comp_mask_cb, &context); - - cl_plock_release(sa->p_lock); - - /* - p922 - The M_Key returned shall be zero, except in the case of a - trusted request. - Note: In the mad controller we check that the SM_Key received on - the mad is valid. Meaning - is either zero or equal to the local - sm_key. - */ - if (!p_rcvd_mad->sm_key) { - osm_pir_item_t *item; - for (item = (osm_pir_item_t *) cl_qlist_head(&rec_list); - item != (osm_pir_item_t *) cl_qlist_end(&rec_list); - item = (osm_pir_item_t *) cl_qlist_next(&item->list_item)) - item->rec.port_info.m_key = 0; - } - - osm_sa_respond(sa, p_madw, sizeof(ib_portinfo_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_service_record.c b/branches/opensm_3/user/opensm/osm_sa_service_record.c deleted file mode 100644 index e007e020..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_service_record.c +++ /dev/null @@ -1,800 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_sr_rcv_t. - * This object represents the ServiceRecord Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_sr_item { - cl_list_item_t list_item; - ib_service_record_t service_rec; -} osm_sr_item_t; - -typedef struct osm_sr_match_item { - cl_qlist_t sr_list; - ib_service_record_t *p_service_rec; - ib_net64_t comp_mask; - osm_sa_t *sa; -} osm_sr_match_item_t; - -typedef struct osm_sr_search_ctxt { - osm_sr_match_item_t *p_sr_item; - const osm_physp_t *p_req_physp; -} osm_sr_search_ctxt_t; - -static boolean_t -match_service_pkey_with_ports_pkey(IN osm_sa_t * sa, - IN const osm_madw_t * p_madw, - ib_service_record_t * p_service_rec, - ib_net64_t const comp_mask) -{ - boolean_t valid = TRUE; - osm_physp_t *p_req_physp; - ib_net64_t service_guid; - osm_port_t *service_port; - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2404: " - "Cannot find requester physical port\n"); - valid = FALSE; - goto Exit; - } - - if ((comp_mask & IB_SR_COMPMASK_SPKEY) == IB_SR_COMPMASK_SPKEY) { - /* We have a ServiceP_Key - check matching on requester port, and - ServiceGid port (if such exists) */ - /* Make sure it matches the p_req_physp */ - if (!osm_physp_has_pkey - (sa->p_log, p_service_rec->service_pkey, p_req_physp)) { - valid = FALSE; - goto Exit; - } - - /* Make sure it matches the port of the ServiceGid */ - if ((comp_mask & IB_SR_COMPMASK_SGID) == IB_SR_COMPMASK_SGID) { - service_guid = - p_service_rec->service_gid.unicast.interface_id; - service_port = - osm_get_port_by_guid(sa->p_subn, service_guid); - if (!service_port) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2405: " - "No port object for port 0x%016" PRIx64 - "\n", cl_ntoh64(service_guid)); - valid = FALSE; - goto Exit; - } - /* check on the table of the default physical port of the service port */ - if (!osm_physp_has_pkey(sa->p_log, - p_service_rec->service_pkey, - service_port->p_physp)) { - valid = FALSE; - goto Exit; - } - } - } - -Exit: - return valid; -} - -static boolean_t -match_name_to_key_association(IN osm_sa_t * sa, - ib_service_record_t * p_service_rec, - ib_net64_t comp_mask) -{ - UNUSED_PARAM(p_service_rec); - UNUSED_PARAM(sa); - - if ((comp_mask & (IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME)) == - (IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME)) { - /* For now, we are not maintaining the ServiceAssociation record - * so just return TRUE - */ - return TRUE; - } - - return TRUE; -} - -static boolean_t validate_sr(IN osm_sa_t * sa, IN const osm_madw_t * p_madw) -{ - boolean_t valid = TRUE; - ib_sa_mad_t *p_sa_mad; - ib_service_record_t *p_recvd_service_rec; - - OSM_LOG_ENTER(sa->p_log); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_recvd_service_rec = - (ib_service_record_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - - valid = match_service_pkey_with_ports_pkey(sa, p_madw, - p_recvd_service_rec, - p_sa_mad->comp_mask); - if (!valid) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "No Match for Service Pkey\n"); - valid = FALSE; - goto Exit; - } - - valid = match_name_to_key_association(sa, p_recvd_service_rec, - p_sa_mad->comp_mask); - if (!valid) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Service Record Name to key matching failed\n"); - valid = FALSE; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(sa->p_log); - return valid; -} - -static void sr_rcv_respond(IN osm_sa_t * sa, IN osm_madw_t * p_madw, - IN cl_qlist_t * p_list) -{ - /* p923 - The ServiceKey shall be set to 0, except in the case of - a trusted request. - Note: In the mad controller we check that the SM_Key received on - the mad is valid. Meaning - is either zero or equal to the local - sm_key. - */ - if (!osm_madw_get_sa_mad_ptr(p_madw)->sm_key) { - osm_sr_item_t *item; - for (item = (osm_sr_item_t *) cl_qlist_head(p_list); - item != (osm_sr_item_t *) cl_qlist_end(p_list); - item = (osm_sr_item_t *) cl_qlist_next(&item->list_item)) - memset(item->service_rec.service_key, 0, - sizeof(item->service_rec.service_key)); - } - - osm_sa_respond(sa, p_madw, sizeof(ib_service_record_t), p_list); -} - -static void get_matching_sr(IN cl_list_item_t * p_list_item, IN void *context) -{ - osm_sr_search_ctxt_t *p_ctxt = context; - osm_svcr_t *p_svcr = (osm_svcr_t *) p_list_item; - osm_sr_item_t *p_sr_pool_item; - osm_sr_match_item_t *p_sr_item = p_ctxt->p_sr_item; - ib_net64_t comp_mask = p_sr_item->comp_mask; - const osm_physp_t *p_req_physp = p_ctxt->p_req_physp; - - if ((comp_mask & IB_SR_COMPMASK_SID) == IB_SR_COMPMASK_SID) { - if (p_sr_item->p_service_rec->service_id != - p_svcr->service_record.service_id) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SGID) == IB_SR_COMPMASK_SGID) { - if (memcmp(&p_sr_item->p_service_rec->service_gid, - &p_svcr->service_record.service_gid, - sizeof(p_svcr->service_record.service_gid)) != 0) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SPKEY) == IB_SR_COMPMASK_SPKEY) { - if (p_sr_item->p_service_rec->service_pkey != - p_svcr->service_record.service_pkey) - return; - } - - if ((comp_mask & IB_SR_COMPMASK_SKEY) == IB_SR_COMPMASK_SKEY) { - if (memcmp(p_sr_item->p_service_rec->service_key, - p_svcr->service_record.service_key, - 16 * sizeof(uint8_t))) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SNAME) == IB_SR_COMPMASK_SNAME) { - if (memcmp(p_sr_item->p_service_rec->service_name, - p_svcr->service_record.service_name, - sizeof(p_svcr->service_record.service_name)) != 0) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA8_0) == IB_SR_COMPMASK_SDATA8_0) { - if (p_sr_item->p_service_rec->service_data8[0] != - p_svcr->service_record.service_data8[0]) - return; - } - - if ((comp_mask & IB_SR_COMPMASK_SDATA8_1) == IB_SR_COMPMASK_SDATA8_1) { - if (p_sr_item->p_service_rec->service_data8[1] != - p_svcr->service_record.service_data8[1]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA8_2) == IB_SR_COMPMASK_SDATA8_2) { - if (p_sr_item->p_service_rec->service_data8[2] != - p_svcr->service_record.service_data8[2]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA8_3) == IB_SR_COMPMASK_SDATA8_3) { - if (p_sr_item->p_service_rec->service_data8[3] != - p_svcr->service_record.service_data8[3]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA8_4) == IB_SR_COMPMASK_SDATA8_4) { - if (p_sr_item->p_service_rec->service_data8[4] != - p_svcr->service_record.service_data8[4]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA8_5) == IB_SR_COMPMASK_SDATA8_5) { - if (p_sr_item->p_service_rec->service_data8[5] != - p_svcr->service_record.service_data8[5]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA8_6) == IB_SR_COMPMASK_SDATA8_6) { - if (p_sr_item->p_service_rec->service_data8[6] != - p_svcr->service_record.service_data8[6]) - return; - } - - if ((comp_mask & IB_SR_COMPMASK_SDATA8_7) == IB_SR_COMPMASK_SDATA8_7) { - if (p_sr_item->p_service_rec->service_data8[7] != - p_svcr->service_record.service_data8[7]) - return; - } - - if ((comp_mask & IB_SR_COMPMASK_SDATA8_8) == IB_SR_COMPMASK_SDATA8_8) { - if (p_sr_item->p_service_rec->service_data8[8] != - p_svcr->service_record.service_data8[8]) - return; - } - - if ((comp_mask & IB_SR_COMPMASK_SDATA8_9) == IB_SR_COMPMASK_SDATA8_9) { - if (p_sr_item->p_service_rec->service_data8[9] != - p_svcr->service_record.service_data8[9]) - return; - } - - if ((comp_mask & IB_SR_COMPMASK_SDATA8_10) == IB_SR_COMPMASK_SDATA8_10) { - if (p_sr_item->p_service_rec->service_data8[10] != - p_svcr->service_record.service_data8[10]) - return; - } - - if ((comp_mask & IB_SR_COMPMASK_SDATA8_11) == IB_SR_COMPMASK_SDATA8_11) { - if (p_sr_item->p_service_rec->service_data8[11] != - p_svcr->service_record.service_data8[11]) - return; - } - - if ((comp_mask & IB_SR_COMPMASK_SDATA8_12) == IB_SR_COMPMASK_SDATA8_12) { - if (p_sr_item->p_service_rec->service_data8[12] != - p_svcr->service_record.service_data8[12]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA8_13) == IB_SR_COMPMASK_SDATA8_13) { - if (p_sr_item->p_service_rec->service_data8[13] != - p_svcr->service_record.service_data8[13]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA8_14) == IB_SR_COMPMASK_SDATA8_14) { - if (p_sr_item->p_service_rec->service_data8[14] != - p_svcr->service_record.service_data8[14]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA8_15) == IB_SR_COMPMASK_SDATA8_15) { - if (p_sr_item->p_service_rec->service_data8[15] != - p_svcr->service_record.service_data8[15]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA16_0) == IB_SR_COMPMASK_SDATA16_0) { - if (p_sr_item->p_service_rec->service_data16[0] != - p_svcr->service_record.service_data16[0]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA16_1) == IB_SR_COMPMASK_SDATA16_1) { - if (p_sr_item->p_service_rec->service_data16[1] != - p_svcr->service_record.service_data16[1]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA16_2) == IB_SR_COMPMASK_SDATA16_2) { - if (p_sr_item->p_service_rec->service_data16[2] != - p_svcr->service_record.service_data16[2]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA16_3) == IB_SR_COMPMASK_SDATA16_3) { - if (p_sr_item->p_service_rec->service_data16[3] != - p_svcr->service_record.service_data16[3]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA16_4) == IB_SR_COMPMASK_SDATA16_4) { - if (p_sr_item->p_service_rec->service_data16[4] != - p_svcr->service_record.service_data16[4]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA16_5) == IB_SR_COMPMASK_SDATA16_5) { - if (p_sr_item->p_service_rec->service_data16[5] != - p_svcr->service_record.service_data16[5]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA16_6) == IB_SR_COMPMASK_SDATA16_6) { - if (p_sr_item->p_service_rec->service_data16[6] != - p_svcr->service_record.service_data16[6]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA16_7) == IB_SR_COMPMASK_SDATA16_7) { - if (p_sr_item->p_service_rec->service_data16[7] != - p_svcr->service_record.service_data16[7]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA32_0) == IB_SR_COMPMASK_SDATA32_0) { - if (p_sr_item->p_service_rec->service_data32[0] != - p_svcr->service_record.service_data32[0]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA32_1) == IB_SR_COMPMASK_SDATA32_1) { - if (p_sr_item->p_service_rec->service_data32[1] != - p_svcr->service_record.service_data32[1]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA32_2) == IB_SR_COMPMASK_SDATA32_2) { - if (p_sr_item->p_service_rec->service_data32[2] != - p_svcr->service_record.service_data32[2]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA32_3) == IB_SR_COMPMASK_SDATA32_3) { - if (p_sr_item->p_service_rec->service_data32[3] != - p_svcr->service_record.service_data32[3]) - return; - } - - if ((comp_mask & IB_SR_COMPMASK_SDATA64_0) == IB_SR_COMPMASK_SDATA64_0) { - if (p_sr_item->p_service_rec->service_data64[0] != - p_svcr->service_record.service_data64[0]) - return; - } - if ((comp_mask & IB_SR_COMPMASK_SDATA64_1) == IB_SR_COMPMASK_SDATA64_1) { - if (p_sr_item->p_service_rec->service_data64[1] != - p_svcr->service_record.service_data64[1]) - return; - } - - /* Check that the requester port has the pkey which is the service_pkey. - If not - then it cannot receive this ServiceRecord. */ - /* The check is relevant only if the service_pkey is valid */ - if (!ib_pkey_is_invalid(p_svcr->service_record.service_pkey)) { - if (!osm_physp_has_pkey(p_sr_item->sa->p_log, - p_svcr->service_record.service_pkey, - p_req_physp)) { - OSM_LOG(p_sr_item->sa->p_log, OSM_LOG_VERBOSE, - "requester port doesn't have the service_pkey: 0x%X\n", - cl_ntoh16(p_svcr->service_record.service_pkey)); - return; - } - } - - p_sr_pool_item = malloc(sizeof(*p_sr_pool_item)); - if (p_sr_pool_item == NULL) { - OSM_LOG(p_sr_item->sa->p_log, OSM_LOG_ERROR, "ERR 2408: " - "Unable to acquire Service Record from pool\n"); - goto Exit; - } - - p_sr_pool_item->service_rec = p_svcr->service_record; - - cl_qlist_insert_tail(&p_sr_item->sr_list, &p_sr_pool_item->list_item); - -Exit: - return; -} - -static void sr_rcv_process_get_method(osm_sa_t * sa, IN osm_madw_t * p_madw) -{ - ib_sa_mad_t *p_sa_mad; - ib_service_record_t *p_recvd_service_rec; - osm_sr_match_item_t sr_match_item; - osm_sr_search_ctxt_t context; - osm_physp_t *p_req_physp; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2409: " - "Cannot find requester physical port\n"); - goto Exit; - } - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_recvd_service_rec = - (ib_service_record_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_service_record(sa->p_log, p_recvd_service_rec, - OSM_LOG_DEBUG); - - cl_qlist_init(&sr_match_item.sr_list); - sr_match_item.p_service_rec = p_recvd_service_rec; - sr_match_item.comp_mask = p_sa_mad->comp_mask; - sr_match_item.sa = sa; - - context.p_sr_item = &sr_match_item; - context.p_req_physp = p_req_physp; - - /* Grab the lock */ - cl_plock_excl_acquire(sa->p_lock); - - cl_qlist_apply_func(&sa->p_subn->sa_sr_list, get_matching_sr, &context); - - cl_plock_release(sa->p_lock); - - if (p_sa_mad->method == IB_MAD_METHOD_GET && - cl_qlist_count(&sr_match_item.sr_list) == 0) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "No records matched the Service Record query\n"); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_NO_RECORDS); - goto Exit; - } - - sr_rcv_respond(sa, p_madw, &sr_match_item.sr_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return; -} - -static void sr_rcv_process_set_method(osm_sa_t * sa, IN osm_madw_t * p_madw) -{ - ib_sa_mad_t *p_sa_mad; - ib_service_record_t *p_recvd_service_rec; - ib_net64_t comp_mask; - osm_svcr_t *p_svcr; - osm_sr_item_t *p_sr_item; - cl_qlist_t sr_list; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_recvd_service_rec = - (ib_service_record_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - - comp_mask = p_sa_mad->comp_mask; - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_service_record(sa->p_log, p_recvd_service_rec, - OSM_LOG_DEBUG); - - if ((comp_mask & (IB_SR_COMPMASK_SID | IB_SR_COMPMASK_SGID)) != - (IB_SR_COMPMASK_SID | IB_SR_COMPMASK_SGID)) { - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "Component Mask RID check failed for METHOD_SET\n"); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - - /* if we were not provided with a service lease make it - infinite */ - if ((comp_mask & IB_SR_COMPMASK_SLEASE) != IB_SR_COMPMASK_SLEASE) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "ServiceLease Component Mask not set - using infinite lease\n"); - p_recvd_service_rec->service_lease = 0xFFFFFFFF; - } - - /* Grab the lock */ - cl_plock_excl_acquire(sa->p_lock); - - /* If Record exists with matching RID */ - p_svcr = osm_svcr_get_by_rid(sa->p_subn, sa->p_log, - p_recvd_service_rec); - - if (p_svcr == NULL) { - /* Create the instance of the osm_svcr_t object */ - p_svcr = osm_svcr_new(p_recvd_service_rec); - if (p_svcr == NULL) { - cl_plock_release(sa->p_lock); - - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2411: " - "osm_svcr_get_by_rid failed\n"); - - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_NO_RESOURCES); - goto Exit; - } - - /* Add this new osm_svcr_t object to subnet object */ - osm_svcr_insert_to_db(sa->p_subn, sa->p_log, p_svcr); - - } else /* Update the old instance of the osm_svcr_t object */ - osm_svcr_init(p_svcr, p_recvd_service_rec); - - cl_plock_release(sa->p_lock); - - if (p_recvd_service_rec->service_lease != 0xFFFFFFFF) { -#if 0 - cl_timer_trim(&sa->sr_timer, - p_recvd_service_rec->service_lease * 1000); -#endif - /* This was a bug since no check was made to see if too long */ - /* just make sure the timer works - get a call back within a second */ - cl_timer_trim(&sa->sr_timer, 1000); - p_svcr->modified_time = cl_get_time_stamp_sec(); - } - - p_sr_item = malloc(sizeof(*p_sr_item)); - if (p_sr_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2412: " - "Unable to acquire Service record\n"); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_NO_RESOURCES); - goto Exit; - } - - if ((comp_mask & IB_SR_COMPMASK_SPKEY) != IB_SR_COMPMASK_SPKEY) - /* Set the Default Service P_Key in the response */ - p_recvd_service_rec->service_pkey = IB_DEFAULT_PKEY; - - p_sr_item->service_rec = *p_recvd_service_rec; - cl_qlist_init(&sr_list); - - cl_qlist_insert_tail(&sr_list, &p_sr_item->list_item); - - sr_rcv_respond(sa, p_madw, &sr_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sr_rcv_process_delete_method(osm_sa_t * sa, IN osm_madw_t * p_madw) -{ - ib_sa_mad_t *p_sa_mad; - ib_service_record_t *p_recvd_service_rec; - ib_net64_t comp_mask; - osm_svcr_t *p_svcr; - osm_sr_item_t *p_sr_item; - cl_qlist_t sr_list; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_recvd_service_rec = - (ib_service_record_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); - - comp_mask = p_sa_mad->comp_mask; - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_service_record(sa->p_log, p_recvd_service_rec, - OSM_LOG_DEBUG); - - /* Grab the lock */ - cl_plock_excl_acquire(sa->p_lock); - - /* If Record exists with matching RID */ - p_svcr = osm_svcr_get_by_rid(sa->p_subn, sa->p_log, - p_recvd_service_rec); - - if (p_svcr == NULL) { - cl_plock_release(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "No records matched the RID\n"); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_NO_RECORDS); - goto Exit; - } else { - osm_svcr_remove_from_db(sa->p_subn, sa->p_log, p_svcr); - } - - cl_plock_release(sa->p_lock); - - p_sr_item = malloc(sizeof(*p_sr_item)); - if (p_sr_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2413: " - "Unable to acquire Service record\n"); - osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_NO_RESOURCES); - goto Exit; - } - - /* provide back the copy of the record */ - p_sr_item->service_rec = p_svcr->service_record; - cl_qlist_init(&sr_list); - - cl_qlist_insert_tail(&sr_list, &p_sr_item->list_item); - - if (p_svcr) - osm_svcr_delete(p_svcr); - - sr_rcv_respond(sa, p_madw, &sr_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return; -} - -void osm_sr_rcv_process(IN void *context, IN void *data) -{ - osm_sa_t *sa = context; - osm_madw_t *p_madw = data; - ib_sa_mad_t *p_sa_mad; - boolean_t valid; - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - - CL_ASSERT(p_sa_mad->attr_id == IB_MAD_ATTR_SERVICE_RECORD); - - switch (p_sa_mad->method) { - case IB_MAD_METHOD_SET: - valid = validate_sr(sa, p_madw); - if (!valid) { - OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, - "Component Mask check failed for set request\n"); - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - sr_rcv_process_set_method(sa, p_madw); - break; - case IB_MAD_METHOD_DELETE: - valid = validate_sr(sa, p_madw); - if (!valid) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Component Mask check failed for delete request\n"); - osm_sa_send_error(sa, p_madw, - IB_SA_MAD_STATUS_REQ_INVALID); - goto Exit; - } - sr_rcv_process_delete_method(sa, p_madw); - break; - case IB_MAD_METHOD_GET: - case IB_MAD_METHOD_GETTABLE: - sr_rcv_process_get_method(sa, p_madw); - break; - default: - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_sa_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - break; - } - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -void osm_sr_rcv_lease_cb(IN void *context) -{ - osm_sa_t *sa = context; - cl_list_item_t *p_list_item; - cl_list_item_t *p_next_list_item; - osm_svcr_t *p_svcr; - uint32_t curr_time; - uint32_t elapsed_time; - uint32_t trim_time = 20; /* maxiaml timer refresh is 20 seconds */ - - OSM_LOG_ENTER(sa->p_log); - - cl_plock_excl_acquire(sa->p_lock); - - p_list_item = cl_qlist_head(&sa->p_subn->sa_sr_list); - - while (p_list_item != cl_qlist_end(&sa->p_subn->sa_sr_list)) { - p_svcr = (osm_svcr_t *) p_list_item; - - if (p_svcr->service_record.service_lease == 0xFFFFFFFF) { - p_list_item = cl_qlist_next(p_list_item); - continue; - } - - /* current time in seconds */ - curr_time = cl_get_time_stamp_sec(); - /* elapsed time from last modify */ - elapsed_time = curr_time - p_svcr->modified_time; - /* but it can not be less then 1 */ - if (elapsed_time < 1) - elapsed_time = 1; - - if (elapsed_time < p_svcr->lease_period) { - /* - Just update the service lease period - note: for simplicity we work with a uint32_t field - external to the network order lease_period of the MAD - */ - p_svcr->lease_period -= elapsed_time; - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Remaining time for Service Name:%s is:0x%X\n", - p_svcr->service_record.service_name, - p_svcr->lease_period); - - p_svcr->modified_time = curr_time; - - /* Update the trim timer */ - if (trim_time > p_svcr->lease_period) { - trim_time = p_svcr->lease_period; - if (trim_time < 1) - trim_time = 1; - } - - p_list_item = cl_qlist_next(p_list_item); - continue; - - } else { - p_next_list_item = cl_qlist_next(p_list_item); - - /* Remove the service Record */ - osm_svcr_remove_from_db(sa->p_subn, sa->p_log, p_svcr); - - osm_svcr_delete(p_svcr); - - p_list_item = p_next_list_item; - continue; - } - } - - /* Release the Lock */ - cl_plock_release(sa->p_lock); - - if (trim_time != 0xFFFFFFFF) { - cl_timer_trim(&sa->sr_timer, trim_time * 1000); /* Convert to milli seconds */ - } - - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_slvl_record.c b/branches/opensm_3/user/opensm/osm_sa_slvl_record.c deleted file mode 100644 index 5dbbb6a9..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_slvl_record.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_slvl_rec_rcv_t. - * This object represents the SLtoVL Mapping Query Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_slvl_item { - cl_list_item_t list_item; - ib_slvl_table_record_t rec; -} osm_slvl_item_t; - -typedef struct osm_slvl_search_ctxt { - const ib_slvl_table_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - uint8_t in_port_num; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; -} osm_slvl_search_ctxt_t; - -static void sa_slvl_create(IN osm_sa_t * sa, IN const osm_physp_t * p_physp, - IN osm_slvl_search_ctxt_t * p_ctxt, - IN uint8_t in_port_idx) -{ - osm_slvl_item_t *p_rec_item; - uint16_t lid; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2602: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - if (p_physp->p_node->node_info.node_type != IB_NODE_TYPE_SWITCH) - lid = p_physp->port_info.base_lid; - else - lid = osm_node_get_base_lid(p_physp->p_node, 0); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New SLtoVL Map for: OUT port 0x%016" PRIx64 - ", lid 0x%X, port %u to In Port:%u\n", - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - cl_ntoh16(lid), osm_physp_get_port_num(p_physp), in_port_idx); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = lid; - p_rec_item->rec.out_port_num = osm_physp_get_port_num(p_physp); - p_rec_item->rec.in_port_num = in_port_idx; - p_rec_item->rec.slvl_tbl = - *(osm_physp_get_slvl_tbl(p_physp, in_port_idx)); - - cl_qlist_insert_tail(p_ctxt->p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_slvl_by_comp_mask(IN osm_sa_t * sa, IN const osm_port_t * p_port, - osm_slvl_search_ctxt_t * p_ctxt) -{ - const ib_slvl_table_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - const osm_physp_t *p_out_physp, *p_in_physp; - uint8_t in_port_num, out_port_num; - uint8_t num_ports; - uint8_t in_port_start, in_port_end; - uint8_t out_port_start, out_port_end; - const osm_physp_t *p_req_physp; - - OSM_LOG_ENTER(sa->p_log); - - p_rcvd_rec = p_ctxt->p_rcvd_rec; - comp_mask = p_ctxt->comp_mask; - num_ports = osm_node_get_num_physp(p_port->p_node); - in_port_start = 0; - in_port_end = num_ports - 1; - out_port_start = 0; - out_port_end = num_ports - 1; - p_req_physp = p_ctxt->p_req_physp; - - if (p_port->p_node->node_info.node_type != IB_NODE_TYPE_SWITCH) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Using Physical Default Port Number: 0x%X (for End Node)\n", - p_port->p_physp->port_num); - p_out_physp = p_port->p_physp; - /* check that the p_out_physp and the p_req_physp share a pkey */ - if (osm_physp_share_pkey(sa->p_log, p_req_physp, p_out_physp)) - sa_slvl_create(sa, p_out_physp, p_ctxt, 0); - } else { - if (comp_mask & IB_SLVL_COMPMASK_OUT_PORT) - out_port_start = out_port_end = - p_rcvd_rec->out_port_num; - if (comp_mask & IB_SLVL_COMPMASK_IN_PORT) - in_port_start = in_port_end = p_rcvd_rec->in_port_num; - - for (out_port_num = out_port_start; - out_port_num <= out_port_end; out_port_num++) { - p_out_physp = - osm_node_get_physp_ptr(p_port->p_node, - out_port_num); - if (!p_out_physp) - continue; - - for (in_port_num = in_port_start; - in_port_num <= in_port_end; in_port_num++) { -#if 0 - if (out_port_num && out_port_num == in_port_num) - continue; -#endif - - p_in_physp = - osm_node_get_physp_ptr(p_port->p_node, - in_port_num); - if (!p_in_physp) - continue; - - /* if the requester and the p_out_physp don't share a pkey - - continue */ - if (!osm_physp_share_pkey - (sa->p_log, p_req_physp, p_out_physp)) - continue; - - sa_slvl_create(sa, p_out_physp, p_ctxt, - in_port_num); - } - } - } - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_slvl_by_comp_mask_cb(IN cl_map_item_t * p_map_item, IN void *cxt) -{ - const osm_port_t *p_port = (osm_port_t *) p_map_item; - osm_slvl_search_ctxt_t *p_ctxt = cxt; - - sa_slvl_by_comp_mask(p_ctxt->sa, p_port, p_ctxt); -} - -void osm_slvl_rec_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *p_rcvd_mad; - const ib_slvl_table_record_t *p_rcvd_rec; - const osm_port_t *p_port = NULL; - cl_qlist_t rec_list; - osm_slvl_search_ctxt_t context; - ib_api_status_t status = IB_SUCCESS; - ib_net64_t comp_mask; - osm_physp_t *p_req_physp; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - p_rcvd_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = - (ib_slvl_table_record_t *) ib_sa_mad_get_payload_ptr(p_rcvd_mad); - comp_mask = p_rcvd_mad->comp_mask; - - CL_ASSERT(p_rcvd_mad->attr_id == IB_MAD_ATTR_SLVL_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (p_rcvd_mad->method != IB_MAD_METHOD_GET && - p_rcvd_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2604: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(p_rcvd_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2603: " - "Cannot find requester physical port\n"); - goto Exit; - } - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = p_rcvd_mad->comp_mask; - context.sa = sa; - context.in_port_num = p_rcvd_rec->in_port_num; - context.p_req_physp = p_req_physp; - - cl_plock_acquire(sa->p_lock); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Got Query Lid:%u(%02X), In-Port:0x%02X(%02X), Out-Port:0x%02X(%02X)\n", - cl_ntoh16(p_rcvd_rec->lid), - (comp_mask & IB_SLVL_COMPMASK_LID) != 0, - p_rcvd_rec->in_port_num, - (comp_mask & IB_SLVL_COMPMASK_IN_PORT) != 0, - p_rcvd_rec->out_port_num, - (comp_mask & IB_SLVL_COMPMASK_OUT_PORT) != 0); - - /* - If the user specified a LID, it obviously narrows our - work load, since we don't have to search every port - */ - if (comp_mask & IB_SLVL_COMPMASK_LID) { - p_port = osm_get_port_by_lid(sa->p_subn, p_rcvd_rec->lid); - if (!p_port) { - status = IB_NOT_FOUND; - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2608: " - "No port found with LID %u\n", - cl_ntoh16(p_rcvd_rec->lid)); - } - } - - if (status == IB_SUCCESS) { - /* if we have a unique port - no need for a port search */ - if (p_port) - /* this does the loop on all the port phys ports */ - sa_slvl_by_comp_mask(sa, p_port, &context); - else - cl_qmap_apply_func(&sa->p_subn->port_guid_tbl, - sa_slvl_by_comp_mask_cb, &context); - } - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_slvl_table_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_sminfo_record.c b/branches/opensm_3/user/opensm/osm_sa_sminfo_record.c deleted file mode 100644 index 3b772630..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_sminfo_record.c +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_smir_rcv_t. - * This object represents the SMInfo Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_smir_item { - cl_list_item_t list_item; - ib_sminfo_record_t rec; -} osm_smir_item_t; - -typedef struct osm_smir_search_ctxt { - const ib_sminfo_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; -} osm_smir_search_ctxt_t; - -static ib_api_status_t smir_rcv_new_smir(IN osm_sa_t * sa, - IN const osm_port_t * p_port, - IN cl_qlist_t * p_list, - IN ib_net64_t const guid, - IN ib_net32_t const act_count, - IN uint8_t const pri_state, - IN const osm_physp_t * p_req_physp) -{ - osm_smir_item_t *p_rec_item; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2801: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New SMInfo: GUID 0x%016" PRIx64 "\n", cl_ntoh64(guid)); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = osm_port_get_base_lid(p_port); - p_rec_item->rec.sm_info.guid = guid; - p_rec_item->rec.sm_info.act_count = act_count; - p_rec_item->rec.sm_info.pri_state = pri_state; - - cl_qlist_insert_tail(p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void sa_smir_by_comp_mask(IN osm_sa_t * sa, - IN const osm_remote_sm_t * p_rem_sm, - osm_smir_search_ctxt_t * p_ctxt) -{ - const ib_sminfo_record_t *const p_rcvd_rec = p_ctxt->p_rcvd_rec; - const osm_physp_t *const p_req_physp = p_ctxt->p_req_physp; - ib_net64_t const comp_mask = p_ctxt->comp_mask; - - OSM_LOG_ENTER(sa->p_log); - - if (comp_mask & IB_SMIR_COMPMASK_GUID) { - if (p_rem_sm->smi.guid != p_rcvd_rec->sm_info.guid) - goto Exit; - } - - if (comp_mask & IB_SMIR_COMPMASK_PRIORITY) { - if (ib_sminfo_get_priority(&p_rem_sm->smi) != - ib_sminfo_get_priority(&p_rcvd_rec->sm_info)) - goto Exit; - } - - if (comp_mask & IB_SMIR_COMPMASK_SMSTATE) { - if (ib_sminfo_get_state(&p_rem_sm->smi) != - ib_sminfo_get_state(&p_rcvd_rec->sm_info)) - goto Exit; - } - - /* Implement any other needed search cases */ - - smir_rcv_new_smir(sa, p_rem_sm->p_port, p_ctxt->p_list, - p_rem_sm->smi.guid, p_rem_sm->smi.act_count, - p_rem_sm->smi.pri_state, p_req_physp); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_smir_by_comp_mask_cb(IN cl_map_item_t * p_map_item, IN void *cxt) -{ - const osm_remote_sm_t *p_rem_sm = (osm_remote_sm_t *) p_map_item; - osm_smir_search_ctxt_t *p_ctxt = cxt; - - sa_smir_by_comp_mask(p_ctxt->sa, p_rem_sm, p_ctxt); -} - -void osm_smir_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *sad_mad; - const ib_sminfo_record_t *p_rcvd_rec; - const osm_port_t *p_port = NULL; - const ib_sm_info_t *p_smi; - cl_qlist_t rec_list; - osm_smir_search_ctxt_t context; - ib_api_status_t status = IB_SUCCESS; - ib_net64_t comp_mask; - ib_net64_t port_guid; - osm_physp_t *p_req_physp; - osm_port_t *local_port; - osm_remote_sm_t *p_rem_sm; - cl_qmap_t *p_sm_guid_tbl; - uint8_t pri_state; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - sad_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = (ib_sminfo_record_t *) ib_sa_mad_get_payload_ptr(sad_mad); - comp_mask = sad_mad->comp_mask; - - CL_ASSERT(sad_mad->attr_id == IB_MAD_ATTR_SMINFO_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (sad_mad->method != IB_MAD_METHOD_GET && - sad_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2804: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(sad_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2803: " - "Cannot find requester physical port\n"); - goto Exit; - } - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_sm_info_record(sa->p_log, p_rcvd_rec, OSM_LOG_DEBUG); - - p_smi = &p_rcvd_rec->sm_info; - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = sad_mad->comp_mask; - context.sa = sa; - context.p_req_physp = p_req_physp; - - cl_plock_acquire(sa->p_lock); - - /* - If the user specified a LID, it obviously narrows our - work load, since we don't have to search every port - */ - if (comp_mask & IB_SMIR_COMPMASK_LID) { - p_port = osm_get_port_by_lid(sa->p_subn, p_rcvd_rec->lid); - if (!p_port) { - status = IB_NOT_FOUND; - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2806: " - "No port found with LID %u\n", - cl_ntoh16(p_rcvd_rec->lid)); - } - } - - if (status == IB_SUCCESS) { - /* Handle our own SM first */ - local_port = osm_get_port_by_guid(sa->p_subn, - sa->p_subn->sm_port_guid); - if (!local_port) { - cl_plock_release(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2809: " - "No port found with GUID 0x%016" PRIx64 "\n", - cl_ntoh64(sa->p_subn->sm_port_guid)); - goto Exit; - } - - if (!p_port || local_port == p_port) { - if (FALSE == - osm_physp_share_pkey(sa->p_log, p_req_physp, - local_port->p_physp)) { - cl_plock_release(sa->p_lock); - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2805: " - "Cannot get SMInfo record due to pkey violation\n"); - goto Exit; - } - - /* Check that other search components specified match */ - if ((comp_mask & IB_SMIR_COMPMASK_GUID) && - sa->p_subn->sm_port_guid != p_smi->guid) - goto Remotes; - if ((comp_mask & IB_SMIR_COMPMASK_PRIORITY) && - sa->p_subn->opt.sm_priority != - ib_sminfo_get_priority(p_smi)) - goto Remotes; - if ((comp_mask & IB_SMIR_COMPMASK_SMSTATE) && - sa->p_subn->sm_state != ib_sminfo_get_state(p_smi)) - goto Remotes; - - /* Now, add local SMInfo to list */ - pri_state = sa->p_subn->sm_state & 0x0F; - pri_state |= (sa->p_subn->opt.sm_priority & 0x0F) << 4; - smir_rcv_new_smir(sa, local_port, context.p_list, - sa->p_subn->sm_port_guid, - cl_ntoh32(sa->p_subn->p_osm->stats. - qp0_mads_sent), pri_state, - p_req_physp); - } - - Remotes: - if (p_port && p_port != local_port) { - /* Find remote SM corresponding to p_port */ - port_guid = osm_port_get_guid(p_port); - p_sm_guid_tbl = &sa->p_subn->sm_guid_tbl; - p_rem_sm = - (osm_remote_sm_t *) cl_qmap_get(p_sm_guid_tbl, - port_guid); - if (p_rem_sm != - (osm_remote_sm_t *) cl_qmap_end(p_sm_guid_tbl)) - sa_smir_by_comp_mask(sa, p_rem_sm, &context); - else - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 280A: " - "No remote SM for GUID 0x%016" PRIx64 - "\n", cl_ntoh64(port_guid)); - } else { - /* Go over all other known (remote) SMs */ - cl_qmap_apply_func(&sa->p_subn->sm_guid_tbl, - sa_smir_by_comp_mask_cb, &context); - } - } - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_sminfo_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_sw_info_record.c b/branches/opensm_3/user/opensm/osm_sa_sw_info_record.c deleted file mode 100644 index a58c6f59..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_sw_info_record.c +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_sir_rcv_t. - * This object represents the SwitchInfo Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_sir_item { - cl_list_item_t list_item; - ib_switch_info_record_t rec; -} osm_sir_item_t; - -typedef struct osm_sir_search_ctxt { - const ib_switch_info_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; -} osm_sir_search_ctxt_t; - -static ib_api_status_t sir_rcv_new_sir(IN osm_sa_t * sa, - IN const osm_switch_t * p_sw, - IN cl_qlist_t * p_list, - IN ib_net16_t lid) -{ - osm_sir_item_t *p_rec_item; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 5308: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New SwitchInfoRecord: lid %u\n", cl_ntoh16(lid)); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = lid; - p_rec_item->rec.switch_info = p_sw->switch_info; - - cl_qlist_insert_tail(p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); - return status; -} - -static void sir_rcv_create_sir(IN osm_sa_t * sa, IN const osm_switch_t * p_sw, - IN cl_qlist_t * p_list, IN ib_net16_t match_lid, - IN const osm_physp_t * p_req_physp) -{ - osm_port_t *p_port; - const osm_physp_t *p_physp; - uint16_t match_lid_ho; - ib_net16_t min_lid_ho; - ib_net16_t max_lid_ho; - - OSM_LOG_ENTER(sa->p_log); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Looking for SwitchInfoRecord with LID: %u\n", - cl_ntoh16(match_lid)); - - /* In switches, the port guid is the node guid. */ - p_port = - osm_get_port_by_guid(sa->p_subn, p_sw->p_node->node_info.port_guid); - if (!p_port) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 530A: " - "Failed to find Port by Node Guid:0x%016" PRIx64 - "\n", cl_ntoh64(p_sw->p_node->node_info.node_guid)); - goto Exit; - } - - /* check that the requester physp and the current physp are under - the same partition. */ - p_physp = p_port->p_physp; - if (!p_physp) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 530B: " - "Failed to find default physical Port by Node Guid:0x%016" - PRIx64 "\n", - cl_ntoh64(p_sw->p_node->node_info.node_guid)); - goto Exit; - } - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp)) - goto Exit; - - /* get the port 0 of the switch */ - osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho); - - match_lid_ho = cl_ntoh16(match_lid); - if (match_lid_ho) { - /* - We validate that the lid belongs to this switch. - */ - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Comparing LID: %u <= %u <= %u\n", - min_lid_ho, match_lid_ho, max_lid_ho); - - if (match_lid_ho < min_lid_ho || match_lid_ho > max_lid_ho) - goto Exit; - - } - - sir_rcv_new_sir(sa, p_sw, p_list, osm_port_get_base_lid(p_port)); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sir_rcv_by_comp_mask(IN cl_map_item_t * p_map_item, IN void *cxt) -{ - const osm_sir_search_ctxt_t *p_ctxt = cxt; - const osm_switch_t *p_sw = (osm_switch_t *) p_map_item; - const ib_switch_info_record_t *const p_rcvd_rec = p_ctxt->p_rcvd_rec; - const osm_physp_t *const p_req_physp = p_ctxt->p_req_physp; - osm_sa_t *sa = p_ctxt->sa; - ib_net64_t const comp_mask = p_ctxt->comp_mask; - ib_net16_t match_lid = 0; - - OSM_LOG_ENTER(p_ctxt->sa->p_log); - - osm_dump_switch_info(p_ctxt->sa->p_log, &p_sw->switch_info, - OSM_LOG_VERBOSE); - - if (comp_mask & IB_SWIR_COMPMASK_LID) { - match_lid = p_rcvd_rec->lid; - if (!match_lid) - goto Exit; - } - - sir_rcv_create_sir(sa, p_sw, p_ctxt->p_list, match_lid, p_req_physp); - -Exit: - OSM_LOG_EXIT(p_ctxt->sa->p_log); -} - -void osm_sir_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *sad_mad; - const ib_switch_info_record_t *p_rcvd_rec; - cl_qlist_t rec_list; - osm_sir_search_ctxt_t context; - osm_physp_t *p_req_physp; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - sad_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = - (ib_switch_info_record_t *) ib_sa_mad_get_payload_ptr(sad_mad); - - CL_ASSERT(sad_mad->attr_id == IB_MAD_ATTR_SWITCH_INFO_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (sad_mad->method != IB_MAD_METHOD_GET && - sad_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 5305: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(sad_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 5304: " - "Cannot find requester physical port\n"); - goto Exit; - } - - if (osm_log_is_active(sa->p_log, OSM_LOG_DEBUG)) - osm_dump_switch_info_record(sa->p_log, p_rcvd_rec, - OSM_LOG_DEBUG); - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = sad_mad->comp_mask; - context.sa = sa; - context.p_req_physp = p_req_physp; - - cl_plock_acquire(sa->p_lock); - - /* Go over all switches */ - cl_qmap_apply_func(&sa->p_subn->sw_guid_tbl, sir_rcv_by_comp_mask, - &context); - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_switch_info_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sa_vlarb_record.c b/branches/opensm_3/user/opensm/osm_sa_vlarb_record.c deleted file mode 100644 index 92a34d4a..00000000 --- a/branches/opensm_3/user/opensm/osm_sa_vlarb_record.c +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_vlarb_rec_rcv_t. - * This object represents the VLArbitrationRecord Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct osm_vl_arb_item { - cl_list_item_t list_item; - ib_vl_arb_table_record_t rec; -} osm_vl_arb_item_t; - -typedef struct osm_vl_arb_search_ctxt { - const ib_vl_arb_table_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - uint8_t block_num; - cl_qlist_t *p_list; - osm_sa_t *sa; - const osm_physp_t *p_req_physp; -} osm_vl_arb_search_ctxt_t; - -static void sa_vl_arb_create(IN osm_sa_t * sa, IN osm_physp_t * p_physp, - IN osm_vl_arb_search_ctxt_t * p_ctxt, - IN uint8_t block) -{ - osm_vl_arb_item_t *p_rec_item; - uint16_t lid; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sa->p_log); - - p_rec_item = malloc(sizeof(*p_rec_item)); - if (p_rec_item == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2A02: " - "rec_item alloc failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - - if (p_physp->p_node->node_info.node_type != IB_NODE_TYPE_SWITCH) - lid = p_physp->port_info.base_lid; - else - lid = osm_node_get_base_lid(p_physp->p_node, 0); - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "New VLArbitration for: port 0x%016" PRIx64 - ", lid %u, port %u Block:%u\n", - cl_ntoh64(osm_physp_get_port_guid(p_physp)), - cl_ntoh16(lid), osm_physp_get_port_num(p_physp), block); - - memset(p_rec_item, 0, sizeof(*p_rec_item)); - - p_rec_item->rec.lid = lid; - p_rec_item->rec.port_num = osm_physp_get_port_num(p_physp); - p_rec_item->rec.block_num = block; - p_rec_item->rec.vl_arb_tbl = *(osm_physp_get_vla_tbl(p_physp, block)); - - cl_qlist_insert_tail(p_ctxt->p_list, &p_rec_item->list_item); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_vl_arb_check_physp(IN osm_sa_t * sa, IN osm_physp_t * p_physp, - osm_vl_arb_search_ctxt_t * p_ctxt) -{ - ib_net64_t comp_mask = p_ctxt->comp_mask; - uint8_t block; - - OSM_LOG_ENTER(sa->p_log); - - /* we got here with the phys port - all that's left is to get the right block */ - for (block = 1; block <= 4; block++) { - if (!(comp_mask & IB_VLA_COMPMASK_BLOCK) - || block == p_ctxt->block_num) - sa_vl_arb_create(sa, p_physp, p_ctxt, block); - } - - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_vl_arb_by_comp_mask(osm_sa_t * sa, IN const osm_port_t * p_port, - osm_vl_arb_search_ctxt_t * p_ctxt) -{ - const ib_vl_arb_table_record_t *p_rcvd_rec; - ib_net64_t comp_mask; - osm_physp_t *p_physp; - uint8_t port_num; - uint8_t num_ports; - const osm_physp_t *p_req_physp; - - OSM_LOG_ENTER(sa->p_log); - - p_rcvd_rec = p_ctxt->p_rcvd_rec; - comp_mask = p_ctxt->comp_mask; - port_num = p_rcvd_rec->port_num; - p_req_physp = p_ctxt->p_req_physp; - - /* if this is a switch port we can search all ports - otherwise we must be looking on port 0 */ - if (p_port->p_node->node_info.node_type != IB_NODE_TYPE_SWITCH) { - /* we put it in the comp mask and port num */ - port_num = p_port->p_physp->port_num; - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Using Physical Default Port Number: 0x%X (for End Node)\n", - port_num); - comp_mask |= IB_VLA_COMPMASK_OUT_PORT; - } - - if (comp_mask & IB_VLA_COMPMASK_OUT_PORT) { - if (port_num < osm_node_get_num_physp(p_port->p_node)) { - p_physp = - osm_node_get_physp_ptr(p_port->p_node, port_num); - /* check that the p_physp is valid, and that the requester - and the p_physp share a pkey. */ - if (p_physp && - osm_physp_share_pkey(sa->p_log, p_req_physp, - p_physp)) - sa_vl_arb_check_physp(sa, p_physp, p_ctxt); - } else { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2A03: " - "Given Physical Port Number: 0x%X is out of range should be < 0x%X\n", - port_num, - osm_node_get_num_physp(p_port->p_node)); - goto Exit; - } - } else { - num_ports = osm_node_get_num_physp(p_port->p_node); - for (port_num = 0; port_num < num_ports; port_num++) { - p_physp = - osm_node_get_physp_ptr(p_port->p_node, port_num); - if (!p_physp) - continue; - - /* if the requester and the p_physp don't share a pkey - - continue */ - if (!osm_physp_share_pkey - (sa->p_log, p_req_physp, p_physp)) - continue; - - sa_vl_arb_check_physp(sa, p_physp, p_ctxt); - } - } -Exit: - OSM_LOG_EXIT(sa->p_log); -} - -static void sa_vl_arb_by_comp_mask_cb(IN cl_map_item_t * p_map_item, void *cxt) -{ - const osm_port_t *p_port = (osm_port_t *) p_map_item; - osm_vl_arb_search_ctxt_t *p_ctxt = cxt; - - sa_vl_arb_by_comp_mask(p_ctxt->sa, p_port, p_ctxt); -} - -void osm_vlarb_rec_rcv_process(IN void *ctx, IN void *data) -{ - osm_sa_t *sa = ctx; - osm_madw_t *p_madw = data; - const ib_sa_mad_t *sad_mad; - const ib_vl_arb_table_record_t *p_rcvd_rec; - const osm_port_t *p_port = NULL; - const ib_vl_arb_table_t *p_vl_arb; - cl_qlist_t rec_list; - osm_vl_arb_search_ctxt_t context; - ib_api_status_t status = IB_SUCCESS; - ib_net64_t comp_mask; - osm_physp_t *p_req_physp; - - CL_ASSERT(sa); - - OSM_LOG_ENTER(sa->p_log); - - CL_ASSERT(p_madw); - - sad_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_rcvd_rec = - (ib_vl_arb_table_record_t *) ib_sa_mad_get_payload_ptr(sad_mad); - comp_mask = sad_mad->comp_mask; - - CL_ASSERT(sad_mad->attr_id == IB_MAD_ATTR_VLARB_RECORD); - - /* we only support SubnAdmGet and SubnAdmGetTable methods */ - if (sad_mad->method != IB_MAD_METHOD_GET && - sad_mad->method != IB_MAD_METHOD_GETTABLE) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2A05: " - "Unsupported Method (%s)\n", - ib_get_sa_method_str(sad_mad->method)); - osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_UNSUP_METHOD_ATTR); - goto Exit; - } - - /* update the requester physical port. */ - p_req_physp = osm_get_physp_by_mad_addr(sa->p_log, sa->p_subn, - osm_madw_get_mad_addr_ptr - (p_madw)); - if (p_req_physp == NULL) { - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2A04: " - "Cannot find requester physical port\n"); - goto Exit; - } - - p_vl_arb = (ib_vl_arb_table_t *) ib_sa_mad_get_payload_ptr(sad_mad); - - cl_qlist_init(&rec_list); - - context.p_rcvd_rec = p_rcvd_rec; - context.p_list = &rec_list; - context.comp_mask = sad_mad->comp_mask; - context.sa = sa; - context.block_num = p_rcvd_rec->block_num; - context.p_req_physp = p_req_physp; - - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Got Query Lid:%u(%02X), Port:0x%02X(%02X), Block:0x%02X(%02X)\n", - cl_ntoh16(p_rcvd_rec->lid), - (comp_mask & IB_VLA_COMPMASK_LID) != 0, p_rcvd_rec->port_num, - (comp_mask & IB_VLA_COMPMASK_OUT_PORT) != 0, - p_rcvd_rec->block_num, - (comp_mask & IB_VLA_COMPMASK_BLOCK) != 0); - - cl_plock_acquire(sa->p_lock); - - /* - If the user specified a LID, it obviously narrows our - work load, since we don't have to search every port - */ - if (comp_mask & IB_VLA_COMPMASK_LID) { - p_port = osm_get_port_by_lid(sa->p_subn, p_rcvd_rec->lid); - if (!p_port) { - status = IB_NOT_FOUND; - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2A09: " - "No port found with LID %u\n", - cl_ntoh16(p_rcvd_rec->lid)); - } - } - - if (status == IB_SUCCESS) { - /* if we got a unique port - no need for a port search */ - if (p_port) - /* this does the loop on all the port phys ports */ - sa_vl_arb_by_comp_mask(sa, p_port, &context); - else - cl_qmap_apply_func(&sa->p_subn->port_guid_tbl, - sa_vl_arb_by_comp_mask_cb, &context); - } - - cl_plock_release(sa->p_lock); - - osm_sa_respond(sa, p_madw, sizeof(ib_vl_arb_table_record_t), &rec_list); - -Exit: - OSM_LOG_EXIT(sa->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_service.c b/branches/opensm_3/user/opensm/osm_service.c deleted file mode 100644 index bf7c7522..00000000 --- a/branches/opensm_3/user/opensm/osm_service.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of service record functions. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include - -void osm_svcr_delete(IN osm_svcr_t * p_svcr) -{ - free(p_svcr); -} - -void osm_svcr_init(IN osm_svcr_t * p_svcr, - IN const ib_service_record_t * p_svc_rec) -{ - CL_ASSERT(p_svcr); - - p_svcr->modified_time = cl_get_time_stamp_sec(); - - /* We track the time left for this service in - an external field to avoid extra cl_ntoh/hton - required for working with the MAD field */ - p_svcr->lease_period = cl_ntoh32(p_svc_rec->service_lease); - p_svcr->service_record = *p_svc_rec; -} - -osm_svcr_t *osm_svcr_new(IN const ib_service_record_t * p_svc_rec) -{ - osm_svcr_t *p_svcr; - - CL_ASSERT(p_svc_rec); - - p_svcr = (osm_svcr_t *) malloc(sizeof(*p_svcr)); - if (p_svcr) { - memset(p_svcr, 0, sizeof(*p_svcr)); - osm_svcr_init(p_svcr, p_svc_rec); - } - - return p_svcr; -} - -static cl_status_t match_rid_of_svc_rec(IN const cl_list_item_t * p_list_item, - IN void *context) -{ - ib_service_record_t *p_svc_rec = (ib_service_record_t *) context; - osm_svcr_t *p_svcr = (osm_svcr_t *) p_list_item; - - if (memcmp(&p_svcr->service_record, p_svc_rec, - sizeof(p_svc_rec->service_id) + - sizeof(p_svc_rec->service_gid) + - sizeof(p_svc_rec->service_pkey))) - return CL_NOT_FOUND; - else - return CL_SUCCESS; -} - -osm_svcr_t *osm_svcr_get_by_rid(IN osm_subn_t const *p_subn, - IN osm_log_t * p_log, - IN ib_service_record_t * p_svc_rec) -{ - cl_list_item_t *p_list_item; - - OSM_LOG_ENTER(p_log); - - p_list_item = cl_qlist_find_from_head(&p_subn->sa_sr_list, - match_rid_of_svc_rec, p_svc_rec); - if (p_list_item == cl_qlist_end(&p_subn->sa_sr_list)) - p_list_item = NULL; - - OSM_LOG_EXIT(p_log); - return (osm_svcr_t *) p_list_item; -} - -void osm_svcr_insert_to_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log, - IN osm_svcr_t * p_svcr) -{ - OSM_LOG_ENTER(p_log); - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Inserting new Service Record into Database\n"); - - cl_qlist_insert_head(&p_subn->sa_sr_list, &p_svcr->list_item); - p_subn->p_osm->sa.dirty = TRUE; - - OSM_LOG_EXIT(p_log); -} - -void osm_svcr_remove_from_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log, - IN osm_svcr_t * p_svcr) -{ - OSM_LOG_ENTER(p_log); - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Removing Service Record Name:%s ID:0x%016" PRIx64 - " from Database\n", p_svcr->service_record.service_name, - p_svcr->service_record.service_id); - - cl_qlist_remove_item(&p_subn->sa_sr_list, &p_svcr->list_item); - p_subn->p_osm->sa.dirty = TRUE; - - OSM_LOG_EXIT(p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_slvl_map_rcv.c b/branches/opensm_3/user/opensm/osm_slvl_map_rcv.c deleted file mode 100644 index 351bf5bd..00000000 --- a/branches/opensm_3/user/opensm/osm_slvl_map_rcv.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_slvl_rcv_t. - * This object represents the SLtoVL Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * WE ONLY RECEIVE GET or SET responses - */ -void osm_slvl_rcv_process(IN void *context, IN void *p_data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = p_data; - ib_slvl_table_t *p_slvl_tbl; - ib_smp_t *p_smp; - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_node_t *p_node; - osm_slvl_context_t *p_context; - ib_net64_t port_guid; - ib_net64_t node_guid; - uint32_t attr_mod; - uint8_t startinport, endinport, startoutport, endoutport; - uint8_t in_port, out_port; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_context = osm_madw_get_slvl_context_ptr(p_madw); - p_slvl_tbl = ib_smp_get_payload_ptr(p_smp); - - port_guid = p_context->port_guid; - node_guid = p_context->node_guid; - - CL_ASSERT(p_smp->attr_id == IB_MAD_ATTR_SLVL_TABLE); - - cl_plock_excl_acquire(sm->p_lock); - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2C06: " - "No port object for port with GUID 0x%" PRIx64 - "\n\t\t\t\tfor parent node GUID 0x%" PRIx64 - ", TID 0x%" PRIx64 "\n", cl_ntoh64(port_guid), - cl_ntoh64(node_guid), cl_ntoh64(p_smp->trans_id)); - goto Exit; - } - - p_node = p_port->p_node; - CL_ASSERT(p_node); - - /* in case of a non switch node the attr modifier should be ignored */ - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH) { - unsigned num_ports = osm_node_get_num_physp(p_node) - 1; - attr_mod = cl_ntoh32(p_smp->attr_mod); - - if (attr_mod & 0x10000) { - startoutport = ib_switch_info_is_enhanced_port0(&p_node->sw->switch_info) ? 0 : 1; - endoutport = osm_node_get_num_physp(p_node) - 1; - } else - startoutport = endoutport = attr_mod & 0xff; - - if (attr_mod & 0x20000) { - startinport = ib_switch_info_is_enhanced_port0(&p_node->sw->switch_info) ? 0 : 1; - endinport = osm_node_get_num_physp(p_node) - 1; - } else - startinport = endinport = (attr_mod >> 8) & 0xff; - - if (startinport > num_ports || startoutport > num_ports) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2C07" - "Invalid attribute modifier 0x%x received in" - " response from switch 0x%" PRIx64 "\n", - cl_ntoh32(attr_mod), cl_ntoh64(node_guid)); - goto Exit; - } - - } else { - startoutport = endoutport = p_port->p_physp->port_num; - startinport = endinport = 0; - } - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Received SLtoVL GetResp" - " in_port_num %u out_port_num %u with GUID 0x%" PRIx64 - " for parent node GUID 0x%" PRIx64 ", TID 0x%" PRIx64 "\n", - startinport == endinport ? startinport : 0xff, - startoutport == endoutport ? startoutport : 0xff, - cl_ntoh64(port_guid), cl_ntoh64(node_guid), - cl_ntoh64(p_smp->trans_id)); - - osm_dump_slvl_map_table(sm->p_log, port_guid, - startinport == endinport ? startinport : 0xff, - startoutport == endoutport ? startoutport : 0xff, - p_slvl_tbl, OSM_LOG_DEBUG); - - for (out_port = startoutport; out_port <= endoutport; out_port++) { - p_physp = osm_node_get_physp_ptr(p_node, out_port); - for (in_port = startinport; in_port <= endinport; in_port++) - osm_physp_set_slvl_tbl(p_physp, p_slvl_tbl, in_port); - } - -Exit: - cl_plock_release(sm->p_lock); - - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_sm.c b/branches/opensm_3/user/opensm/osm_sm.c deleted file mode 100644 index 9687f0e6..00000000 --- a/branches/opensm_3/user/opensm/osm_sm.c +++ /dev/null @@ -1,447 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_sm_t. - * This object represents the SM Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define OSM_SM_INITIAL_TID_VALUE 0x1233 - -extern void osm_lft_rcv_process(IN void *context, IN void *data); -extern void osm_mft_rcv_process(IN void *context, IN void *data); -extern void osm_nd_rcv_process(IN void *context, IN void *data); -extern void osm_ni_rcv_process(IN void *context, IN void *data); -extern void osm_pkey_rcv_process(IN void *context, IN void *data); -extern void osm_pi_rcv_process(IN void *context, IN void *data); -extern void osm_slvl_rcv_process(IN void *context, IN void *p_data); -extern void osm_sminfo_rcv_process(IN void *context, IN void *data); -extern void osm_si_rcv_process(IN void *context, IN void *data); -extern void osm_trap_rcv_process(IN void *context, IN void *data); -extern void osm_vla_rcv_process(IN void *context, IN void *data); - -extern void osm_state_mgr_process(IN osm_sm_t * sm, IN osm_signal_t signal); -extern void osm_sm_state_mgr_polling_callback(IN void *context); - -static void sm_process(osm_sm_t * sm, osm_signal_t signal) -{ -#ifdef ENABLE_OSM_PERF_MGR - if (signal == OSM_SIGNAL_PERFMGR_SWEEP) - osm_perfmgr_process(&sm->p_subn->p_osm->perfmgr); - else -#endif - osm_state_mgr_process(sm, signal); -} - -static void sm_sweeper(IN void *p_ptr) -{ - ib_api_status_t status; - osm_sm_t * p_sm = p_ptr; - unsigned signals, i; - - OSM_LOG_ENTER(p_sm->p_log); - - while (p_sm->thread_state == OSM_THREAD_STATE_RUN) { - /* - * Wait on the event with a timeout. - * Sweeps may be initiated "off schedule" by simply - * signaling the event. - */ - status = cl_event_wait_on(&p_sm->signal_event, - EVENT_NO_TIMEOUT, TRUE); - - if (status == CL_SUCCESS) - OSM_LOG(p_sm->p_log, OSM_LOG_DEBUG, - "Off schedule sweep signalled\n"); - else if (status != CL_TIMEOUT) { - OSM_LOG(p_sm->p_log, OSM_LOG_ERROR, "ERR 2E01: " - "Event wait failed (%s)\n", - CL_STATUS_MSG(status)); - continue; - } - - if (osm_exit_flag) - break; - - cl_spinlock_acquire(&p_sm->signal_lock); - signals = p_sm->signal_mask; - p_sm->signal_mask = 0; - cl_spinlock_release(&p_sm->signal_lock); - - for (i = 0; signals; signals >>= 1, i++) - if (signals & 1) - sm_process(p_sm, i); - } - - OSM_LOG_EXIT(p_sm->p_log); -} - -static void sm_sweep(void *arg) -{ - osm_sm_t *sm = arg; - - /* do the sweep only if we are in MASTER state */ - if (sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER || - sm->p_subn->sm_state == IB_SMINFO_STATE_DISCOVERING) - osm_sm_signal(sm, OSM_SIGNAL_SWEEP); - cl_timer_start(&sm->sweep_timer, sm->p_subn->opt.sweep_interval * 1000); -} - -static void sweep_fail_process(IN void *context, IN void *p_data) -{ - osm_sm_t *sm = context; - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "light sweep failed\n"); - sm->p_subn->force_heavy_sweep = TRUE; -} - -void osm_sm_construct(IN osm_sm_t * p_sm) -{ - memset(p_sm, 0, sizeof(*p_sm)); - p_sm->thread_state = OSM_THREAD_STATE_NONE; - p_sm->sm_trans_id = OSM_SM_INITIAL_TID_VALUE; - cl_spinlock_construct(&p_sm->signal_lock); - cl_spinlock_construct(&p_sm->state_lock); - cl_timer_construct(&p_sm->polling_timer); - cl_event_construct(&p_sm->signal_event); - cl_event_construct(&p_sm->subnet_up_event); - cl_event_wheel_construct(&p_sm->trap_aging_tracker); - cl_thread_construct(&p_sm->sweeper); - osm_sm_mad_ctrl_construct(&p_sm->mad_ctrl); - osm_lid_mgr_construct(&p_sm->lid_mgr); - osm_ucast_mgr_construct(&p_sm->ucast_mgr); -} - -void osm_sm_shutdown(IN osm_sm_t * p_sm) -{ - boolean_t signal_event = FALSE; - - OSM_LOG_ENTER(p_sm->p_log); - - /* - * Signal our threads that we're leaving. - */ - if (p_sm->thread_state != OSM_THREAD_STATE_NONE) - signal_event = TRUE; - - p_sm->thread_state = OSM_THREAD_STATE_EXIT; - - /* - * Don't trigger unless event has been initialized. - * Destroy the thread before we tear down the other objects. - */ - if (signal_event) - cl_event_signal(&p_sm->signal_event); - - cl_timer_stop(&p_sm->polling_timer); - cl_timer_stop(&p_sm->sweep_timer); - cl_thread_destroy(&p_sm->sweeper); - - /* - * Always destroy controllers before the corresponding - * receiver to guarantee that all callbacks from the - * dispatcher are complete. - */ - osm_sm_mad_ctrl_destroy(&p_sm->mad_ctrl); - cl_disp_unregister(p_sm->ni_disp_h); - cl_disp_unregister(p_sm->pi_disp_h); - cl_disp_unregister(p_sm->si_disp_h); - cl_disp_unregister(p_sm->nd_disp_h); - cl_disp_unregister(p_sm->lft_disp_h); - cl_disp_unregister(p_sm->mft_disp_h); - cl_disp_unregister(p_sm->sm_info_disp_h); - cl_disp_unregister(p_sm->trap_disp_h); - cl_disp_unregister(p_sm->slvl_disp_h); - cl_disp_unregister(p_sm->vla_disp_h); - cl_disp_unregister(p_sm->pkey_disp_h); - cl_disp_unregister(p_sm->sweep_fail_disp_h); - - OSM_LOG_EXIT(p_sm->p_log); -} - -void osm_sm_destroy(IN osm_sm_t * p_sm) -{ - OSM_LOG_ENTER(p_sm->p_log); - osm_lid_mgr_destroy(&p_sm->lid_mgr); - osm_ucast_mgr_destroy(&p_sm->ucast_mgr); - cl_event_wheel_destroy(&p_sm->trap_aging_tracker); - cl_timer_destroy(&p_sm->sweep_timer); - cl_timer_destroy(&p_sm->polling_timer); - cl_event_destroy(&p_sm->signal_event); - cl_event_destroy(&p_sm->subnet_up_event); - cl_spinlock_destroy(&p_sm->signal_lock); - cl_spinlock_destroy(&p_sm->state_lock); - free(p_sm->mlids_req); - - osm_log(p_sm->p_log, OSM_LOG_SYS, "Exiting SM\n"); /* Format Waived */ - OSM_LOG_EXIT(p_sm->p_log); -} - -ib_api_status_t osm_sm_init(IN osm_sm_t * p_sm, IN osm_subn_t * p_subn, - IN osm_db_t * p_db, IN osm_vendor_t * p_vendor, - IN osm_mad_pool_t * p_mad_pool, - IN osm_vl15_t * p_vl15, IN osm_log_t * p_log, - IN osm_stats_t * p_stats, - IN cl_dispatcher_t * p_disp, IN cl_plock_t * p_lock) -{ - ib_api_status_t status; - - OSM_LOG_ENTER(p_log); - - p_sm->p_subn = p_subn; - p_sm->p_db = p_db; - p_sm->p_vendor = p_vendor; - p_sm->p_mad_pool = p_mad_pool; - p_sm->p_vl15 = p_vl15; - p_sm->p_log = p_log; - p_sm->p_disp = p_disp; - p_sm->p_lock = p_lock; - - status = cl_spinlock_init(&p_sm->signal_lock); - if (status != CL_SUCCESS) - goto Exit; - - status = cl_spinlock_init(&p_sm->state_lock); - if (status != CL_SUCCESS) - goto Exit; - - status = cl_event_init(&p_sm->signal_event, FALSE); - if (status != CL_SUCCESS) - goto Exit; - - status = cl_event_init(&p_sm->subnet_up_event, FALSE); - if (status != CL_SUCCESS) - goto Exit; - - status = cl_timer_init(&p_sm->sweep_timer, sm_sweep, p_sm); - if (status != CL_SUCCESS) - goto Exit; - - status = cl_timer_init(&p_sm->polling_timer, - osm_sm_state_mgr_polling_callback, p_sm); - if (status != CL_SUCCESS) - goto Exit; - - p_sm->mlids_req_max = 0; - p_sm->mlids_req = malloc((IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + - 1) * sizeof(p_sm->mlids_req[0])); - if (!p_sm->mlids_req) - goto Exit; - memset(p_sm->mlids_req, 0, - (IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + - 1) * sizeof(p_sm->mlids_req[0])); - - status = osm_sm_mad_ctrl_init(&p_sm->mad_ctrl, p_sm->p_subn, - p_sm->p_mad_pool, p_sm->p_vl15, - p_sm->p_vendor, - p_log, p_stats, p_lock, p_disp); - if (status != IB_SUCCESS) - goto Exit; - - status = cl_event_wheel_init(&p_sm->trap_aging_tracker); - if (status != IB_SUCCESS) - goto Exit; - - status = osm_lid_mgr_init(&p_sm->lid_mgr, p_sm); - if (status != IB_SUCCESS) - goto Exit; - - status = osm_ucast_mgr_init(&p_sm->ucast_mgr, p_sm); - if (status != IB_SUCCESS) - goto Exit; - - status = IB_INSUFFICIENT_RESOURCES; - p_sm->sweep_fail_disp_h = cl_disp_register(p_disp, - OSM_MSG_LIGHT_SWEEP_FAIL, - sweep_fail_process, p_sm); - if (p_sm->sweep_fail_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->ni_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_NODE_INFO, - osm_ni_rcv_process, p_sm); - if (p_sm->ni_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->pi_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_PORT_INFO, - osm_pi_rcv_process, p_sm); - if (p_sm->pi_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->si_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_SWITCH_INFO, - osm_si_rcv_process, p_sm); - if (p_sm->si_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->nd_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_NODE_DESC, - osm_nd_rcv_process, p_sm); - if (p_sm->nd_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->lft_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_LFT, - osm_lft_rcv_process, p_sm); - if (p_sm->lft_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->mft_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_MFT, - osm_mft_rcv_process, p_sm); - if (p_sm->mft_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->sm_info_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_SM_INFO, - osm_sminfo_rcv_process, p_sm); - if (p_sm->sm_info_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->trap_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_NOTICE, - osm_trap_rcv_process, p_sm); - if (p_sm->trap_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->slvl_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_SLVL, - osm_slvl_rcv_process, p_sm); - if (p_sm->slvl_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->vla_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_VL_ARB, - osm_vla_rcv_process, p_sm); - if (p_sm->vla_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_sm->pkey_disp_h = cl_disp_register(p_disp, OSM_MSG_MAD_PKEY, - osm_pkey_rcv_process, p_sm); - if (p_sm->pkey_disp_h == CL_DISP_INVALID_HANDLE) - goto Exit; - - p_subn->sm_state = p_subn->opt.sm_inactive ? - IB_SMINFO_STATE_NOTACTIVE : IB_SMINFO_STATE_DISCOVERING; - osm_report_sm_state(p_sm); - - /* - * Now that the component objects are initialized, start - * the sweeper thread if the user wants sweeping. - */ - p_sm->thread_state = OSM_THREAD_STATE_RUN; - status = cl_thread_init(&p_sm->sweeper, sm_sweeper, p_sm, - "opensm sweeper"); - if (status != IB_SUCCESS) - goto Exit; - - if (p_sm->p_subn->opt.sweep_interval) - cl_timer_start(&p_sm->sweep_timer, - p_sm->p_subn->opt.sweep_interval * 1000); - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -void osm_sm_signal(osm_sm_t * p_sm, osm_signal_t signal) -{ - cl_spinlock_acquire(&p_sm->signal_lock); - p_sm->signal_mask |= 1 << signal; - cl_event_signal(&p_sm->signal_event); - cl_spinlock_release(&p_sm->signal_lock); -} - -void osm_sm_sweep(IN osm_sm_t * p_sm) -{ - OSM_LOG_ENTER(p_sm->p_log); - osm_sm_signal(p_sm, OSM_SIGNAL_SWEEP); - OSM_LOG_EXIT(p_sm->p_log); -} - -ib_api_status_t osm_sm_bind(IN osm_sm_t * p_sm, IN ib_net64_t port_guid) -{ - ib_api_status_t status; - - OSM_LOG_ENTER(p_sm->p_log); - - status = osm_sm_mad_ctrl_bind(&p_sm->mad_ctrl, port_guid); - - if (status != IB_SUCCESS) { - OSM_LOG(p_sm->p_log, OSM_LOG_ERROR, "ERR 2E10: " - "SM MAD Controller bind failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_sm->p_log); - return status; -} - -void osm_sm_reroute_mlid(osm_sm_t * sm, ib_net16_t mlid) -{ - mlid = cl_ntoh16(mlid) - IB_LID_MCAST_START_HO; - sm->mlids_req[mlid] = 1; - if (sm->mlids_req_max < mlid) - sm->mlids_req_max = mlid; - osm_sm_signal(sm, OSM_SIGNAL_IDLE_TIME_PROCESS_REQUEST); - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "rerouting requested for MLID 0x%x\n", - mlid + IB_LID_MCAST_START_HO); -} - -void osm_set_sm_priority(osm_sm_t * sm, uint8_t priority) -{ - uint8_t old_pri = sm->p_subn->opt.sm_priority; - - sm->p_subn->opt.sm_priority = priority; - - if (old_pri < priority && - sm->p_subn->sm_state == IB_SMINFO_STATE_STANDBY) - osm_send_trap144(sm, TRAP_144_MASK_SM_PRIORITY_CHANGE); -} diff --git a/branches/opensm_3/user/opensm/osm_sm_mad_ctrl.c b/branches/opensm_3/user/opensm/osm_sm_mad_ctrl.c deleted file mode 100644 index a74f11ed..00000000 --- a/branches/opensm_3/user/opensm/osm_sm_mad_ctrl.c +++ /dev/null @@ -1,905 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_sm_mad_ctrl_t. - * This object represents the SM MAD request controller object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/****f* opensm: SM/sm_mad_ctrl_retire_trans_mad - * NAME - * sm_mad_ctrl_retire_trans_mad - * - * DESCRIPTION - * This function handles clean-up of MADs associated with the SM's - * outstanding transactions on the wire. - * - * SYNOPSIS - */ - -static void sm_mad_ctrl_retire_trans_mad(IN osm_sm_mad_ctrl_t * p_ctrl, - IN osm_madw_t * p_madw) -{ - uint32_t outstanding; - - OSM_LOG_ENTER(p_ctrl->p_log); - - CL_ASSERT(p_madw); - /* - Return the MAD & wrapper to the pool. - */ - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, - "Retiring MAD with TID 0x%" PRIx64 "\n", - cl_ntoh64(osm_madw_get_smp_ptr(p_madw)->trans_id)); - - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - - outstanding = osm_stats_dec_qp0_outstanding(p_ctrl->p_stats); - - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "%u QP0 MADs outstanding%s\n", - p_ctrl->p_stats->qp0_mads_outstanding, - outstanding ? "" : ": wire is clean."); - - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/************/ - -/****f* opensm: SM/sm_mad_ctrl_disp_done_callback - * NAME - * sm_mad_ctrl_disp_done_callback - * - * DESCRIPTION - * This function is the Dispatcher callback that indicates - * a received MAD has been processed by the recipient. - * - * SYNOPSIS - */ -static void sm_mad_ctrl_disp_done_callback(IN void *context, IN void *p_data) -{ - osm_sm_mad_ctrl_t *p_ctrl = context; - osm_madw_t *p_madw = p_data; - ib_smp_t *p_smp; - - OSM_LOG_ENTER(p_ctrl->p_log); - - /* - If the MAD that just finished processing was a response, - then retire the transaction, since we must have generated - the request. - - Otherwise, retire the transaction if a response was expected, - as in the case of a send failure. If a response was not expected, - just put the MAD back in the pool, because the MAD was a query - from some outside agent, e.g. Get(SMInfo) from another SM. - */ - p_smp = osm_madw_get_smp_ptr(p_madw); - if (ib_smp_is_response(p_smp)) { - CL_ASSERT(p_madw->resp_expected == FALSE); - sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw); - } else if (p_madw->resp_expected == TRUE) - sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw); - else - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/************/ - -/****f* opensm: SM/sm_mad_ctrl_update_wire_stats - * NAME - * sm_mad_ctrl_update_wire_stats - * - * DESCRIPTION - * Updates wire stats for outstanding MADs and calls the VL15 poller. - * - * SYNOPSIS - */ -static void sm_mad_ctrl_update_wire_stats(IN osm_sm_mad_ctrl_t * p_ctrl) -{ - uint32_t mads_on_wire; - - OSM_LOG_ENTER(p_ctrl->p_log); - - mads_on_wire = - cl_atomic_dec(&p_ctrl->p_stats->qp0_mads_outstanding_on_wire); - - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, - "%u SMPs on the wire, %u outstanding\n", mads_on_wire, - p_ctrl->p_stats->qp0_mads_outstanding); - - /* - We can signal the VL15 controller to send another MAD - if any are waiting for transmission. - */ - osm_vl15_poll(p_ctrl->p_vl15); - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/****f* opensm: SM/sm_mad_ctrl_process_get_resp - * NAME - * sm_mad_ctrl_process_get_resp - * - * DESCRIPTION - * This function handles method GetResp() for received MADs. - * This is the most common path for QP0 MADs. - * - * SYNOPSIS - */ -static void sm_mad_ctrl_process_get_resp(IN osm_sm_mad_ctrl_t * p_ctrl, - IN osm_madw_t * p_madw, - IN void *transaction_context) -{ - ib_smp_t *p_smp; - cl_status_t status; - osm_madw_t *p_old_madw; - cl_disp_msgid_t msg_id = CL_DISP_MSGID_NONE; - - OSM_LOG_ENTER(p_ctrl->p_log); - - CL_ASSERT(p_madw); - CL_ASSERT(transaction_context); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR && !ib_smp_is_d(p_smp)) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3102: " - "'D' bit not set in returned SMP\n"); - osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_ERROR); - } - - p_old_madw = transaction_context; - - sm_mad_ctrl_update_wire_stats(p_ctrl); - - /* - Copy the MAD Wrapper context from the requesting MAD - to the new MAD. This mechanism allows the recipient - controller to recover its own context regarding this - MAD transaction. Once we've copied the context, we - can return the original MAD to the pool. - */ - osm_madw_copy_context(p_madw, p_old_madw); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_old_madw); - - /* - Note that attr_id (like the rest of the MAD) is in - network byte order. - */ - switch (p_smp->attr_id) { - case IB_MAD_ATTR_NODE_DESC: - msg_id = OSM_MSG_MAD_NODE_DESC; - break; - case IB_MAD_ATTR_NODE_INFO: - msg_id = OSM_MSG_MAD_NODE_INFO; - break; - case IB_MAD_ATTR_SWITCH_INFO: - msg_id = OSM_MSG_MAD_SWITCH_INFO; - break; - case IB_MAD_ATTR_PORT_INFO: - msg_id = OSM_MSG_MAD_PORT_INFO; - break; - case IB_MAD_ATTR_LIN_FWD_TBL: - msg_id = OSM_MSG_MAD_LFT; - break; - case IB_MAD_ATTR_MCAST_FWD_TBL: - msg_id = OSM_MSG_MAD_MFT; - break; - case IB_MAD_ATTR_SM_INFO: - msg_id = OSM_MSG_MAD_SM_INFO; - break; - case IB_MAD_ATTR_SLVL_TABLE: - msg_id = OSM_MSG_MAD_SLVL; - break; - case IB_MAD_ATTR_VL_ARBITRATION: - msg_id = OSM_MSG_MAD_VL_ARB; - break; - case IB_MAD_ATTR_P_KEY_TABLE: - msg_id = OSM_MSG_MAD_PKEY; - break; - case IB_MAD_ATTR_GUID_INFO: - case IB_MAD_ATTR_CLASS_PORT_INFO: - case IB_MAD_ATTR_NOTICE: - case IB_MAD_ATTR_INFORM_INFO: - default: - cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown); - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3103: " - "Unsupported attribute 0x%X\n", - cl_ntoh16(p_smp->attr_id)); - osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_ERROR); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - - /* - Post this MAD to the dispatcher for asynchronous - processing by the appropriate controller. - */ - - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "Posting Dispatcher message %s\n", - osm_get_disp_msg_str(msg_id)); - - status = cl_disp_post(p_ctrl->h_disp, msg_id, p_madw, - sm_mad_ctrl_disp_done_callback, p_ctrl); - - if (status != CL_SUCCESS) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3104: " - "Dispatcher post message failed (%s) for attribute 0x%X (%s)\n", - CL_STATUS_MSG(status), cl_ntoh16(p_smp->attr_id), - ib_get_sm_attr_str(p_smp->attr_id)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/****f* opensm: SM/sm_mad_ctrl_process_get - * NAME - * sm_mad_ctrl_process_get - * - * DESCRIPTION - * This function handles method Get() for received MADs. - * - * SYNOPSIS - */ -static void sm_mad_ctrl_process_get(IN osm_sm_mad_ctrl_t * p_ctrl, - IN osm_madw_t * p_madw) -{ - ib_smp_t *p_smp; - cl_status_t status; - cl_disp_msgid_t msg_id = CL_DISP_MSGID_NONE; - - OSM_LOG_ENTER(p_ctrl->p_log); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - /* - Note that attr_id (like the rest of the MAD) is in - network byte order. - */ - switch (p_smp->attr_id) { - case IB_MAD_ATTR_SM_INFO: - msg_id = OSM_MSG_MAD_SM_INFO; - break; - default: - cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown); - OSM_LOG(p_ctrl->p_log, OSM_LOG_VERBOSE, - "Ignoring SubnGet MAD - unsupported attribute 0x%X\n", - cl_ntoh16(p_smp->attr_id)); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - - /* - Post this MAD to the dispatcher for asynchronous - processing by the appropriate controller. - */ - - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "Posting Dispatcher message %s\n", - osm_get_disp_msg_str(msg_id)); - - status = cl_disp_post(p_ctrl->h_disp, msg_id, p_madw, - sm_mad_ctrl_disp_done_callback, p_ctrl); - - if (status != CL_SUCCESS) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3106: " - "Dispatcher post message failed (%s)\n", - CL_STATUS_MSG(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/* - * PARAMETERS - * - * RETURN VALUES - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* opensm: SM/sm_mad_ctrl_process_set - * NAME - * sm_mad_ctrl_process_set - * - * DESCRIPTION - * This function handles method Set() for received MADs. - * - * SYNOPSIS - */ -static void sm_mad_ctrl_process_set(IN osm_sm_mad_ctrl_t * p_ctrl, - IN osm_madw_t * p_madw) -{ - ib_smp_t *p_smp; - cl_status_t status; - cl_disp_msgid_t msg_id = CL_DISP_MSGID_NONE; - - OSM_LOG_ENTER(p_ctrl->p_log); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - /* - Note that attr_id (like the rest of the MAD) is in - network byte order. - */ - switch (p_smp->attr_id) { - case IB_MAD_ATTR_SM_INFO: - msg_id = OSM_MSG_MAD_SM_INFO; - break; - default: - cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown); - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3107: " - "Unsupported attribute 0x%X\n", - cl_ntoh16(p_smp->attr_id)); - osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_ERROR); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - - /* - Post this MAD to the dispatcher for asynchronous - processing by the appropriate controller. - */ - - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "Posting Dispatcher message %s\n", - osm_get_disp_msg_str(msg_id)); - - status = cl_disp_post(p_ctrl->h_disp, msg_id, p_madw, - sm_mad_ctrl_disp_done_callback, p_ctrl); - - if (status != CL_SUCCESS) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3108: " - "Dispatcher post message failed (%s)\n", - CL_STATUS_MSG(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/* - * PARAMETERS - * - * RETURN VALUES - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* opensm: SM/sm_mad_ctrl_process_trap - * NAME - * sm_mad_ctrl_process_trap - * - * DESCRIPTION - * This function handles method Trap() for received MADs. - * - * SYNOPSIS - */ -static void sm_mad_ctrl_process_trap(IN osm_sm_mad_ctrl_t * p_ctrl, - IN osm_madw_t * p_madw) -{ - ib_smp_t *p_smp; - cl_status_t status; - cl_disp_msgid_t msg_id = CL_DISP_MSGID_NONE; - - OSM_LOG_ENTER(p_ctrl->p_log); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - /* Make sure OpenSM is master. If not - then we should not process the trap */ - if (p_ctrl->p_subn->sm_state != IB_SMINFO_STATE_MASTER) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, - "Received trap but OpenSM is not in MASTER state. " - "Dropping mad\n"); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - - /* - Note that attr_id (like the rest of the MAD) is in - network byte order. - */ - switch (p_smp->attr_id) { - case IB_MAD_ATTR_NOTICE: - msg_id = OSM_MSG_MAD_NOTICE; - break; - default: - cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown); - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3109: " - "Unsupported attribute 0x%X\n", - cl_ntoh16(p_smp->attr_id)); - osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_ERROR); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - - /* - Post this MAD to the dispatcher for asynchronous - processing by the appropriate controller. - */ - - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "Posting Dispatcher message %s\n", - osm_get_disp_msg_str(msg_id)); - - status = cl_disp_post(p_ctrl->h_disp, msg_id, p_madw, - sm_mad_ctrl_disp_done_callback, p_ctrl); - - if (status != CL_SUCCESS) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3110: " - "Dispatcher post message failed (%s)\n", - CL_STATUS_MSG(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/* - * PARAMETERS - * - * RETURN VALUES - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* opensm: SM/sm_mad_ctrl_process_trap_repress - * NAME - * sm_mad_ctrl_process_trap_repress - * - * DESCRIPTION - * This function handles method TrapRepress() for received MADs. - * - * SYNOPSIS - */ -static void sm_mad_ctrl_process_trap_repress(IN osm_sm_mad_ctrl_t * p_ctrl, - IN osm_madw_t * p_madw) -{ - ib_smp_t *p_smp; - - OSM_LOG_ENTER(p_ctrl->p_log); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - /* - Note that attr_id (like the rest of the MAD) is in - network byte order. - */ - switch (p_smp->attr_id) { - case IB_MAD_ATTR_NOTICE: - sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw); - break; - default: - cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown); - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3105: " - "Unsupported attribute 0x%X\n", - cl_ntoh16(p_smp->attr_id)); - osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_ERROR); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - break; - } - - OSM_LOG_EXIT(p_ctrl->p_log); -} - -static void log_rcv_cb_error(osm_log_t *p_log, ib_smp_t *p_smp, ib_net16_t status) -{ - char buf[BUF_SIZE]; - uint32_t i; - - if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR) { - char ipath[BUF_SIZE], rpath[BUF_SIZE]; - int ni = sprintf(ipath, "%d", p_smp->initial_path[0]); - int nr = sprintf(rpath, "%d", p_smp->return_path[0]); - for (i = 1; i <= p_smp->hop_count; i++) { - ni += sprintf(ipath + ni, ",%d", p_smp->initial_path[i]); - nr += sprintf(rpath + nr, ",%d", p_smp->return_path[i]); - } - snprintf(buf, sizeof(buf), - "\n\t\t\tInitial path: %s Return path: %s", - ipath, rpath); - } - - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 3111: " - "Received MAD with error status = 0x%X\n" - "\t\t\t%s(%s), attr_mod 0x%x, TID 0x%" PRIx64 "%s\n", - cl_ntoh16(status), ib_get_sm_method_str(p_smp->method), - ib_get_sm_attr_str(p_smp->attr_id), cl_ntoh32(p_smp->attr_mod), - cl_ntoh64(p_smp->trans_id), - p_smp->mgmt_class == IB_MCLASS_SUBN_DIR ? buf : ""); - - osm_dump_dr_smp(p_log, p_smp, OSM_LOG_VERBOSE); -} - -/* - * PARAMETERS - * - * RETURN VALUES - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* opensm: SM/sm_mad_ctrl_rcv_callback - * NAME - * sm_mad_ctrl_rcv_callback - * - * DESCRIPTION - * This is the callback from the transport layer for received MADs. - * - * SYNOPSIS - */ -static void sm_mad_ctrl_rcv_callback(IN osm_madw_t * p_madw, - IN void *bind_context, - IN osm_madw_t * p_req_madw) -{ - osm_sm_mad_ctrl_t *p_ctrl = bind_context; - ib_smp_t *p_smp; - ib_net16_t status; - - OSM_LOG_ENTER(p_ctrl->p_log); - - CL_ASSERT(p_madw); - - /* - A MAD was received from the wire, possibly in response to a request. - */ - cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd); - - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "%u QP0 MADs received\n", - p_ctrl->p_stats->qp0_mads_rcvd); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - /* if we are closing down simply do nothing */ - if (osm_exit_flag) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, - "Ignoring received mad - since we are exiting\n"); - - osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_DEBUG); - - /* retire the mad or put it back */ - if (ib_smp_is_response(p_smp)) { - CL_ASSERT(p_madw->resp_expected == FALSE); - sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw); - } else if (p_madw->resp_expected == TRUE) - sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw); - else - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - - goto Exit; - } - - if (osm_log_is_active(p_ctrl->p_log, OSM_LOG_FRAMES)) - osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_FRAMES); - - if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR) - status = ib_smp_get_status(p_smp); - else - status = p_smp->status; - - if (status != 0) - log_rcv_cb_error(p_ctrl->p_log, p_smp, status); - - switch (p_smp->method) { - case IB_MAD_METHOD_GET_RESP: - CL_ASSERT(p_req_madw != NULL); - sm_mad_ctrl_process_get_resp(p_ctrl, p_madw, p_req_madw); - break; - case IB_MAD_METHOD_GET: - CL_ASSERT(p_req_madw == NULL); - sm_mad_ctrl_process_get(p_ctrl, p_madw); - break; - case IB_MAD_METHOD_TRAP: - CL_ASSERT(p_req_madw == NULL); - sm_mad_ctrl_process_trap(p_ctrl, p_madw); - break; - case IB_MAD_METHOD_SET: - CL_ASSERT(p_req_madw == NULL); - sm_mad_ctrl_process_set(p_ctrl, p_madw); - break; - case IB_MAD_METHOD_TRAP_REPRESS: - CL_ASSERT(p_req_madw != NULL); - sm_mad_ctrl_process_trap_repress(p_ctrl, p_madw); - break; - case IB_MAD_METHOD_SEND: - case IB_MAD_METHOD_REPORT: - case IB_MAD_METHOD_REPORT_RESP: - default: - cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown); - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3112: " - "Unsupported method = 0x%X\n", p_smp->method); - osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_ERROR); - osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/* - * PARAMETERS - * - * RETURN VALUES - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* opensm: SM/sm_mad_ctrl_send_err_cb - * NAME - * sm_mad_ctrl_send_err_cb - * - * DESCRIPTION - * This is the callback from the transport layer for send errors - * on MADs that were expecting a response. - * - * SYNOPSIS - */ -static void sm_mad_ctrl_send_err_cb(IN void *context, IN osm_madw_t * p_madw) -{ - osm_sm_mad_ctrl_t *p_ctrl = context; - ib_api_status_t status; - ib_smp_t *p_smp; - - OSM_LOG_ENTER(p_ctrl->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3113: " - "MAD completed in error (%s): " - "%s(%s), attr_mod 0x%x, TID 0x%" PRIx64 "\n", - ib_get_err_str(p_madw->status), - ib_get_sm_method_str(p_smp->method), - ib_get_sm_attr_str(p_smp->attr_id), cl_ntoh32(p_smp->attr_mod), - cl_ntoh64(p_smp->trans_id)); - - /* - If this was a SubnSet MAD, then this error might indicate a problem - in configuring the subnet. In this case - need to mark that there was - such a problem. The subnet will not be up, and the next sweep should - be a heavy sweep as well. - */ - if (p_smp->method == IB_MAD_METHOD_SET && - (p_smp->attr_id == IB_MAD_ATTR_PORT_INFO || - p_smp->attr_id == IB_MAD_ATTR_MCAST_FWD_TBL || - p_smp->attr_id == IB_MAD_ATTR_SWITCH_INFO || - p_smp->attr_id == IB_MAD_ATTR_LIN_FWD_TBL || - p_smp->attr_id == IB_MAD_ATTR_P_KEY_TABLE)) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3119: " - "Set method failed for attribute 0x%X (%s)\n", - cl_ntoh16(p_smp->attr_id), - ib_get_sm_attr_str(p_smp->attr_id)); - p_ctrl->p_subn->subnet_initialization_error = TRUE; - } - - osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_VERBOSE); - - /* - Since we did not get any response we suspect the DR path - used for the target port. - Find it and replace it with an alternate path. - This is true only if the destination lid is not 0xFFFF, since - then we are aiming for a specific path and not specific destination - lid. - */ - /* For now - do not add the alternate dr path to the release */ -#if 0 - if (p_madw->mad_addr.dest_lid != 0xFFFF) { - osm_physp_t *p_physp = osm_get_physp_by_mad_addr(p_ctrl->p_log, - p_ctrl->p_subn, - &(p_madw-> - mad_addr)); - if (!p_physp) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3114: " - "Failed to find the corresponding phys port\n"); - } else { - osm_physp_replace_dr_path_with_alternate_dr_path - (p_ctrl->p_log, p_ctrl->p_subn, p_physp, - p_madw->h_bind); - } - } -#endif - - /* - An error occurred. No response was received to a request MAD. - Retire the original request MAD. - */ - sm_mad_ctrl_update_wire_stats(p_ctrl); - - if (osm_madw_get_err_msg(p_madw) != CL_DISP_MSGID_NONE) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, - "Posting Dispatcher message %s\n", - osm_get_disp_msg_str(osm_madw_get_err_msg(p_madw))); - - status = cl_disp_post(p_ctrl->h_disp, - osm_madw_get_err_msg(p_madw), p_madw, - sm_mad_ctrl_disp_done_callback, p_ctrl); - if (status != CL_SUCCESS) - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3115: " - "Dispatcher post message failed (%s)\n", - CL_STATUS_MSG(status)); - } else - /* - No error message was provided, just retire the MAD. - */ - sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw); - - OSM_LOG_EXIT(p_ctrl->p_log); -} - -/* - * PARAMETERS - * - * RETURN VALUES - * - * NOTES - * - * SEE ALSO - *********/ - -void osm_sm_mad_ctrl_construct(IN osm_sm_mad_ctrl_t * p_ctrl) -{ - CL_ASSERT(p_ctrl); - memset(p_ctrl, 0, sizeof(*p_ctrl)); - p_ctrl->h_disp = CL_DISP_INVALID_HANDLE; -} - -void osm_sm_mad_ctrl_destroy(IN osm_sm_mad_ctrl_t * p_ctrl) -{ - CL_ASSERT(p_ctrl); - - if (p_ctrl->h_bind != CL_DISP_INVALID_HANDLE) - osm_vendor_unbind(p_ctrl->h_bind); - cl_disp_unregister(p_ctrl->h_disp); -} - -ib_api_status_t osm_sm_mad_ctrl_init(IN osm_sm_mad_ctrl_t * p_ctrl, - IN osm_subn_t * p_subn, - IN osm_mad_pool_t * p_mad_pool, - IN osm_vl15_t * p_vl15, - IN osm_vendor_t * p_vendor, - IN osm_log_t * p_log, - IN osm_stats_t * p_stats, - IN cl_plock_t * p_lock, - IN cl_dispatcher_t * p_disp) -{ - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_log); - - osm_sm_mad_ctrl_construct(p_ctrl); - - p_ctrl->p_subn = p_subn; - p_ctrl->p_log = p_log; - p_ctrl->p_disp = p_disp; - p_ctrl->p_mad_pool = p_mad_pool; - p_ctrl->p_vendor = p_vendor; - p_ctrl->p_stats = p_stats; - p_ctrl->p_lock = p_lock; - p_ctrl->p_vl15 = p_vl15; - - p_ctrl->h_disp = cl_disp_register(p_disp, CL_DISP_MSGID_NONE, NULL, - NULL); - - if (p_ctrl->h_disp == CL_DISP_INVALID_HANDLE) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 3116: " - "Dispatcher registration failed\n"); - status = IB_INSUFFICIENT_RESOURCES; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -ib_api_status_t osm_sm_mad_ctrl_bind(IN osm_sm_mad_ctrl_t * p_ctrl, - IN ib_net64_t port_guid) -{ - osm_bind_info_t bind_info; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_ctrl->p_log); - - if (p_ctrl->h_bind != OSM_BIND_INVALID_HANDLE) { - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3117: " - "Multiple binds not allowed\n"); - status = IB_ERROR; - goto Exit; - } - - bind_info.class_version = 1; - bind_info.is_report_processor = FALSE; - bind_info.is_responder = TRUE; - bind_info.is_trap_processor = TRUE; - bind_info.mad_class = IB_MCLASS_SUBN_DIR; - bind_info.port_guid = port_guid; - bind_info.recv_q_size = OSM_SM_DEFAULT_QP0_RCV_SIZE; - bind_info.send_q_size = OSM_SM_DEFAULT_QP0_SEND_SIZE; - bind_info.timeout = p_ctrl->p_subn->opt.transaction_timeout; - bind_info.retries = p_ctrl->p_subn->opt.transaction_retries; - - OSM_LOG(p_ctrl->p_log, OSM_LOG_VERBOSE, - "Binding to port 0x%" PRIx64 "\n", cl_ntoh64(port_guid)); - - p_ctrl->h_bind = osm_vendor_bind(p_ctrl->p_vendor, &bind_info, - p_ctrl->p_mad_pool, - sm_mad_ctrl_rcv_callback, - sm_mad_ctrl_send_err_cb, p_ctrl); - - if (p_ctrl->h_bind == OSM_BIND_INVALID_HANDLE) { - status = IB_ERROR; - OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3118: " - "Vendor specific bind failed\n"); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_ctrl->p_log); - return status; -} diff --git a/branches/opensm_3/user/opensm/osm_sm_state_mgr.c b/branches/opensm_3/user/opensm/osm_sm_state_mgr.c deleted file mode 100644 index a8acd3d2..00000000 --- a/branches/opensm_3/user/opensm/osm_sm_state_mgr.c +++ /dev/null @@ -1,540 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_sm_state_mgr_t. - * This file implements the SM State Manager object. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void osm_report_sm_state(osm_sm_t * sm) -{ - char buf[64]; - const char *state_str = osm_get_sm_mgr_state_str(sm->p_subn->sm_state); - - osm_log(sm->p_log, OSM_LOG_SYS, "Entering %s state\n", state_str); - snprintf(buf, sizeof(buf), "ENTERING SM %s STATE", state_str); - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, buf); -} - -static void sm_state_mgr_send_master_sm_info_req(osm_sm_t * sm) -{ - osm_madw_context_t context; - const osm_port_t *p_port; - ib_api_status_t status; - - OSM_LOG_ENTER(sm->p_log); - - memset(&context, 0, sizeof(context)); - if (sm->p_subn->sm_state == IB_SMINFO_STATE_STANDBY) { - /* - * We are in STANDBY state - this means we need to poll the - * master SM (according to master_guid). - * Send a query of SubnGet(SMInfo) to the subn - * master_sm_base_lid object. - */ - p_port = osm_get_port_by_guid(sm->p_subn, sm->master_sm_guid); - } else { - /* - * We are not in STANDBY - this means we are in MASTER state - - * so we need to poll the SM that is saved in p_polling_sm - * under sm. - * Send a query of SubnGet(SMInfo) to that SM. - */ - p_port = sm->p_polling_sm->p_port; - } - if (p_port == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3203: " - "No port object for GUID 0x%016" PRIx64 "\n", - cl_ntoh64(sm->master_sm_guid)); - goto Exit; - } - - context.smi_context.port_guid = p_port->guid; - context.smi_context.set_method = FALSE; - - status = osm_req_get(sm, osm_physp_get_dr_path_ptr(p_port->p_physp), - IB_MAD_ATTR_SM_INFO, 0, CL_DISP_MSGID_NONE, - &context); - - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3204: " - "Failure requesting SMInfo (%s)\n", - ib_get_err_str(status)); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -static void sm_state_mgr_start_polling(osm_sm_t * sm) -{ - uint32_t timeout = sm->p_subn->opt.sminfo_polling_timeout; - cl_status_t cl_status; - - OSM_LOG_ENTER(sm->p_log); - - /* - * Init the retry_number back to zero - need to restart counting - */ - sm->retry_number = 0; - - /* - * Send a SubnGet(SMInfo) query to the current (or new) master found. - */ - sm_state_mgr_send_master_sm_info_req(sm); - - /* - * Start a timer that will wake up every sminfo_polling_timeout milliseconds. - * The callback of the timer will send a SubnGet(SMInfo) to the Master SM - * and restart the timer - */ - cl_status = cl_timer_start(&sm->polling_timer, timeout); - if (cl_status != CL_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3210: " - "Failed to start timer\n"); - - OSM_LOG_EXIT(sm->p_log); -} - -void osm_sm_state_mgr_polling_callback(IN void *context) -{ - osm_sm_t *sm = context; - uint32_t timeout = sm->p_subn->opt.sminfo_polling_timeout; - cl_status_t cl_status; - - OSM_LOG_ENTER(sm->p_log); - - /* - * We can be here in one of two cases: - * 1. We are a STANDBY sm polling on the master SM. - * 2. We are a MASTER sm, waiting for a handover from a remote master sm. - * If we are not in one of these cases - don't need to restart the poller. - */ - if (!((sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER && - sm->p_polling_sm != NULL) || - sm->p_subn->sm_state == IB_SMINFO_STATE_STANDBY)) - goto Exit; - - /* - * If we are a STANDBY sm and the osm_exit_flag is set, then let's - * signal the subnet_up. This is relevant for the case of running only - * once. In that case - the program is stuck until this signal is - * received. In other cases - it is not relevant whether or not the - * signal is on - since we are currently in exit flow - */ - if (sm->p_subn->sm_state == IB_SMINFO_STATE_STANDBY && osm_exit_flag) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Signalling subnet_up_event\n"); - cl_event_signal(&sm->subnet_up_event); - goto Exit; - } - - /* - * Incr the retry number. - * If it reached the max_retry_number in the subnet opt - call - * osm_sm_state_mgr_process with signal OSM_SM_SIGNAL_POLLING_TIMEOUT - */ - sm->retry_number++; - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, "Retry number:%d\n", - sm->retry_number); - - if (sm->retry_number >= sm->p_subn->opt.polling_retry_number) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Reached polling_retry_number value in retry_number. " - "Go to DISCOVERY state\n"); - osm_sm_state_mgr_process(sm, OSM_SM_SIGNAL_POLLING_TIMEOUT); - goto Exit; - } - - /* Send a SubnGet(SMInfo) request to the remote sm (depends on our state) */ - sm_state_mgr_send_master_sm_info_req(sm); - - /* restart the timer */ - cl_status = cl_timer_start(&sm->polling_timer, timeout); - if (cl_status != CL_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3211: " - "Failed to restart timer\n"); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -static void sm_state_mgr_signal_error(osm_sm_t * sm, IN osm_sm_signal_t signal) -{ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3207: " - "Invalid signal %s in state %s\n", - osm_get_sm_mgr_signal_str(signal), - osm_get_sm_mgr_state_str(sm->p_subn->sm_state)); -} - -void osm_sm_state_mgr_signal_master_is_alive(osm_sm_t * sm) -{ - OSM_LOG_ENTER(sm->p_log); - sm->retry_number = 0; - OSM_LOG_EXIT(sm->p_log); -} - -ib_api_status_t osm_sm_state_mgr_process(osm_sm_t * sm, - IN osm_sm_signal_t signal) -{ - ib_api_status_t status = IB_SUCCESS; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - /* - * The state lock prevents many race conditions from screwing - * up the state transition process. - */ - cl_spinlock_acquire(&sm->state_lock); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Received signal %s in state %s\n", - osm_get_sm_mgr_signal_str(signal), - osm_get_sm_mgr_state_str(sm->p_subn->sm_state)); - - switch (sm->p_subn->sm_state) { - case IB_SMINFO_STATE_DISCOVERING: - switch (signal) { - case OSM_SM_SIGNAL_DISCOVERY_COMPLETED: - /* - * Update the state of the SM to MASTER - */ - /* Turn on the first_time_master_sweep flag */ - sm->p_subn->first_time_master_sweep = TRUE; - sm->p_subn->sm_state = IB_SMINFO_STATE_MASTER; - osm_report_sm_state(sm); - /* - * Make sure to set the subnet master_sm_base_lid - * to the sm_base_lid value - */ - sm->p_subn->master_sm_base_lid = - sm->p_subn->sm_base_lid; - break; - case OSM_SM_SIGNAL_MASTER_OR_HIGHER_SM_DETECTED: - /* - * Finished all discovery actions - move to STANDBY - * start the polling - */ - sm->p_subn->sm_state = IB_SMINFO_STATE_STANDBY; - osm_report_sm_state(sm); - /* - * Since another SM is doing the LFT config - we should not - * ignore the results of it - */ - sm->p_subn->ignore_existing_lfts = FALSE; - - sm_state_mgr_start_polling(sm); - break; - case OSM_SM_SIGNAL_HANDOVER: - /* - * Do nothing. We will discover it later on. If we already discovered - * this SM, and got the HANDOVER - this means the remote SM is of - * lower priority. In this case we will stop polling it (since it is - * a lower priority SM in STANDBY state). - */ - break; - default: - sm_state_mgr_signal_error(sm, signal); - status = IB_INVALID_PARAMETER; - break; - } - break; - - case IB_SMINFO_STATE_STANDBY: - switch (signal) { - case OSM_SM_SIGNAL_POLLING_TIMEOUT: - case OSM_SM_SIGNAL_DISCOVER: - /* - * case 1: Polling timeout occured - this means that the Master SM - * is no longer alive. - * case 2: Got a signal to move to DISCOVERING - * Move to DISCOVERING state and start sweeping - */ - sm->p_subn->sm_state = IB_SMINFO_STATE_DISCOVERING; - osm_report_sm_state(sm); - sm->p_subn->coming_out_of_standby = TRUE; - osm_sm_signal(sm, OSM_SIGNAL_SWEEP); - break; - case OSM_SM_SIGNAL_DISABLE: - /* - * Update the state to NOT_ACTIVE - */ - sm->p_subn->sm_state = IB_SMINFO_STATE_NOTACTIVE; - osm_report_sm_state(sm); - osm_vendor_set_sm(sm->mad_ctrl.h_bind, FALSE); - break; - case OSM_SM_SIGNAL_HANDOVER: - /* - * Update the state to MASTER, and start sweeping - * OPTIONAL: send ACKNOWLEDGE - */ - /* Turn on the first_time_master_sweep flag */ - sm->p_subn->first_time_master_sweep = TRUE; - /* - * Turn on the force_heavy_sweep - we want a - * heavy sweep to occur on the first sweep of this SM. - */ - sm->p_subn->force_heavy_sweep = TRUE; - - sm->p_subn->sm_state = IB_SMINFO_STATE_MASTER; - osm_report_sm_state(sm); - /* - * Make sure to set the subnet master_sm_base_lid - * to the sm_base_lid value - */ - sm->p_subn->master_sm_base_lid = - sm->p_subn->sm_base_lid; - sm->p_subn->coming_out_of_standby = TRUE; - osm_sm_signal(sm, OSM_SIGNAL_SWEEP); - break; - case OSM_SM_SIGNAL_ACKNOWLEDGE: - /* - * Do nothing - already moved to STANDBY - */ - break; - default: - sm_state_mgr_signal_error(sm, signal); - status = IB_INVALID_PARAMETER; - break; - } - break; - - case IB_SMINFO_STATE_NOTACTIVE: - switch (signal) { - case OSM_SM_SIGNAL_STANDBY: - /* - * Update the state to STANDBY - * start the polling - */ - sm->p_subn->sm_state = IB_SMINFO_STATE_STANDBY; - osm_report_sm_state(sm); - sm_state_mgr_start_polling(sm); - break; - default: - sm_state_mgr_signal_error(sm, signal); - status = IB_INVALID_PARAMETER; - break; - } - break; - - case IB_SMINFO_STATE_MASTER: - switch (signal) { - case OSM_SM_SIGNAL_POLLING_TIMEOUT: - /* - * We received a polling timeout - this means that we - * waited for a remote master sm to send us a handover, - * but didn't get it, and didn't get a response from - * that remote sm. - * We want to force a heavy sweep - hopefully this - * occurred because the remote sm died, and we'll find - * this out and configure the subnet after a heavy sweep. - * We also want to clear the p_polling_sm object - since - * we are done polling on that remote sm - we are - * sweeping again. - */ - case OSM_SM_SIGNAL_HANDOVER: - /* - * If we received a handover in a master state - then we - * want to force a heavy sweep. This means that either - * we are in a sweep currently - in this case - no - * change, or we are in idle state - since we - * recognized a master SM before - so we want to make a - * heavy sweep and reconfigure the new subnet. - * We also want to clear the p_polling_sm object - since - * we are done polling on that remote sm - we got a - * handover from it. - */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Forcing heavy sweep. " - "Received OSM_SM_SIGNAL_HANDOVER or OSM_SM_SIGNAL_POLLING_TIMEOUT\n"); - sm->p_polling_sm = NULL; - sm->p_subn->force_heavy_sweep = TRUE; - osm_sm_signal(sm, OSM_SIGNAL_SWEEP); - break; - case OSM_SM_SIGNAL_HANDOVER_SENT: - /* - * Just sent a HANDOVER signal - move to STANDBY - * start the polling - */ - sm->p_subn->sm_state = IB_SMINFO_STATE_STANDBY; - osm_report_sm_state(sm); - sm_state_mgr_start_polling(sm); - break; - case OSM_SM_SIGNAL_WAIT_FOR_HANDOVER: - /* - * We found a remote master SM, and we are waiting for - * it to handover the mastership to us. Need to start - * polling that SM, to make sure it is alive, if it - * isn't - then we should move back to discovering, - * since something must have happened to it. - */ - sm_state_mgr_start_polling(sm); - break; - case OSM_SM_SIGNAL_DISCOVER: - sm->p_subn->sm_state = IB_SMINFO_STATE_DISCOVERING; - osm_report_sm_state(sm); - break; - default: - sm_state_mgr_signal_error(sm, signal); - status = IB_INVALID_PARAMETER; - break; - } - break; - - default: - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3208: " - "Invalid state %s\n", - osm_get_sm_mgr_state_str(sm->p_subn->sm_state)); - - } - - cl_spinlock_release(&sm->state_lock); - - OSM_LOG_EXIT(sm->p_log); - return status; -} - -ib_api_status_t osm_sm_state_mgr_check_legality(osm_sm_t * sm, - IN osm_sm_signal_t signal) -{ - ib_api_status_t status = IB_SUCCESS; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - /* - * The state lock prevents many race conditions from screwing - * up the state transition process. - */ - cl_spinlock_acquire(&sm->state_lock); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Received signal %s in state %s\n", - osm_get_sm_mgr_signal_str(signal), - osm_get_sm_mgr_state_str(sm->p_subn->sm_state)); - - switch (sm->p_subn->sm_state) { - case IB_SMINFO_STATE_DISCOVERING: - switch (signal) { - case OSM_SM_SIGNAL_DISCOVERY_COMPLETED: - case OSM_SM_SIGNAL_MASTER_OR_HIGHER_SM_DETECTED: - case OSM_SM_SIGNAL_HANDOVER: - status = IB_SUCCESS; - break; - default: - sm_state_mgr_signal_error(sm, signal); - status = IB_INVALID_PARAMETER; - break; - } - break; - - case IB_SMINFO_STATE_STANDBY: - switch (signal) { - case OSM_SM_SIGNAL_POLLING_TIMEOUT: - case OSM_SM_SIGNAL_DISCOVER: - case OSM_SM_SIGNAL_DISABLE: - case OSM_SM_SIGNAL_HANDOVER: - case OSM_SM_SIGNAL_ACKNOWLEDGE: - status = IB_SUCCESS; - break; - default: - sm_state_mgr_signal_error(sm, signal); - status = IB_INVALID_PARAMETER; - break; - } - break; - - case IB_SMINFO_STATE_NOTACTIVE: - switch (signal) { - case OSM_SM_SIGNAL_STANDBY: - status = IB_SUCCESS; - break; - default: - sm_state_mgr_signal_error(sm, signal); - status = IB_INVALID_PARAMETER; - break; - } - break; - - case IB_SMINFO_STATE_MASTER: - switch (signal) { - case OSM_SM_SIGNAL_HANDOVER: - case OSM_SM_SIGNAL_HANDOVER_SENT: - status = IB_SUCCESS; - break; - default: - sm_state_mgr_signal_error(sm, signal); - status = IB_INVALID_PARAMETER; - break; - } - break; - - default: - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3209: " - "Invalid state %s\n", - osm_get_sm_mgr_state_str(sm->p_subn->sm_state)); - status = IB_INVALID_PARAMETER; - - } - - cl_spinlock_release(&sm->state_lock); - - OSM_LOG_EXIT(sm->p_log); - return status; -} diff --git a/branches/opensm_3/user/opensm/osm_sminfo_rcv.c b/branches/opensm_3/user/opensm/osm_sminfo_rcv.c deleted file mode 100755 index 48d801f3..00000000 --- a/branches/opensm_3/user/opensm/osm_sminfo_rcv.c +++ /dev/null @@ -1,590 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_sminfo_rcv_t. - * This object represents the SMInfo Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/********************************************************************** - Return TRUE if the remote sm given (by ib_sm_info_t) is higher, - return FALSE otherwise. - By higher - we mean: SM with higher priority or with same priority - and lower GUID. -**********************************************************************/ -static boolean_t smi_rcv_remote_sm_is_higher(IN osm_sm_t * sm, - IN const ib_sm_info_t * p_rem_smi) -{ - return osm_sm_is_greater_than(ib_sminfo_get_priority(p_rem_smi), - p_rem_smi->guid, - sm->p_subn->opt.sm_priority, - sm->p_subn->sm_port_guid); - -} - -static void smi_rcv_process_get_request(IN osm_sm_t * sm, - IN const osm_madw_t * p_madw) -{ - uint8_t payload[IB_SMP_DATA_SIZE]; - ib_smp_t *p_smp; - ib_sm_info_t *p_smi = (ib_sm_info_t *) payload; - ib_api_status_t status; - ib_sm_info_t *p_remote_smi; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - /* No real need to grab the lock for this function. */ - memset(payload, 0, sizeof(payload)); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - CL_ASSERT(p_smp->method == IB_MAD_METHOD_GET); - - p_smi->guid = sm->p_subn->sm_port_guid; - p_smi->act_count = cl_hton32(sm->p_subn->p_osm->stats.qp0_mads_sent); - p_smi->pri_state = (uint8_t) (sm->p_subn->sm_state | - sm->p_subn->opt.sm_priority << 4); - /* - p.840 line 20 - Return 0 for the SM key unless we authenticate the - requester as the master SM. - */ - p_remote_smi = ib_smp_get_payload_ptr(osm_madw_get_smp_ptr(p_madw)); - if (ib_sminfo_get_state(p_remote_smi) == IB_SMINFO_STATE_MASTER) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Responding to master SM with real sm_key\n"); - p_smi->sm_key = sm->p_subn->opt.sm_key; - } else { - /* The requester is not authenticated as master - set sm_key to zero. */ - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Responding to SM not master with zero sm_key\n"); - p_smi->sm_key = 0; - } - - status = osm_resp_send(sm, p_madw, 0, payload); - if (status != IB_SUCCESS) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F02: " - "Error sending response (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - * Check if the p_smp received is legal. - * Current checks: - * MADHeader:AttributeModifier of ACKNOWLEDGE that was not sent by a - * Standby SM. - * MADHeader:AttributeModifiers of HANDOVER/DISABLE/STANDBY/DISCOVER - * that was not sent by a Master SM. - * FUTURE - TO DO: - * Check that the SM_Key matches. - **********************************************************************/ -static ib_api_status_t smi_rcv_check_set_req_legality(IN const ib_smp_t * p_smp) -{ - ib_sm_info_t *p_smi; - - p_smi = ib_smp_get_payload_ptr(p_smp); - - if (p_smp->attr_mod == IB_SMINFO_ATTR_MOD_ACKNOWLEDGE) { - if (ib_sminfo_get_state(p_smi) == IB_SMINFO_STATE_STANDBY) - return IB_SUCCESS; - } else if (p_smp->attr_mod == IB_SMINFO_ATTR_MOD_HANDOVER || - p_smp->attr_mod == IB_SMINFO_ATTR_MOD_DISABLE || - p_smp->attr_mod == IB_SMINFO_ATTR_MOD_STANDBY || - p_smp->attr_mod == IB_SMINFO_ATTR_MOD_DISCOVER) { - if (ib_sminfo_get_state(p_smi) == IB_SMINFO_STATE_MASTER) - return IB_SUCCESS; - } - - return IB_INVALID_PARAMETER; -} - -static void smi_rcv_process_set_request(IN osm_sm_t * sm, - IN const osm_madw_t * p_madw) -{ - uint8_t payload[IB_SMP_DATA_SIZE]; - ib_smp_t *p_smp; - ib_sm_info_t *p_smi = (ib_sm_info_t *) payload; - ib_sm_info_t *sm_smi; - ib_api_status_t status; - osm_sm_signal_t sm_signal; - ib_sm_info_t *p_remote_smi; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - memset(payload, 0, sizeof(payload)); - - p_smp = osm_madw_get_smp_ptr(p_madw); - sm_smi = ib_smp_get_payload_ptr(p_smp); - - if (p_smp->method != IB_MAD_METHOD_SET) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F03: " - "Unsupported method 0x%X\n", p_smp->method); - goto Exit; - } - - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - - p_smi->guid = sm->p_subn->sm_port_guid; - p_smi->act_count = cl_hton32(sm->p_subn->p_osm->stats.qp0_mads_sent); - p_smi->pri_state = (uint8_t) (sm->p_subn->sm_state | - sm->p_subn->opt.sm_priority << 4); - /* - p.840 line 20 - Return 0 for the SM key unless we authenticate the - requester as the master SM. - */ - p_remote_smi = ib_smp_get_payload_ptr(osm_madw_get_smp_ptr(p_madw)); - if (ib_sminfo_get_state(p_remote_smi) == IB_SMINFO_STATE_MASTER) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Responding to master SM with real sm_key\n"); - p_smi->sm_key = sm->p_subn->opt.sm_key; - } else { - /* The requester is not authenticated as master - set sm_key to zero. */ - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Responding to SM not master with zero sm_key\n"); - p_smi->sm_key = 0; - } - - /* Check the legality of the packet */ - status = smi_rcv_check_set_req_legality(p_smp); - if (status != IB_SUCCESS) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F04: " - "Check legality failed. AttributeModifier:0x%X RemoteState:%s\n", - p_smp->attr_mod, - osm_get_sm_mgr_state_str(ib_sminfo_get_state(sm_smi))); - status = osm_resp_send(sm, p_madw, 7, payload); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F05: " - "Error sending response (%s)\n", - ib_get_err_str(status)); - CL_PLOCK_RELEASE(sm->p_lock); - goto Exit; - } - - /* translate from IB_SMINFO_ATTR to OSM_SM_SIGNAL */ - switch (p_smp->attr_mod) { - case IB_SMINFO_ATTR_MOD_HANDOVER: - sm_signal = OSM_SM_SIGNAL_HANDOVER; - break; - case IB_SMINFO_ATTR_MOD_ACKNOWLEDGE: - sm_signal = OSM_SM_SIGNAL_ACKNOWLEDGE; - break; - case IB_SMINFO_ATTR_MOD_DISABLE: - sm_signal = OSM_SM_SIGNAL_DISABLE; - break; - case IB_SMINFO_ATTR_MOD_STANDBY: - sm_signal = OSM_SM_SIGNAL_STANDBY; - break; - case IB_SMINFO_ATTR_MOD_DISCOVER: - sm_signal = OSM_SM_SIGNAL_DISCOVER; - break; - default: - /* - This code shouldn't be reached - checked in the - check legality - */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F06: " - "THIS CODE SHOULD NOT BE REACHED!!\n"); - CL_PLOCK_RELEASE(sm->p_lock); - goto Exit; - } - - /* check legality of the needed transition in the SM state machine */ - status = osm_sm_state_mgr_check_legality(sm, sm_signal); - if (status != IB_SUCCESS) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F07: " - "Failed check of legality of needed SM transition. " - "AttributeModifier:0x%X RemoteState:%s\n", - p_smp->attr_mod, - osm_get_sm_mgr_state_str(ib_sminfo_get_state(sm_smi))); - status = osm_resp_send(sm, p_madw, 7, payload); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F08: " - "Error sending response (%s)\n", - ib_get_err_str(status)); - CL_PLOCK_RELEASE(sm->p_lock); - goto Exit; - } - - /* the SubnSet(SMInfo) command is ok. Send a response. */ - status = osm_resp_send(sm, p_madw, 0, payload); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F09: " - "Error sending response (%s)\n", - ib_get_err_str(status)); - - /* it is a legal packet - act according to it */ - - /* if the AttributeModifier is STANDBY - need to save on the sm in */ - /* the master_sm_guid variable - the guid of the current master. */ - if (p_smp->attr_mod == IB_SMINFO_ATTR_MOD_STANDBY) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Received a STANDBY signal. Updating " - "sm_state_mgr master_guid: 0x%016" PRIx64 "\n", - cl_ntoh64(sm_smi->guid)); - sm->master_sm_guid = sm_smi->guid; - } - - CL_PLOCK_RELEASE(sm->p_lock); - status = osm_sm_state_mgr_process(sm, sm_signal); - - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F10: " - "Error in SM state transition (%s)\n", - ib_get_err_str(status)); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -static int smi_rcv_process_get_sm(IN osm_sm_t * sm, - IN const osm_remote_sm_t * p_sm, - boolean_t light_sweep) -{ - const ib_sm_info_t *p_smi; - - OSM_LOG_ENTER(sm->p_log); - - p_smi = &p_sm->smi; - - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Detected SM 0x%016" PRIx64 " in state %u\n", - cl_ntoh64(p_smi->guid), ib_sminfo_get_state(p_smi)); - - /* Check the state of this SM vs. our own. */ - switch (sm->p_subn->sm_state) { - case IB_SMINFO_STATE_NOTACTIVE: - break; - - case IB_SMINFO_STATE_DISCOVERING: - switch (ib_sminfo_get_state(p_smi)) { - case IB_SMINFO_STATE_NOTACTIVE: - break; - case IB_SMINFO_STATE_MASTER: - sm->master_sm_found = 1; - /* save on the sm the guid of the current master. */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Found master SM. Updating sm_state_mgr master_guid: 0x%016" - PRIx64 "\n", cl_ntoh64(p_sm->p_port->guid)); - sm->master_sm_guid = p_sm->p_port->guid; - break; - case IB_SMINFO_STATE_DISCOVERING: - case IB_SMINFO_STATE_STANDBY: - if (smi_rcv_remote_sm_is_higher(sm, p_smi)) { - /* the remote is a higher sm - need to stop sweeping */ - sm->master_sm_found = 1; - /* save on the sm the guid of the higher SM we found - */ - /* we will poll it - as long as it lives - we should be in Standby. */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Found higher SM. Updating sm_state_mgr master_guid:" - " 0x%016" PRIx64 "\n", - cl_ntoh64(p_sm->p_port->guid)); - sm->master_sm_guid = p_sm->p_port->guid; - } - break; - default: - break; - } - break; - - case IB_SMINFO_STATE_STANDBY: - /* if the guid of the SM that sent us this response is equal to the */ - /* p_sm_mgr->master_guid - then this is a signal that the polling */ - switch (ib_sminfo_get_state(p_smi)) { - case IB_SMINFO_STATE_MASTER: - /* This means the master is alive */ - /* Signal that to the SM state mgr */ - osm_sm_state_mgr_signal_master_is_alive(sm); - - if (!smi_rcv_remote_sm_is_higher(sm, p_smi)) - osm_send_trap144(sm, - TRAP_144_MASK_SM_PRIORITY_CHANGE); - break; - case IB_SMINFO_STATE_STANDBY: - /* This should be the response from the sm we are polling. */ - /* If it is - then signal master is alive */ - if (sm->master_sm_guid == p_sm->p_port->guid) { - /* Make sure that it is an SM with higher priority than us. - If we started polling it when it was master, and it moved - to standby - then it might be with a lower priority than - us - and then we don't want to continue polling it. */ - if (smi_rcv_remote_sm_is_higher(sm, p_smi)) - osm_sm_state_mgr_signal_master_is_alive - (sm); - } - break; - default: - /* any other state - do nothing */ - break; - } - break; - - case IB_SMINFO_STATE_MASTER: - switch (ib_sminfo_get_state(p_smi)) { - case IB_SMINFO_STATE_MASTER: - /* If this is a response due to our polling, this means that we are - waiting for a handover from this SM, and it is still alive - - signal that. */ - if (sm->p_polling_sm) - osm_sm_state_mgr_signal_master_is_alive(sm); - else { - /* This is a response we got while sweeping the subnet. - We will handle a case of handover needed later on, when the sweep - is done and all SMs are recongnized. */ - } - break; - case IB_SMINFO_STATE_STANDBY: - if (light_sweep && - smi_rcv_remote_sm_is_higher(sm, p_smi)) - sm->p_subn->force_heavy_sweep = TRUE; - break; - default: - /* any other state - do nothing */ - break; - } - break; - - default: - break; - } - - OSM_LOG_EXIT(sm->p_log); - return 0; -} - -static void smi_rcv_process_get_response(IN osm_sm_t * sm, - IN const osm_madw_t * p_madw) -{ - const ib_smp_t *p_smp; - const ib_sm_info_t *p_smi; - cl_qmap_t *p_sm_tbl; - osm_port_t *p_port; - ib_net64_t port_guid; - osm_remote_sm_t *p_sm; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - if (p_smp->method != IB_MAD_METHOD_GET_RESP) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F11: " - "Unsupported method 0x%X\n", p_smp->method); - goto Exit; - } - - p_smi = ib_smp_get_payload_ptr(p_smp); - p_sm_tbl = &sm->p_subn->sm_guid_tbl; - port_guid = p_smi->guid; - - osm_dump_sm_info(sm->p_log, p_smi, OSM_LOG_DEBUG); - - /* Check that the sm_key of the found SM is the same as ours, - or is zero. If not - OpenSM cannot continue with configuration!. */ - if (p_smi->sm_key != 0 && p_smi->sm_key != sm->p_subn->opt.sm_key) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F18: " - "Got SM with sm_key that doesn't match our " - "local key. Exiting\n"); - osm_log(sm->p_log, OSM_LOG_SYS, - "Found remote SM with non-matching sm_key. Exiting\n"); - osm_exit_flag = TRUE; - goto Exit; - } - - /* Determine if we already have another SM object for this SM. */ - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F12: " - "No port object for this SM\n"); - goto _unlock_and_exit; - } - - if (osm_port_get_guid(p_port) != p_smi->guid) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F13: " - "Bogus SM port GUID\n\t\t\t\tExpected 0x%016" PRIx64 - ", Received 0x%016" PRIx64 "\n", - cl_ntoh64(osm_port_get_guid(p_port)), - cl_ntoh64(p_smi->guid)); - goto _unlock_and_exit; - } - - if (port_guid == sm->p_subn->sm_port_guid) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Self query response received - SM port 0x%016" PRIx64 - "\n", cl_ntoh64(port_guid)); - goto _unlock_and_exit; - } - - p_sm = (osm_remote_sm_t *) cl_qmap_get(p_sm_tbl, port_guid); - if (p_sm == (osm_remote_sm_t *) cl_qmap_end(p_sm_tbl)) { - p_sm = malloc(sizeof(*p_sm)); - if (p_sm == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F14: " - "Unable to allocate SM object\n"); - goto _unlock_and_exit; - } - - osm_remote_sm_init(p_sm, p_port, p_smi); - - cl_qmap_insert(p_sm_tbl, port_guid, &p_sm->map_item); - } else - /* We already know this SM. Update the SMInfo attribute. */ - p_sm->smi = *p_smi; - - smi_rcv_process_get_sm(sm, p_sm, - osm_madw_get_smi_context_ptr(p_madw)-> - light_sweep); - -_unlock_and_exit: - CL_PLOCK_RELEASE(sm->p_lock); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -static void smi_rcv_process_set_response(IN osm_sm_t * sm, - IN const osm_madw_t * p_madw) -{ - const ib_smp_t *p_smp; - const ib_sm_info_t *p_smi; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - if (p_smp->method != IB_MAD_METHOD_GET_RESP) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F16: " - "Unsupported method 0x%X\n", p_smp->method); - goto Exit; - } - - p_smi = ib_smp_get_payload_ptr(p_smp); - osm_dump_sm_info(sm->p_log, p_smi, OSM_LOG_DEBUG); - - /* Check the AttributeModifier */ - if (p_smp->attr_mod != IB_SMINFO_ATTR_MOD_HANDOVER) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F17: " - "Unsupported attribute modifier 0x%X\n", - p_smp->attr_mod); - goto Exit; - } - - /* This is a response on a HANDOVER request - Nothing to do. */ - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -void osm_sminfo_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_smp_t *p_smp; - osm_smi_context_t *p_smi_context; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - /* Determine if this is a request for our own SMInfo or if - this is a response to our request for another SM's SMInfo. */ - if (ib_smp_is_response(p_smp)) { - const ib_sm_info_t *p_smi = ib_smp_get_payload_ptr(p_smp); - - /* Get the context - to see if this is a response to a Get or Set method */ - p_smi_context = osm_madw_get_smi_context_ptr(p_madw); - - /* Verify that response is from expected port and there is - no port moving issue. */ - if (p_smi_context->port_guid != p_smi->guid) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 2F19: " - "Unexpected SM port GUID in response" - "\n\t\t\t\tExpected 0x%016" PRIx64 - ", Received 0x%016" PRIx64 "\n", - cl_ntoh64(p_smi_context->port_guid), - cl_ntoh64(p_smi->guid)); - goto Exit; - } - - if (p_smi_context->set_method == FALSE) - /* this is a response to a Get method */ - smi_rcv_process_get_response(sm, p_madw); - else - /* this is a response to a Set method */ - smi_rcv_process_set_response(sm, p_madw); - } else if (p_smp->method == IB_MAD_METHOD_GET) - /* This is a SubnGet request */ - smi_rcv_process_get_request(sm, p_madw); - else - /* This should be a SubnSet request */ - smi_rcv_process_set_request(sm, p_madw); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_state_mgr.c b/branches/opensm_3/user/opensm/osm_state_mgr.c deleted file mode 100644 index 8eace476..00000000 --- a/branches/opensm_3/user/opensm/osm_state_mgr.c +++ /dev/null @@ -1,1438 +0,0 @@ -/* - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_state_mgr_t. - * This file implements the State Manager object. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern void osm_drop_mgr_process(IN osm_sm_t * sm); -extern int osm_qos_setup(IN osm_opensm_t * p_osm); -extern int osm_pkey_mgr_process(IN osm_opensm_t * p_osm); -extern int osm_mcast_mgr_process(IN osm_sm_t * sm); -extern int osm_mcast_mgr_process_mgroups(IN osm_sm_t * sm); -extern int osm_link_mgr_process(IN osm_sm_t * sm, IN uint8_t state); - -static void state_mgr_up_msg(IN const osm_sm_t * sm) -{ - /* - * This message should be written only once - when the - * SM moves to Master state and the subnet is up for - * the first time. - */ - osm_log(sm->p_log, sm->p_subn->first_time_master_sweep ? - OSM_LOG_SYS : OSM_LOG_INFO, "SUBNET UP\n"); - - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - sm->p_subn->opt.sweep_interval ? - "SUBNET UP" : "SUBNET UP (sweep disabled)"); -} - -static void state_mgr_reset_node_count(IN cl_map_item_t * p_map_item, - IN void *context) -{ - osm_node_t *p_node = (osm_node_t *) p_map_item; - - p_node->discovery_count = 0; -} - -static void state_mgr_reset_port_count(IN cl_map_item_t * p_map_item, - IN void *context) -{ - osm_port_t *p_port = (osm_port_t *) p_map_item; - - p_port->discovery_count = 0; -} - -static void state_mgr_reset_switch_count(IN cl_map_item_t * p_map_item, - IN void *context) -{ - osm_switch_t *p_sw = (osm_switch_t *) p_map_item; - - p_sw->need_update = 1; -} - -static void state_mgr_get_sw_info(IN cl_map_item_t * p_object, IN void *context) -{ - osm_node_t *p_node; - osm_dr_path_t *p_dr_path; - osm_madw_context_t mad_context; - osm_switch_t *const p_sw = (osm_switch_t *) p_object; - osm_sm_t *sm = context; - ib_api_status_t status; - - OSM_LOG_ENTER(sm->p_log); - - p_node = p_sw->p_node; - p_dr_path = - osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_node, 0)); - - memset(&mad_context, 0, sizeof(mad_context)); - - mad_context.si_context.node_guid = osm_node_get_node_guid(p_node); - mad_context.si_context.set_method = FALSE; - mad_context.si_context.light_sweep = TRUE; - - status = osm_req_get(sm, p_dr_path, IB_MAD_ATTR_SWITCH_INFO, 0, - OSM_MSG_LIGHT_SWEEP_FAIL, &mad_context); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3304: " - "Request for SwitchInfo failed (%s)\n", - ib_get_err_str(status)); - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - Initiate a remote port info request for the given physical port - **********************************************************************/ -static void state_mgr_get_remote_port_info(IN osm_sm_t * sm, - IN osm_physp_t * p_physp) -{ - osm_dr_path_t *p_dr_path; - osm_dr_path_t rem_node_dr_path; - osm_madw_context_t mad_context; - ib_api_status_t status; - - OSM_LOG_ENTER(sm->p_log); - - /* generate a dr path leaving on the physp to the remote node */ - p_dr_path = osm_physp_get_dr_path_ptr(p_physp); - memcpy(&rem_node_dr_path, p_dr_path, sizeof(osm_dr_path_t)); - if (osm_dr_path_extend(&rem_node_dr_path, osm_physp_get_port_num(p_physp))) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 332D: " - "DR path with hop count %d couldn't be extended " - "so skipping PortInfo query\n", - p_dr_path->hop_count); - goto Exit; - } - - memset(&mad_context, 0, sizeof(mad_context)); - - mad_context.pi_context.node_guid = - osm_node_get_node_guid(osm_physp_get_node_ptr(p_physp)); - mad_context.pi_context.port_guid = p_physp->port_guid; - mad_context.pi_context.set_method = FALSE; - mad_context.pi_context.light_sweep = TRUE; - mad_context.pi_context.active_transition = FALSE; - - /* note that with some negative logic - if the query failed it means - * that there is no point in going to heavy sweep */ - status = osm_req_get(sm, &rem_node_dr_path, IB_MAD_ATTR_PORT_INFO, 0, - CL_DISP_MSGID_NONE, &mad_context); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 332E: " - "Request for PortInfo failed (%s)\n", - ib_get_err_str(status)); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - Initiates a thorough sweep of the subnet. - Used when there is suspicion that something on the subnet has changed. -**********************************************************************/ -static ib_api_status_t state_mgr_sweep_hop_0(IN osm_sm_t * sm) -{ - ib_api_status_t status; - osm_dr_path_t dr_path; - osm_bind_handle_t h_bind; - uint8_t path_array[IB_SUBNET_PATH_HOPS_MAX]; - - OSM_LOG_ENTER(sm->p_log); - - memset(path_array, 0, sizeof(path_array)); - - /* - * First, get the bind handle. - */ - h_bind = osm_sm_mad_ctrl_get_bind_handle(&sm->mad_ctrl); - if (h_bind != OSM_BIND_INVALID_HANDLE) { - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "INITIATING HEAVY SWEEP"); - /* - * Start the sweep by clearing the port counts, then - * get our own NodeInfo at 0 hops. - */ - CL_PLOCK_ACQUIRE(sm->p_lock); - - cl_qmap_apply_func(&sm->p_subn->node_guid_tbl, - state_mgr_reset_node_count, sm); - - cl_qmap_apply_func(&sm->p_subn->port_guid_tbl, - state_mgr_reset_port_count, sm); - - cl_qmap_apply_func(&sm->p_subn->sw_guid_tbl, - state_mgr_reset_switch_count, sm); - - /* Set the in_sweep_hop_0 flag in subn to be TRUE. - * This will indicate the sweeping not to continue beyond the - * the current node. - * This is relevant for the case of SM on switch, since in the - * switch info we need to signal somehow not to continue - * the sweeping. */ - sm->p_subn->in_sweep_hop_0 = TRUE; - - CL_PLOCK_RELEASE(sm->p_lock); - - osm_dr_path_init(&dr_path, h_bind, 0, path_array); - status = osm_req_get(sm, &dr_path, IB_MAD_ATTR_NODE_INFO, 0, - CL_DISP_MSGID_NONE, NULL); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3305: " - "Request for NodeInfo failed (%s)\n", - ib_get_err_str(status)); - } else { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "No bound ports. Deferring sweep...\n"); - status = IB_INVALID_STATE; - } - - OSM_LOG_EXIT(sm->p_log); - return status; -} - -/********************************************************************** - Clear out all existing port lid assignments -**********************************************************************/ -static ib_api_status_t state_mgr_clean_known_lids(IN osm_sm_t * sm) -{ - ib_api_status_t status = IB_SUCCESS; - cl_ptr_vector_t *p_vec = &(sm->p_subn->port_lid_tbl); - uint32_t i; - - OSM_LOG_ENTER(sm->p_log); - - /* we need a lock here! */ - CL_PLOCK_ACQUIRE(sm->p_lock); - - for (i = 0; i < cl_ptr_vector_get_size(p_vec); i++) - cl_ptr_vector_set(p_vec, i, NULL); - - CL_PLOCK_RELEASE(sm->p_lock); - - OSM_LOG_EXIT(sm->p_log); - return status; -} - -/********************************************************************** - Notifies the transport layer that the local LID has changed, - which give it a chance to update address vectors, etc.. -**********************************************************************/ -static ib_api_status_t state_mgr_notify_lid_change(IN osm_sm_t * sm) -{ - ib_api_status_t status; - osm_bind_handle_t h_bind; - - OSM_LOG_ENTER(sm->p_log); - - /* - * First, get the bind handle. - */ - h_bind = osm_sm_mad_ctrl_get_bind_handle(&sm->mad_ctrl); - if (h_bind == OSM_BIND_INVALID_HANDLE) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3306: " - "No bound ports\n"); - status = IB_ERROR; - goto Exit; - } - - /* - * Notify the transport layer that we changed the local LID. - */ - status = osm_vendor_local_lid_change(h_bind); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3307: " - "Vendor LID update failed (%s)\n", - ib_get_err_str(status)); - -Exit: - OSM_LOG_EXIT(sm->p_log); - return status; -} - -/********************************************************************** - Returns true if the SM port is down. - The SM's port object must exist in the port_guid table. -**********************************************************************/ -static boolean_t state_mgr_is_sm_port_down(IN osm_sm_t * sm) -{ - ib_net64_t port_guid; - osm_port_t *p_port; - osm_physp_t *p_physp; - uint8_t state; - - OSM_LOG_ENTER(sm->p_log); - - port_guid = sm->p_subn->sm_port_guid; - - /* - * If we don't know our own port guid yet, assume the port is down. - */ - if (port_guid == 0) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3308: " - "SM port GUID unknown\n"); - state = IB_LINK_DOWN; - goto Exit; - } - - CL_ASSERT(port_guid); - - CL_PLOCK_ACQUIRE(sm->p_lock); - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3309: " - "SM port with GUID:%016" PRIx64 " is unknown\n", - cl_ntoh64(port_guid)); - state = IB_LINK_DOWN; - CL_PLOCK_RELEASE(sm->p_lock); - goto Exit; - } - - p_physp = p_port->p_physp; - - CL_ASSERT(p_physp); - - state = osm_physp_get_port_state(p_physp); - CL_PLOCK_RELEASE(sm->p_lock); - -Exit: - OSM_LOG_EXIT(sm->p_log); - return (state == IB_LINK_DOWN); -} - -/********************************************************************** - Sweeps the node 1 hop away. - This sets off a "chain reaction" that causes discovery of the subnet. - Used when there is suspicion that something on the subnet has changed. -**********************************************************************/ -static ib_api_status_t state_mgr_sweep_hop_1(IN osm_sm_t * sm) -{ - ib_api_status_t status = IB_SUCCESS; - osm_bind_handle_t h_bind; - osm_madw_context_t context; - osm_node_t *p_node; - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_dr_path_t *p_dr_path; - osm_dr_path_t hop_1_path; - ib_net64_t port_guid; - uint8_t port_num; - uint8_t path_array[IB_SUBNET_PATH_HOPS_MAX]; - uint8_t num_ports; - osm_physp_t *p_ext_physp; - - OSM_LOG_ENTER(sm->p_log); - - /* - * First, get our own port and node objects. - */ - port_guid = sm->p_subn->sm_port_guid; - - CL_ASSERT(port_guid); - - /* Set the in_sweep_hop_0 flag in subn to be FALSE. - * This will indicate the sweeping to continue beyond the - * the current node. - * This is relevant for the case of SM on switch, since in the - * switch info we need to signal that the sweeping should - * continue through the switch. */ - sm->p_subn->in_sweep_hop_0 = FALSE; - - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3310: " - "No SM port object\n"); - status = IB_ERROR; - goto Exit; - } - - p_node = p_port->p_node; - CL_ASSERT(p_node); - - port_num = ib_node_info_get_local_port_num(&p_node->node_info); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Probing hop 1 on local port %u\n", port_num); - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - - CL_ASSERT(p_physp); - - p_dr_path = osm_physp_get_dr_path_ptr(p_physp); - h_bind = osm_dr_path_get_bind_handle(p_dr_path); - - CL_ASSERT(h_bind != OSM_BIND_INVALID_HANDLE); - - memset(path_array, 0, sizeof(path_array)); - /* the hop_1 operations depend on the type of our node. - * Currently - legal nodes that can host SM are SW and CA */ - switch (osm_node_get_type(p_node)) { - case IB_NODE_TYPE_CA: - case IB_NODE_TYPE_ROUTER: - memset(&context, 0, sizeof(context)); - context.ni_context.node_guid = osm_node_get_node_guid(p_node); - context.ni_context.port_num = port_num; - - path_array[1] = port_num; - - osm_dr_path_init(&hop_1_path, h_bind, 1, path_array); - status = osm_req_get(sm, &hop_1_path, IB_MAD_ATTR_NODE_INFO, 0, - CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3311: " - "Request for NodeInfo failed (%s)\n", - ib_get_err_str(status)); - break; - - case IB_NODE_TYPE_SWITCH: - /* Need to go over all the ports of the switch, and send a - * node_info from them. This doesn't include the port 0 of the - * switch, which hosts the SM. - * Note: We'll send another switchInfo on port 0, since if no - * ports are connected, we still want to get some response, and - * have the subnet come up. - */ - num_ports = osm_node_get_num_physp(p_node); - for (port_num = 1; port_num < num_ports; port_num++) { - /* go through the port only if the port is not DOWN */ - p_ext_physp = osm_node_get_physp_ptr(p_node, port_num); - if (p_ext_physp && ib_port_info_get_port_state - (&(p_ext_physp->port_info)) > IB_LINK_DOWN) { - memset(&context, 0, sizeof(context)); - context.ni_context.node_guid = - osm_node_get_node_guid(p_node); - context.ni_context.port_num = port_num; - - path_array[1] = port_num; - osm_dr_path_init(&hop_1_path, h_bind, 1, - path_array); - status = osm_req_get(sm, &hop_1_path, - IB_MAD_ATTR_NODE_INFO, 0, - CL_DISP_MSGID_NONE, - &context); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 3312: " - "Request for NodeInfo failed (%s)\n", - ib_get_err_str(status)); - } - } - break; - - default: - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 3313: Unknown node type %d (%s)\n", - osm_node_get_type(p_node), p_node->print_desc); - } - -Exit: - OSM_LOG_EXIT(sm->p_log); - return status; -} - -static void query_sm_info(cl_map_item_t * item, void *cxt) -{ - osm_madw_context_t context; -#ifndef __WIN__ - osm_remote_sm_t *r_sm = cl_item_obj(item, r_sm, map_item); -#else - osm_remote_sm_t *r_sm=NULL; -#endif - osm_sm_t *sm = cxt; - ib_api_status_t ret; - -#ifdef __WIN__ - r_sm = cl_item_obj(item, r_sm, map_item); -#endif - context.smi_context.port_guid = r_sm->p_port->guid; - context.smi_context.set_method = FALSE; - context.smi_context.light_sweep = TRUE; - - ret = osm_req_get(sm, osm_physp_get_dr_path_ptr(r_sm->p_port->p_physp), - IB_MAD_ATTR_SM_INFO, 0, CL_DISP_MSGID_NONE, &context); - if (ret != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3314: " - "Failure requesting SMInfo (%s)\n", - ib_get_err_str(ret)); -} - -static void state_mgr_update_node_desc(IN cl_map_item_t * obj, IN void *context) -{ - osm_madw_context_t mad_context; - osm_node_t *p_node = (osm_node_t *) obj; - osm_sm_t *sm = context; - osm_physp_t *p_physp = NULL; - unsigned i, num_ports; - ib_api_status_t status; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_node); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Updating NodeDesc for 0x%016" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - - /* get a physp to request from. */ - num_ports = osm_node_get_num_physp(p_node); - for (i = 0; i < num_ports; i++) - if ((p_physp = osm_node_get_physp_ptr(p_node, i))) - break; - - if (!p_physp) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 331C: " - "Failed to find any valid physical port object.\n"); - goto exit; - } - - mad_context.nd_context.node_guid = osm_node_get_node_guid(p_node); - - status = osm_req_get(sm, osm_physp_get_dr_path_ptr(p_physp), - IB_MAD_ATTR_NODE_DESC, 0, CL_DISP_MSGID_NONE, - &mad_context); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 331B: Failure initiating NodeDescription request " - "(%s)\n", ib_get_err_str(status)); - -exit: - OSM_LOG_EXIT(sm->p_log); -} - -void osm_update_node_desc(IN osm_opensm_t *osm) -{ - CL_PLOCK_ACQUIRE(&osm->lock); - cl_qmap_apply_func(&osm->subn.node_guid_tbl, state_mgr_update_node_desc, - &osm->sm); - CL_PLOCK_RELEASE(&osm->lock); -} - -/********************************************************************** - During a light sweep, check each node to see if the node description - is valid and if not issue a ND query. -**********************************************************************/ -static void state_mgr_get_node_desc(IN cl_map_item_t * obj, IN void *context) -{ - osm_node_t *p_node = (osm_node_t *) obj; - osm_sm_t *sm = context; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_node); - - if (p_node->print_desc - && strcmp(p_node->print_desc, OSM_NODE_DESC_UNKNOWN)) - /* if ND is valid, do nothing */ - goto exit; - - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 3319: Unknown node description for node GUID " - "0x%016" PRIx64 ". Reissuing ND query\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - - state_mgr_update_node_desc(obj, context); - -exit: - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - Initiates a lightweight sweep of the subnet. - Used during normal sweeps after the subnet is up. -**********************************************************************/ -static ib_api_status_t state_mgr_light_sweep_start(IN osm_sm_t * sm) -{ - ib_api_status_t status = IB_SUCCESS; - osm_bind_handle_t h_bind; - cl_qmap_t *p_sw_tbl; - cl_map_item_t *p_next; - osm_node_t *p_node; - osm_physp_t *p_physp; - uint8_t port_num; - - OSM_LOG_ENTER(sm->p_log); - - p_sw_tbl = &sm->p_subn->sw_guid_tbl; - - /* - * First, get the bind handle. - */ - h_bind = osm_sm_mad_ctrl_get_bind_handle(&sm->mad_ctrl); - if (h_bind == OSM_BIND_INVALID_HANDLE) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "No bound ports. Deferring sweep...\n"); - status = IB_INVALID_STATE; - goto _exit; - } - - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, "INITIATING LIGHT SWEEP"); - CL_PLOCK_ACQUIRE(sm->p_lock); - cl_qmap_apply_func(p_sw_tbl, state_mgr_get_sw_info, sm); - CL_PLOCK_RELEASE(sm->p_lock); - - CL_PLOCK_ACQUIRE(sm->p_lock); - cl_qmap_apply_func(&sm->p_subn->node_guid_tbl, state_mgr_get_node_desc, - sm); - CL_PLOCK_RELEASE(sm->p_lock); - - /* now scan the list of physical ports that were not down but have no remote port */ - CL_PLOCK_ACQUIRE(sm->p_lock); - p_next = cl_qmap_head(&sm->p_subn->node_guid_tbl); - while (p_next != cl_qmap_end(&sm->p_subn->node_guid_tbl)) { - p_node = (osm_node_t *) p_next; - p_next = cl_qmap_next(p_next); - - for (port_num = 1; port_num < osm_node_get_num_physp(p_node); - port_num++) { - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (p_physp && (osm_physp_get_port_state(p_physp) != - IB_LINK_DOWN) - && !osm_physp_get_remote(p_physp)) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3315: " - "Unknown remote side for node 0x%016" - PRIx64 - " (%s) port %u. Adding to light sweep sampling list\n", - cl_ntoh64(osm_node_get_node_guid - (p_node)), - p_node->print_desc, port_num); - - osm_dump_dr_path(sm->p_log, - osm_physp_get_dr_path_ptr - (p_physp), OSM_LOG_ERROR); - - state_mgr_get_remote_port_info(sm, p_physp); - } - } - } - - cl_qmap_apply_func(&sm->p_subn->sm_guid_tbl, query_sm_info, sm); - - CL_PLOCK_RELEASE(sm->p_lock); - -_exit: - OSM_LOG_EXIT(sm->p_log); - return status; -} - -/********************************************************************** - * Go over all the remote SMs (as updated in the sm_guid_tbl). - * Find if there is a remote sm that is a master SM. - * If there is a remote master SM - return a pointer to it, - * else - return NULL. - **********************************************************************/ -static osm_remote_sm_t *state_mgr_exists_other_master_sm(IN osm_sm_t * sm) -{ - cl_qmap_t *p_sm_tbl; - osm_remote_sm_t *p_sm; - osm_remote_sm_t *p_sm_res = NULL; - - OSM_LOG_ENTER(sm->p_log); - - p_sm_tbl = &sm->p_subn->sm_guid_tbl; - - /* go over all the remote SMs */ - for (p_sm = (osm_remote_sm_t *) cl_qmap_head(p_sm_tbl); - p_sm != (osm_remote_sm_t *) cl_qmap_end(p_sm_tbl); - p_sm = (osm_remote_sm_t *) cl_qmap_next(&p_sm->map_item)) { - /* If the sm is in MASTER state - return a pointer to it */ - if (ib_sminfo_get_state(&p_sm->smi) == IB_SMINFO_STATE_MASTER) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Found remote master SM with guid:0x%016" PRIx64 - " (node %s)\n", cl_ntoh64(p_sm->smi.guid), - p_sm->p_port->p_node ? p_sm->p_port->p_node-> - print_desc : "UNKNOWN"); - p_sm_res = p_sm; - goto Exit; - } - } - -Exit: - OSM_LOG_EXIT(sm->p_log); - return p_sm_res; -} - -/********************************************************************** - * Go over all remote SMs (as updated in the sm_guid_tbl). - * Find the one with the highest priority and lowest guid. - * Compare this SM to the local SM. If the local SM is higher - - * return NULL, if the remote SM is higher - return a pointer to it. - **********************************************************************/ -static osm_remote_sm_t *state_mgr_get_highest_sm(IN osm_sm_t * sm) -{ - cl_qmap_t *p_sm_tbl; - osm_remote_sm_t *p_sm = NULL; - osm_remote_sm_t *p_highest_sm; - uint8_t highest_sm_priority; - ib_net64_t highest_sm_guid; - - OSM_LOG_ENTER(sm->p_log); - - p_sm_tbl = &sm->p_subn->sm_guid_tbl; - - /* Start with the local sm as the standard */ - p_highest_sm = NULL; - highest_sm_priority = sm->p_subn->opt.sm_priority; - highest_sm_guid = sm->p_subn->sm_port_guid; - - /* go over all the remote SMs */ - for (p_sm = (osm_remote_sm_t *) cl_qmap_head(p_sm_tbl); - p_sm != (osm_remote_sm_t *) cl_qmap_end(p_sm_tbl); - p_sm = (osm_remote_sm_t *) cl_qmap_next(&p_sm->map_item)) { - - /* If the sm is in NOTACTIVE state - continue */ - if (ib_sminfo_get_state(&p_sm->smi) == - IB_SMINFO_STATE_NOTACTIVE) - continue; - - if (osm_sm_is_greater_than(ib_sminfo_get_priority(&p_sm->smi), - p_sm->smi.guid, highest_sm_priority, - highest_sm_guid)) { - /* the new p_sm is with higher priority - update the highest_sm */ - /* to this sm */ - p_highest_sm = p_sm; - highest_sm_priority = - ib_sminfo_get_priority(&p_sm->smi); - highest_sm_guid = p_sm->smi.guid; - } - } - - if (p_highest_sm != NULL) - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Found higher SM with guid: %016" PRIx64 " (node %s)\n", - cl_ntoh64(p_highest_sm->smi.guid), - p_highest_sm->p_port->p_node ? - p_highest_sm->p_port->p_node->print_desc : "UNKNOWN"); - - OSM_LOG_EXIT(sm->p_log); - return p_highest_sm; -} - -/********************************************************************** - * Send SubnSet(SMInfo) SMP with HANDOVER attribute to the - * remote_sm indicated. - **********************************************************************/ -static void state_mgr_send_handover(IN osm_sm_t * sm, IN osm_remote_sm_t * p_sm) -{ - uint8_t payload[IB_SMP_DATA_SIZE]; - ib_sm_info_t *p_smi = (ib_sm_info_t *) payload; - osm_madw_context_t context; - const osm_port_t *p_port; - ib_api_status_t status; - - OSM_LOG_ENTER(sm->p_log); - - /* - * Send a query of SubnSet(SMInfo) HANDOVER to the remote sm given. - */ - - memset(&context, 0, sizeof(context)); - p_port = p_sm->p_port; - if (p_port == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3316: " - "No port object on given remote_sm object\n"); - goto Exit; - } - - /* update the master_guid in the sm_state_mgr object according to */ - /* the guid of the port where the new Master SM should reside. */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Handing over mastership. Updating sm_state_mgr master_guid: %016" - PRIx64 " (node %s)\n", cl_ntoh64(p_port->guid), - p_port->p_node ? p_port->p_node->print_desc : "UNKNOWN"); - sm->master_sm_guid = p_port->guid; - - context.smi_context.port_guid = p_port->guid; - context.smi_context.set_method = TRUE; - - p_smi->guid = sm->p_subn->sm_port_guid; - p_smi->act_count = cl_hton32(sm->p_subn->p_osm->stats.qp0_mads_sent); - p_smi->pri_state = (uint8_t) (sm->p_subn->sm_state | - sm->p_subn->opt.sm_priority << 4); - /* - * Return 0 for the SM key unless we authenticate the requester - * as the master SM. - */ - if (ib_sminfo_get_state(&p_sm->smi) == IB_SMINFO_STATE_MASTER) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Responding to master SM with real sm_key\n"); - p_smi->sm_key = sm->p_subn->opt.sm_key; - } else { - /* The requester is not authenticated as master - set sm_key to zero */ - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Responding to SM not master with zero sm_key\n"); - p_smi->sm_key = 0; - } - - status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p_port->p_physp), - payload, sizeof(payload), IB_MAD_ATTR_SM_INFO, - IB_SMINFO_ATTR_MOD_HANDOVER, CL_DISP_MSGID_NONE, - &context); - - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3317: " - "Failure requesting SMInfo (%s)\n", - ib_get_err_str(status)); - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - * Send Trap 64 on all new ports. - **********************************************************************/ -static void state_mgr_report_new_ports(IN osm_sm_t * sm) -{ - ib_gid_t port_gid; - ib_mad_notice_attr_t notice; - ib_api_status_t status; - ib_net64_t port_guid; - cl_map_item_t *p_next; - osm_port_t *p_port; - uint16_t min_lid_ho; - uint16_t max_lid_ho; - - OSM_LOG_ENTER(sm->p_log); - - CL_PLOCK_ACQUIRE(sm->p_lock); - p_next = cl_qmap_head(&sm->p_subn->port_guid_tbl); - while (p_next != cl_qmap_end(&sm->p_subn->port_guid_tbl)) { - p_port = (osm_port_t *) p_next; - p_next = cl_qmap_next(p_next); - - if (!p_port->is_new) - continue; - - port_guid = osm_port_get_guid(p_port); - /* issue a notice - trap 64 */ - - /* details of the notice */ - notice.generic_type = 0x83; /* is generic subn mgt type */ - ib_notice_set_prod_type_ho(¬ice, 4); /* A Class Manager generator */ - /* endport becomes reachable */ - notice.g_or_v.generic.trap_num = CL_HTON16(64); - /* The sm_base_lid is saved in network order already. */ - notice.issuer_lid = sm->p_subn->sm_base_lid; - /* following C14-72.1.1 and table 119 p739 */ - /* we need to provide the GID */ - port_gid.unicast.prefix = sm->p_subn->opt.subnet_prefix; - port_gid.unicast.interface_id = port_guid; - memcpy(&(notice.data_details.ntc_64_67.gid), &(port_gid), - sizeof(ib_gid_t)); - - /* According to page 653 - the issuer gid in this case of trap - * is the SM gid, since the SM is the initiator of this trap. */ - notice.issuer_gid.unicast.prefix = - sm->p_subn->opt.subnet_prefix; - notice.issuer_gid.unicast.interface_id = - sm->p_subn->sm_port_guid; - - status = osm_report_notice(sm->p_log, sm->p_subn, ¬ice); - if (status != IB_SUCCESS) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3318: " - "Error sending trap reports on GUID:0x%016" - PRIx64 " (%s)\n", port_gid.unicast.interface_id, - ib_get_err_str(status)); - osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho); - OSM_LOG(sm->p_log, OSM_LOG_INFO, - "Discovered new port with GUID:0x%016" PRIx64 - " LID range [%u,%u] of node: %s\n", - cl_ntoh64(port_gid.unicast.interface_id), - min_lid_ho, max_lid_ho, - p_port->p_node ? p_port->p_node-> - print_desc : "UNKNOWN"); - - p_port->is_new = 0; - } - CL_PLOCK_RELEASE(sm->p_lock); - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - * Make sure that the lid_port_tbl of the subnet has only the ports - * that are recognized, and in the correct lid place. There could be - * errors if we wanted to assign a certain port with lid X, but that - * request didn't reach the port. In this case port_lid_tbl will have - * the port under lid X, though the port isn't updated with this lid. - * We will run a new heavy sweep (since there were errors in the - * initialization), but here we'll clean the database from incorrect - * information. - **********************************************************************/ -static void state_mgr_check_tbl_consistency(IN osm_sm_t * sm) -{ - cl_qmap_t *p_port_guid_tbl; - osm_port_t *p_port; - osm_port_t *p_next_port; - cl_ptr_vector_t *p_port_lid_tbl; - size_t max_lid, ref_size, curr_size, lid; - osm_port_t *p_port_ref, *p_port_stored; - cl_ptr_vector_t ref_port_lid_tbl; - uint16_t min_lid_ho; - uint16_t max_lid_ho; - uint16_t lid_ho; - - OSM_LOG_ENTER(sm->p_log); - - cl_ptr_vector_construct(&ref_port_lid_tbl); - cl_ptr_vector_init(&ref_port_lid_tbl, - cl_ptr_vector_get_size(&sm->p_subn->port_lid_tbl), - OSM_SUBNET_VECTOR_GROW_SIZE); - - p_port_guid_tbl = &sm->p_subn->port_guid_tbl; - - /* Let's go over all the ports according to port_guid_tbl, - * and add the port to a reference port_lid_tbl. */ - p_next_port = (osm_port_t *) cl_qmap_head(p_port_guid_tbl); - while (p_next_port != (osm_port_t *) cl_qmap_end(p_port_guid_tbl)) { - p_port = p_next_port; - p_next_port = - (osm_port_t *) cl_qmap_next(&p_next_port->map_item); - - osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho); - for (lid_ho = min_lid_ho; lid_ho <= max_lid_ho; lid_ho++) - cl_ptr_vector_set(&ref_port_lid_tbl, lid_ho, p_port); - } - - p_port_lid_tbl = &sm->p_subn->port_lid_tbl; - - ref_size = cl_ptr_vector_get_size(&ref_port_lid_tbl); - curr_size = cl_ptr_vector_get_size(p_port_lid_tbl); - /* They should be the same, but compare it anyway */ - max_lid = (ref_size > curr_size) ? ref_size : curr_size; - - for (lid = 1; lid < max_lid; lid++) { - p_port_ref = NULL; - p_port_stored = NULL; - cl_ptr_vector_at(p_port_lid_tbl, lid, (void *)&p_port_stored); - cl_ptr_vector_at(&ref_port_lid_tbl, lid, (void *)&p_port_ref); - - if (p_port_stored == p_port_ref) - /* This is the "good" case - both entries are the - * same for this lid. Nothing to do. */ - continue; - - if (p_port_ref == NULL) - /* There is an object in the subnet database for this - * lid, but no such object exists in the reference - * port_list_tbl. This can occur if we wanted to assign - * a certain port with some lid (different than the one - * pre-assigned to it), and the port didn't get the - * PortInfo Set request. Due to this, the port is - * updated with its original lid in our database, but - * with the new lid we wanted to give it in our - * port_lid_tbl. */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3322: " - "lid %zu is wrongly assigned to port 0x%016" - PRIx64 " (\'%s\' port %u) in port_lid_tbl\n", - lid, - cl_ntoh64(osm_port_get_guid(p_port_stored)), - p_port_stored->p_node->print_desc, - p_port_stored->p_physp->port_num); - else if (p_port_stored == NULL) - /* There is an object in the new database, but no - * object in our subnet database. This is the matching - * case of the prior check - the port still has its - * original lid. */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3323: " - "port 0x%016" PRIx64 " (\'%s\' port %u)" - " exists in new port_lid_tbl under lid %zu," - " but missing in subnet port_lid_tbl db\n", - cl_ntoh64(osm_port_get_guid(p_port_ref)), - p_port_ref->p_node->print_desc, - p_port_ref->p_physp->port_num, lid); - else - /* if we reached here then p_port_stored != p_port_ref. - * We were trying to set a lid to p_port_stored, but - * it didn't reach it, and p_port_ref also didn't get - * the lid update. */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3324: " - "lid %zu has port 0x%016" PRIx64 - " (\'%s\' port %u) in new port_lid_tbl db, " - "and port 0x%016" PRIx64 " (\'%s\' port %u)" - " in subnet port_lid_tbl db\n", lid, - cl_ntoh64(osm_port_get_guid(p_port_ref)), - p_port_ref->p_node->print_desc, - p_port_ref->p_physp->port_num, - cl_ntoh64(osm_port_get_guid(p_port_stored)), - p_port_ref->p_node->print_desc, - p_port_ref->p_physp->port_num); - - /* In any of these cases we want to set NULL in the - * port_lid_tbl, since this entry is invalid. Also, make sure - * we'll do another heavy sweep. */ - cl_ptr_vector_set(p_port_lid_tbl, lid, NULL); - sm->p_subn->subnet_initialization_error = TRUE; - } - - cl_ptr_vector_destroy(&ref_port_lid_tbl); - OSM_LOG_EXIT(sm->p_log); -} - -static void cleanup_switch(cl_map_item_t * item, void *log) -{ - osm_switch_t *sw = (osm_switch_t *) item; - - if (!sw->new_lft) - return; - - if (memcmp(sw->lft, sw->new_lft, sw->max_lid_ho + 1)) - osm_log(log, OSM_LOG_ERROR, "ERR 331D: " - "LFT of switch 0x%016" PRIx64 " (%s) is not up to date\n", - cl_ntoh64(sw->p_node->node_info.node_guid), - sw->p_node->print_desc); - else { - free(sw->new_lft); - sw->new_lft = NULL; - } -} - -int wait_for_pending_transactions(osm_stats_t * stats) -{ -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&stats->mutex); - while (stats->qp0_mads_outstanding && !osm_exit_flag) - pthread_cond_wait(&stats->cond, &stats->mutex); - pthread_mutex_unlock(&stats->mutex); -#else - while (1) { - unsigned count = stats->qp0_mads_outstanding; - if (!count || osm_exit_flag) - break; - cl_event_wait_on(&stats->event, EVENT_NO_TIMEOUT, TRUE); - } -#endif - return osm_exit_flag; -} - -static void do_sweep(osm_sm_t * sm) -{ - ib_api_status_t status; - osm_remote_sm_t *p_remote_sm; - unsigned config_parsed = 0; - - if (sm->p_subn->force_heavy_sweep) { - if (osm_subn_rescan_conf_files(sm->p_subn) < 0) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 331A: " - "osm_subn_rescan_conf_file failed\n"); - else - config_parsed = 1; - } - - if (sm->p_subn->sm_state != IB_SMINFO_STATE_MASTER && - sm->p_subn->sm_state != IB_SMINFO_STATE_DISCOVERING) - return; - - if (sm->p_subn->coming_out_of_standby) - /* - * Need to force re-write of sm_base_lid to all ports - * to do that we want all the ports to be considered - * foreign - */ - state_mgr_clean_known_lids(sm); - - sm->master_sm_found = 0; - - /* - * If we already have switches, then try a light sweep. - * Otherwise, this is probably our first discovery pass - * or we are connected in loopback. In both cases do a - * heavy sweep. - * Note: If we are connected in loopback we want a heavy - * sweep, since we will not be getting any traps if there is - * a lost connection. - */ - /* if we are in DISCOVERING state - this means it is either in - * initializing or wake up from STANDBY - run the heavy sweep */ - if (cl_qmap_count(&sm->p_subn->sw_guid_tbl) - && sm->p_subn->sm_state != IB_SMINFO_STATE_DISCOVERING - && sm->p_subn->opt.force_heavy_sweep == FALSE - && sm->p_subn->force_heavy_sweep == FALSE - && sm->p_subn->force_reroute == FALSE - && sm->p_subn->subnet_initialization_error == FALSE - && (state_mgr_light_sweep_start(sm) == IB_SUCCESS)) { - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - if (!sm->p_subn->force_heavy_sweep) { - if (sm->p_subn->opt.sa_db_dump) - osm_sa_db_file_dump(sm->p_subn->p_osm); - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "LIGHT SWEEP COMPLETE"); - return; - } - } - - /* - * Unicast cache should be invalidated if there were errors - * during initialization or if subnet re-route is requested. - */ - if (sm->p_subn->opt.use_ucast_cache && - (sm->p_subn->subnet_initialization_error || - sm->p_subn->force_reroute || sm->p_subn->coming_out_of_standby)) - osm_ucast_cache_invalidate(&sm->ucast_mgr); - - /* - * If we don't need to do a heavy sweep and we want to do a reroute, - * just reroute only. - */ - if (cl_qmap_count(&sm->p_subn->sw_guid_tbl) - && sm->p_subn->sm_state != IB_SMINFO_STATE_DISCOVERING - && sm->p_subn->opt.force_heavy_sweep == FALSE - && sm->p_subn->force_heavy_sweep == FALSE - && sm->p_subn->force_reroute == TRUE - && sm->p_subn->subnet_initialization_error == FALSE) { - /* Reset flag */ - sm->p_subn->force_reroute = FALSE; - - /* Re-program the switches fully */ - sm->p_subn->ignore_existing_lfts = TRUE; - - osm_ucast_mgr_process(&sm->ucast_mgr); - - /* Reset flag */ - sm->p_subn->ignore_existing_lfts = FALSE; - - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - if (!sm->p_subn->subnet_initialization_error) { - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "REROUTE COMPLETE"); - return; - } - } - - /* go to heavy sweep */ -repeat_discovery: - - /* First of all - unset all flags */ - sm->p_subn->force_heavy_sweep = FALSE; - sm->p_subn->force_reroute = FALSE; - sm->p_subn->subnet_initialization_error = FALSE; - - /* rescan configuration updates */ - if (!config_parsed && osm_subn_rescan_conf_files(sm->p_subn) < 0) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 331A: " - "osm_subn_rescan_conf_file failed\n"); - - if (sm->p_subn->sm_state != IB_SMINFO_STATE_MASTER) - sm->p_subn->need_update = 1; - - status = state_mgr_sweep_hop_0(sm); - if (status != IB_SUCCESS || - wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - if (state_mgr_is_sm_port_down(sm) == TRUE) { - osm_log(sm->p_log, OSM_LOG_SYS, "SM port is down\n"); - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, "SM PORT DOWN"); - - /* Run the drop manager - we want to clear all records */ - osm_drop_mgr_process(sm); - - /* Move to DISCOVERING state */ - osm_sm_state_mgr_process(sm, OSM_SM_SIGNAL_DISCOVER); - return; - } - - status = state_mgr_sweep_hop_1(sm); - if (status != IB_SUCCESS || - wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - /* discovery completed - check other sm presence */ - if (sm->master_sm_found) { - /* - * Call the sm_state_mgr with signal - * MASTER_OR_HIGHER_SM_DETECTED_DONE - */ - osm_sm_state_mgr_process(sm, - OSM_SM_SIGNAL_MASTER_OR_HIGHER_SM_DETECTED); - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "ENTERING STANDBY STATE"); - /* notify master SM about us */ - osm_send_trap144(sm, 0); - return; - } - - /* if new sweep requested - don't bother with the rest */ - if (sm->p_subn->force_heavy_sweep) - goto repeat_discovery; - - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, "HEAVY SWEEP COMPLETE"); - - /* If we are MASTER - get the highest remote_sm, and - * see if it is higher than our local sm. - */ - if (sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER) { - p_remote_sm = state_mgr_get_highest_sm(sm); - if (p_remote_sm != NULL) { - /* report new ports (trap 64) before leaving MASTER */ - state_mgr_report_new_ports(sm); - - /* need to handover the mastership - * to the remote sm, and move to standby */ - state_mgr_send_handover(sm, p_remote_sm); - osm_sm_state_mgr_process(sm, - OSM_SM_SIGNAL_HANDOVER_SENT); - return; - } else { - /* We are the highest sm - check to see if there is - * a remote SM that is in master state. */ - p_remote_sm = state_mgr_exists_other_master_sm(sm); - if (p_remote_sm != NULL) { - /* There is a remote SM that is master. - * need to wait for that SM to relinquish control - * of its portion of the subnet. C14-60.2.1. - * Also - need to start polling on that SM. */ - sm->p_polling_sm = p_remote_sm; - osm_sm_state_mgr_process(sm, - OSM_SM_SIGNAL_WAIT_FOR_HANDOVER); - return; - } - } - } - - /* Need to continue with lid assignment */ - osm_drop_mgr_process(sm); - - /* - * If we are not MASTER already - this means that we are - * in discovery state. call osm_sm_state_mgr with signal - * DISCOVERY_COMPLETED - */ - if (sm->p_subn->sm_state == IB_SMINFO_STATE_DISCOVERING) - osm_sm_state_mgr_process(sm, OSM_SM_SIGNAL_DISCOVERY_COMPLETED); - - osm_pkey_mgr_process(sm->p_subn->p_osm); - - osm_qos_setup(sm->p_subn->p_osm); - - /* try to restore SA DB (this should be before lid_mgr - because we may want to disable clients reregistration - when SA DB is restored) */ - osm_sa_db_file_load(sm->p_subn->p_osm); - - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "PKEY and QOS setup completed - STARTING SM LID CONFIG"); - - osm_lid_mgr_process_sm(&sm->lid_mgr); - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "SM LID ASSIGNMENT COMPLETE - STARTING SUBNET LID CONFIG"); - state_mgr_notify_lid_change(sm); - - osm_lid_mgr_process_subnet(&sm->lid_mgr); - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - /* At this point we need to check the consistency of - * the port_lid_tbl under the subnet. There might be - * errors in it if PortInfo Set requests didn't reach - * their destination. */ - state_mgr_check_tbl_consistency(sm); - - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "LID ASSIGNMENT COMPLETE - STARTING SWITCH TABLE CONFIG"); - - /* - * Proceed with unicast forwarding table configuration. - */ - - if (!sm->ucast_mgr.cache_valid || - osm_ucast_cache_process(&sm->ucast_mgr)) - osm_ucast_mgr_process(&sm->ucast_mgr); - - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - /* cleanup switch lft buffers */ - cl_qmap_apply_func(&sm->p_subn->sw_guid_tbl, cleanup_switch, sm->p_log); - - /* We are done setting all LFTs so clear the ignore existing. - * From now on, as long as we are still master, we want to - * take into account these lfts. */ - sm->p_subn->ignore_existing_lfts = FALSE; - - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "SWITCHES CONFIGURED FOR UNICAST"); - - if (!sm->p_subn->opt.disable_multicast) { - osm_mcast_mgr_process(sm); - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "SWITCHES CONFIGURED FOR MULTICAST"); - } - - /* - * The LINK_PORTS state is required since we cannot count on - * the port state change MADs to succeed. This is an artifact - * of the spec defining state change from state X to state X - * as an error. The hardware then is not required to process - * other parameters provided by the Set(PortInfo) Packet. - */ - - osm_link_mgr_process(sm, IB_LINK_NO_CHANGE); - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "LINKS PORTS CONFIGURED - SET LINKS TO ARMED STATE"); - - osm_link_mgr_process(sm, IB_LINK_ARMED); - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_VERBOSE, - "LINKS ARMED - SET LINKS TO ACTIVE STATE"); - - osm_link_mgr_process(sm, IB_LINK_ACTIVE); - if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats)) - return; - - /* - * The sweep completed! - */ - - /* - * Send trap 64 on newly discovered endports - */ - state_mgr_report_new_ports(sm); - - /* in any case we zero this flag */ - sm->p_subn->coming_out_of_standby = FALSE; - - /* If there were errors - then the subnet is not really up */ - if (sm->p_subn->subnet_initialization_error == TRUE) { - osm_log(sm->p_log, OSM_LOG_SYS, - "Errors during initialization\n"); - OSM_LOG_MSG_BOX(sm->p_log, OSM_LOG_ERROR, - "ERRORS DURING INITIALIZATION"); - } else { - sm->p_subn->need_update = 0; - osm_dump_all(sm->p_subn->p_osm); - state_mgr_up_msg(sm); - sm->p_subn->first_time_master_sweep = FALSE; - - if (osm_log_is_active(sm->p_log, OSM_LOG_VERBOSE) || - sm->p_subn->opt.sa_db_dump) - osm_sa_db_file_dump(sm->p_subn->p_osm); - } - - /* - * Finally signal the subnet up event - */ - cl_event_signal(&sm->subnet_up_event); - - osm_opensm_report_event(sm->p_subn->p_osm, OSM_EVENT_ID_SUBNET_UP, - NULL); - - /* if we got a signal to force heavy sweep or errors - * in the middle of the sweep - try another sweep. */ - if (sm->p_subn->force_heavy_sweep - || sm->p_subn->subnet_initialization_error) - osm_sm_signal(sm, OSM_SIGNAL_SWEEP); -} - -static void do_process_mgrp_queue(osm_sm_t * sm) -{ - if (sm->p_subn->sm_state != IB_SMINFO_STATE_MASTER) - return; - if (!sm->p_subn->opt.disable_multicast) { - osm_mcast_mgr_process_mgroups(sm); - wait_for_pending_transactions(&sm->p_subn->p_osm->stats); - } -} - -void osm_state_mgr_process(IN osm_sm_t * sm, IN osm_signal_t signal) -{ - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Received signal %s in state %s\n", - osm_get_sm_signal_str(signal), - osm_get_sm_mgr_state_str(sm->p_subn->sm_state)); - - switch (signal) { - case OSM_SIGNAL_SWEEP: - do_sweep(sm); - break; - case OSM_SIGNAL_IDLE_TIME_PROCESS_REQUEST: - do_process_mgrp_queue(sm); - break; - default: - CL_ASSERT(FALSE); - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3320: " - "Invalid SM signal %u\n", signal); - break; - } - - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_subnet.c b/branches/opensm_3/user/opensm/osm_subnet.c deleted file mode 100644 index 6461a1b4..00000000 --- a/branches/opensm_3/user/opensm/osm_subnet.c +++ /dev/null @@ -1,1663 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. - * Copyright (c) 2009 System Fabric Works, Inc. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_subn_t. - * This object represents an IBA subnet. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static const char null_str[] = "(null)"; - -#define OPT_OFFSET(opt) offsetof(osm_subn_opt_t, opt) - -typedef struct opt_rec { - const char *name; - unsigned long opt_offset; - void (*parse_fn)(osm_subn_t *p_subn, char *p_key, char *p_val_str, - void *p_val1, void *p_val2, - void (*)(osm_subn_t *, void *)); - void (*setup_fn)(osm_subn_t *p_subn, void *p_val); - int can_update; -} opt_rec_t; - -static void log_report(const char *fmt, ...) -{ - char buf[128]; - va_list args; - va_start(args, fmt); - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - printf("%s", buf); - cl_log_event("OpenSM", CL_LOG_INFO, buf, NULL, 0); -} - -static void log_config_value(char *name, const char *fmt, ...) -{ - char buf[128]; - va_list args; - unsigned n; - va_start(args, fmt); - n = snprintf(buf, sizeof(buf), " Loading Cached Option:%s = ", name); - if (n > sizeof(buf)) - n = sizeof(buf); - n += vsnprintf(buf + n, sizeof(buf) - n, fmt, args); - if (n > sizeof(buf) - 2) - n = sizeof(buf) - 2; - snprintf(buf + n, sizeof(buf) - n, "\n"); - va_end(args); - printf("%s", buf); - cl_log_event("OpenSM", CL_LOG_INFO, buf, NULL, 0); -} - -static void opts_setup_log_flags(osm_subn_t *p_subn, void *p_val) -{ - p_subn->p_osm->log.level = *((uint8_t *) p_val); -} - -static void opts_setup_force_log_flush(osm_subn_t *p_subn, void *p_val) -{ - p_subn->p_osm->log.flush = *((boolean_t *) p_val); -} - -static void opts_setup_accum_log_file(osm_subn_t *p_subn, void *p_val) -{ - p_subn->p_osm->log.accum_log_file = *((boolean_t *) p_val); -} - -static void opts_setup_log_max_size(osm_subn_t *p_subn, void *p_val) -{ - uint32_t log_max_size = *((uint32_t *) p_val); - - p_subn->p_osm->log.max_size = log_max_size << 20; /* convert from MB to bytes */ -} - -static void opts_setup_sminfo_polling_timeout(osm_subn_t *p_subn, void *p_val) -{ - osm_sm_t *p_sm = &p_subn->p_osm->sm; - uint32_t sminfo_polling_timeout = *((uint32_t *) p_val); - - cl_timer_stop(&p_sm->polling_timer); - cl_timer_start(&p_sm->polling_timer, sminfo_polling_timeout); -} - -static void opts_setup_sm_priority(osm_subn_t *p_subn, void *p_val) -{ - osm_sm_t *p_sm = &p_subn->p_osm->sm; - uint8_t sm_priority = *((uint8_t *) p_val); - - osm_set_sm_priority(p_sm, sm_priority); -} - -static void opts_parse_net64(IN osm_subn_t *p_subn, IN char *p_key, - IN char *p_val_str, void *p_v1, void *p_v2, - void (*pfn)(osm_subn_t *, void *)) -{ - uint64_t *p_val1 = p_v1, *p_val2 = p_v2; - uint64_t val = strtoull(p_val_str, NULL, 0); - - if (cl_hton64(val) != *p_val1) { - log_config_value(p_key, "0x%016" PRIx64, val); - if (pfn) - pfn(p_subn, &val); - *p_val1 = *p_val2 = cl_ntoh64(val); - } -} - -static void opts_parse_uint32(IN osm_subn_t *p_subn, IN char *p_key, - IN char *p_val_str, void *p_v1, void *p_v2, - void (*pfn)(osm_subn_t *, void *)) -{ - uint32_t *p_val1 = p_v1, *p_val2 = p_v2; - uint32_t val = strtoul(p_val_str, NULL, 0); - - if (val != *p_val1) { - log_config_value(p_key, "%u", val); - if (pfn) - pfn(p_subn, &val); - *p_val1 = *p_val2 = val; - } -} - -static void opts_parse_int32(IN osm_subn_t *p_subn, IN char *p_key, - IN char *p_val_str, void *p_v1, void *p_v2, - void (*pfn)(osm_subn_t *, void *)) -{ - int32_t *p_val1 = p_v1, *p_val2 = p_v2; - int32_t val = strtol(p_val_str, NULL, 0); - - if (val != *p_val1) { - log_config_value(p_key, "%d", val); - if (pfn) - pfn(p_subn, &val); - *p_val1 = *p_val2 = val; - } -} - -static void opts_parse_uint16(IN osm_subn_t *p_subn, IN char *p_key, - IN char *p_val_str, void *p_v1, void *p_v2, - void (*pfn)(osm_subn_t *, void *)) -{ - uint16_t *p_val1 = p_v1, *p_val2 = p_v2; - uint16_t val = (uint16_t) strtoul(p_val_str, NULL, 0); - - if (val != *p_val1) { - log_config_value(p_key, "%u", val); - if (pfn) - pfn(p_subn, &val); - *p_val1 = *p_val2 = val; - } -} - -static void opts_parse_net16(IN osm_subn_t *p_subn, IN char *p_key, - IN char *p_val_str, void *p_v1, void *p_v2, - void (*pfn)(osm_subn_t *, void *)) -{ - uint16_t *p_val1 = p_v1, *p_val2 = p_v2; - uint16_t val = strtoul(p_val_str, NULL, 0); - - if (cl_hton16(val) != *p_val1) { - log_config_value(p_key, "0x%04x", val); - if (pfn) - pfn(p_subn, &val); - *p_val1 = *p_val2 = cl_hton16(val); - } -} - -static void opts_parse_uint8(IN osm_subn_t *p_subn, IN char *p_key, - IN char *p_val_str, void *p_v1, void *p_v2, - void (*pfn)(osm_subn_t *, void *)) -{ - uint8_t *p_val1 = p_v1, *p_val2 = p_v2; - uint8_t val = strtoul(p_val_str, NULL, 0); - - if (val != *p_val1) { - log_config_value(p_key, "%u", val); - if (pfn) - pfn(p_subn, &val); - *p_val1 = *p_val2 = val; - } -} - -static void opts_parse_boolean(IN osm_subn_t *p_subn, IN char *p_key, - IN char *p_val_str, void *p_v1, void *p_v2, - void (*pfn)(osm_subn_t *, void *)) -{ - boolean_t *p_val1 = p_v1, *p_val2 = p_v2; - boolean_t val; - - if (!p_val_str) - return; - - if (strcmp("TRUE", p_val_str)) - val = FALSE; - else - val = TRUE; - - if (val != *p_val1) { - log_config_value(p_key, "%s", p_val_str); - if (pfn) - pfn(p_subn, &val); - *p_val1 = *p_val2 = val; - } -} - -static void opts_parse_charp(IN osm_subn_t *p_subn, IN char *p_key, - IN char *p_val_str, void *p_v1, void *p_v2, - void (*pfn)(osm_subn_t *, void *)) -{ - char **p_val1 = p_v1, **p_val2 = p_v2; - const char *current_str = *p_val1 ? *p_val1 : null_str ; - - if (p_val_str && strcmp(p_val_str, current_str)) { - char *new; - log_config_value(p_key, "%s", p_val_str); - /* special case the "(null)" string */ - new = strcmp(null_str, p_val_str) ? strdup(p_val_str) : NULL; - if (pfn) - pfn(p_subn, new); - if (*p_val1 && *p_val1 != *p_val2) - free(*p_val1); - if (*p_val2) - free(*p_val2); - *p_val1 = *p_val2 = new; - } -} - -static const opt_rec_t opt_tbl[] = { - { "guid", OPT_OFFSET(guid), opts_parse_net64, NULL, 0 }, - { "m_key", OPT_OFFSET(m_key), opts_parse_net64, NULL, 1 }, - { "sm_key", OPT_OFFSET(sm_key), opts_parse_net64, NULL, 1 }, - { "sa_key", OPT_OFFSET(sa_key), opts_parse_net64, NULL, 1 }, - { "subnet_prefix", OPT_OFFSET(subnet_prefix), opts_parse_net64, NULL, 1 }, - { "m_key_lease_period", OPT_OFFSET(m_key_lease_period), opts_parse_net16, NULL, 1 }, - { "sweep_interval", OPT_OFFSET(sweep_interval), opts_parse_uint32, NULL, 1 }, - { "max_wire_smps", OPT_OFFSET(max_wire_smps), opts_parse_uint32, NULL, 1 }, - { "console", OPT_OFFSET(console), opts_parse_charp, NULL, 0 }, - { "console_port", OPT_OFFSET(console_port), opts_parse_uint16, NULL, 0 }, - { "transaction_timeout", OPT_OFFSET(transaction_timeout), opts_parse_uint32, NULL, 0 }, - { "transaction_retries", OPT_OFFSET(transaction_retries), opts_parse_uint32, NULL, 0 }, - { "max_msg_fifo_timeout", OPT_OFFSET(max_msg_fifo_timeout), opts_parse_uint32, NULL, 1 }, - { "sm_priority", OPT_OFFSET(sm_priority), opts_parse_uint8, opts_setup_sm_priority, 1 }, - { "lmc", OPT_OFFSET(lmc), opts_parse_uint8, NULL, 1 }, - { "lmc_esp0", OPT_OFFSET(lmc_esp0), opts_parse_boolean, NULL, 1 }, - { "max_op_vls", OPT_OFFSET(max_op_vls), opts_parse_uint8, NULL, 1 }, - { "force_link_speed", OPT_OFFSET(force_link_speed), opts_parse_uint8, NULL, 1 }, - { "reassign_lids", OPT_OFFSET(reassign_lids), opts_parse_boolean, NULL, 1 }, - { "ignore_other_sm", OPT_OFFSET(ignore_other_sm), opts_parse_boolean, NULL, 1 }, - { "single_thread", OPT_OFFSET(single_thread), opts_parse_boolean, NULL, 0 }, - { "disable_multicast", OPT_OFFSET(disable_multicast), opts_parse_boolean, NULL, 1 }, - { "subnet_timeout", OPT_OFFSET(subnet_timeout), opts_parse_uint8, NULL, 1 }, - { "packet_life_time", OPT_OFFSET(packet_life_time), opts_parse_uint8, NULL, 1 }, - { "vl_stall_count", OPT_OFFSET(vl_stall_count), opts_parse_uint8, NULL, 1 }, - { "leaf_vl_stall_count", OPT_OFFSET(leaf_vl_stall_count), opts_parse_uint8, NULL, 1 }, - { "head_of_queue_lifetime", OPT_OFFSET(head_of_queue_lifetime), opts_parse_uint8, NULL, 1 }, - { "leaf_head_of_queue_lifetime", OPT_OFFSET(leaf_head_of_queue_lifetime), opts_parse_uint8, NULL, 1 }, - { "local_phy_errors_threshold", OPT_OFFSET(local_phy_errors_threshold), opts_parse_uint8, NULL, 1 }, - { "overrun_errors_threshold", OPT_OFFSET(overrun_errors_threshold), opts_parse_uint8, NULL, 1 }, - { "sminfo_polling_timeout", OPT_OFFSET(sminfo_polling_timeout), opts_parse_uint32, opts_setup_sminfo_polling_timeout, 1 }, - { "polling_retry_number", OPT_OFFSET(polling_retry_number), opts_parse_uint32, NULL, 1 }, - { "force_heavy_sweep", OPT_OFFSET(force_heavy_sweep), opts_parse_boolean, NULL, 1 }, - { "port_prof_ignore_file", OPT_OFFSET(port_prof_ignore_file), opts_parse_charp, NULL, 0 }, - { "hop_weights_file", OPT_OFFSET(hop_weights_file), opts_parse_charp, NULL, 0 }, - { "dimn_ports_file", OPT_OFFSET(dimn_ports_file), opts_parse_charp, NULL, 0 }, - { "port_profile_switch_nodes", OPT_OFFSET(port_profile_switch_nodes), opts_parse_boolean, NULL, 1 }, - { "sweep_on_trap", OPT_OFFSET(sweep_on_trap), opts_parse_boolean, NULL, 1 }, - { "routing_engine", OPT_OFFSET(routing_engine_names), opts_parse_charp, NULL, 0 }, - { "connect_roots", OPT_OFFSET(connect_roots), opts_parse_boolean, NULL, 1 }, - { "use_ucast_cache", OPT_OFFSET(use_ucast_cache), opts_parse_boolean, NULL, 0 }, - { "log_file", OPT_OFFSET(log_file), opts_parse_charp, NULL, 0 }, - { "log_max_size", OPT_OFFSET(log_max_size), opts_parse_uint32, opts_setup_log_max_size, 1 }, - { "log_flags", OPT_OFFSET(log_flags), opts_parse_uint8, opts_setup_log_flags, 1 }, - { "force_log_flush", OPT_OFFSET(force_log_flush), opts_parse_boolean, opts_setup_force_log_flush, 1 }, - { "accum_log_file", OPT_OFFSET(accum_log_file), opts_parse_boolean, opts_setup_accum_log_file, 1 }, - { "partition_config_file", OPT_OFFSET(partition_config_file), opts_parse_charp, NULL, 0 }, - { "no_partition_enforcement", OPT_OFFSET(no_partition_enforcement), opts_parse_boolean, NULL, 1 }, - { "qos", OPT_OFFSET(qos), opts_parse_boolean, NULL, 1 }, - { "qos_policy_file", OPT_OFFSET(qos_policy_file), opts_parse_charp, NULL, 0 }, - { "dump_files_dir", OPT_OFFSET(dump_files_dir), opts_parse_charp, NULL, 0 }, - { "lid_matrix_dump_file", OPT_OFFSET(lid_matrix_dump_file), opts_parse_charp, NULL, 0 }, - { "lfts_file", OPT_OFFSET(lfts_file), opts_parse_charp, NULL, 0 }, - { "root_guid_file", OPT_OFFSET(root_guid_file), opts_parse_charp, NULL, 0 }, - { "cn_guid_file", OPT_OFFSET(cn_guid_file), opts_parse_charp, NULL, 0 }, - { "io_guid_file", OPT_OFFSET(io_guid_file), opts_parse_charp, NULL, 0 }, - { "max_reverse_hops", OPT_OFFSET(max_reverse_hops), opts_parse_uint16, NULL, 0 }, - { "ids_guid_file", OPT_OFFSET(ids_guid_file), opts_parse_charp, NULL, 0 }, - { "guid_routing_order_file", OPT_OFFSET(guid_routing_order_file), opts_parse_charp, NULL, 0 }, - { "sa_db_file", OPT_OFFSET(sa_db_file), opts_parse_charp, NULL, 0 }, - { "sa_db_dump", OPT_OFFSET(sa_db_dump), opts_parse_boolean, NULL, 1 }, - { "do_mesh_analysis", OPT_OFFSET(do_mesh_analysis), opts_parse_boolean, NULL, 1 }, - { "exit_on_fatal", OPT_OFFSET(exit_on_fatal), opts_parse_boolean, NULL, 1 }, - { "honor_guid2lid_file", OPT_OFFSET(honor_guid2lid_file), opts_parse_boolean, NULL, 1 }, - { "daemon", OPT_OFFSET(daemon), opts_parse_boolean, NULL, 0 }, - { "sm_inactive", OPT_OFFSET(sm_inactive), opts_parse_boolean, NULL, 1 }, - { "babbling_port_policy", OPT_OFFSET(babbling_port_policy), opts_parse_boolean, NULL, 1 }, - { "use_optimized_slvl", OPT_OFFSET(use_optimized_slvl), opts_parse_boolean, NULL, 1 }, -#ifdef ENABLE_OSM_PERF_MGR - { "perfmgr", OPT_OFFSET(perfmgr), opts_parse_boolean, NULL, 0 }, - { "perfmgr_redir", OPT_OFFSET(perfmgr_redir), opts_parse_boolean, NULL, 0 }, - { "perfmgr_sweep_time_s", OPT_OFFSET(perfmgr_sweep_time_s), opts_parse_uint16, NULL, 0 }, - { "perfmgr_max_outstanding_queries", OPT_OFFSET(perfmgr_max_outstanding_queries), opts_parse_uint32, NULL, 0 }, - { "event_db_dump_file", OPT_OFFSET(event_db_dump_file), opts_parse_charp, NULL, 0 }, -#endif /* ENABLE_OSM_PERF_MGR */ - { "event_plugin_name", OPT_OFFSET(event_plugin_name), opts_parse_charp, NULL, 0 }, - { "event_plugin_options", OPT_OFFSET(event_plugin_options), opts_parse_charp, NULL, 0 }, - { "node_name_map_name", OPT_OFFSET(node_name_map_name), opts_parse_charp, NULL, 0 }, - { "qos_max_vls", OPT_OFFSET(qos_options.max_vls), opts_parse_uint32, NULL, 1 }, - { "qos_high_limit", OPT_OFFSET(qos_options.high_limit), opts_parse_int32, NULL, 1 }, - { "qos_vlarb_high", OPT_OFFSET(qos_options.vlarb_high), opts_parse_charp, NULL, 1 }, - { "qos_vlarb_low", OPT_OFFSET(qos_options.vlarb_low), opts_parse_charp, NULL, 1 }, - { "qos_sl2vl", OPT_OFFSET(qos_options.sl2vl), opts_parse_charp, NULL, 1 }, - { "qos_ca_max_vls", OPT_OFFSET(qos_ca_options.max_vls), opts_parse_uint32, NULL, 1 }, - { "qos_ca_high_limit", OPT_OFFSET(qos_ca_options.high_limit), opts_parse_int32, NULL, 1 }, - { "qos_ca_vlarb_high", OPT_OFFSET(qos_ca_options.vlarb_high), opts_parse_charp, NULL, 1 }, - { "qos_ca_vlarb_low", OPT_OFFSET(qos_ca_options.vlarb_low), opts_parse_charp, NULL, 1 }, - { "qos_ca_sl2vl", OPT_OFFSET(qos_ca_options.sl2vl), opts_parse_charp, NULL, 1 }, - { "qos_sw0_max_vls", OPT_OFFSET(qos_sw0_options.max_vls), opts_parse_uint32, NULL, 1 }, - { "qos_sw0_high_limit", OPT_OFFSET(qos_sw0_options.high_limit), opts_parse_int32, NULL, 1 }, - { "qos_sw0_vlarb_high", OPT_OFFSET(qos_sw0_options.vlarb_high), opts_parse_charp, NULL, 1 }, - { "qos_sw0_vlarb_low", OPT_OFFSET(qos_sw0_options.vlarb_low), opts_parse_charp, NULL, 1 }, - { "qos_sw0_sl2vl", OPT_OFFSET(qos_sw0_options.sl2vl), opts_parse_charp, NULL, 1 }, - { "qos_swe_max_vls", OPT_OFFSET(qos_swe_options.max_vls), opts_parse_uint32, NULL, 1 }, - { "qos_swe_high_limit", OPT_OFFSET(qos_swe_options.high_limit), opts_parse_int32, NULL, 1 }, - { "qos_swe_vlarb_high", OPT_OFFSET(qos_swe_options.vlarb_high), opts_parse_charp, NULL, 1 }, - { "qos_swe_vlarb_low", OPT_OFFSET(qos_swe_options.vlarb_low), opts_parse_charp, NULL, 1 }, - { "qos_swe_sl2vl", OPT_OFFSET(qos_swe_options.sl2vl), opts_parse_charp, NULL, 1 }, - { "qos_rtr_max_vls", OPT_OFFSET(qos_rtr_options.max_vls), opts_parse_uint32, NULL, 1 }, - { "qos_rtr_high_limit", OPT_OFFSET(qos_rtr_options.high_limit), opts_parse_int32, NULL, 1 }, - { "qos_rtr_vlarb_high", OPT_OFFSET(qos_rtr_options.vlarb_high), opts_parse_charp, NULL, 1 }, - { "qos_rtr_vlarb_low", OPT_OFFSET(qos_rtr_options.vlarb_low), opts_parse_charp, NULL, 1 }, - { "qos_rtr_sl2vl", OPT_OFFSET(qos_rtr_options.sl2vl), opts_parse_charp, NULL, 1 }, - { "enable_quirks", OPT_OFFSET(enable_quirks), opts_parse_boolean, NULL, 1 }, - { "no_clients_rereg", OPT_OFFSET(no_clients_rereg), opts_parse_boolean, NULL, 1 }, - { "prefix_routes_file", OPT_OFFSET(prefix_routes_file), opts_parse_charp, NULL, 0 }, - { "consolidate_ipv6_snm_req", OPT_OFFSET(consolidate_ipv6_snm_req), opts_parse_boolean, NULL, 1 }, - { "lash_start_vl", OPT_OFFSET(lash_start_vl), opts_parse_uint8, NULL, 1 }, - { "sm_sl", OPT_OFFSET(sm_sl), opts_parse_uint8, NULL, 1 }, - { "log_prefix", OPT_OFFSET(log_prefix), opts_parse_charp, NULL, 1 }, - {0} -}; - -static int compar_mgids(const void *m1, const void *m2) -{ - return memcmp(m1, m2, sizeof(ib_gid_t)); -} - -void osm_subn_construct(IN osm_subn_t * p_subn) -{ - memset(p_subn, 0, sizeof(*p_subn)); - cl_ptr_vector_construct(&p_subn->port_lid_tbl); - cl_qmap_init(&p_subn->sw_guid_tbl); - cl_qmap_init(&p_subn->node_guid_tbl); - cl_qmap_init(&p_subn->port_guid_tbl); - cl_qmap_init(&p_subn->sm_guid_tbl); - cl_qlist_init(&p_subn->sa_sr_list); - cl_qlist_init(&p_subn->sa_infr_list); - cl_qlist_init(&p_subn->prefix_routes_list); - cl_qmap_init(&p_subn->rtr_guid_tbl); - cl_qmap_init(&p_subn->prtn_pkey_tbl); - cl_fmap_init(&p_subn->mgrp_mgid_tbl, compar_mgids); -} - -void osm_subn_destroy(IN osm_subn_t * p_subn) -{ - int i; - osm_node_t *p_node, *p_next_node; - osm_port_t *p_port, *p_next_port; - osm_switch_t *p_sw, *p_next_sw; - osm_remote_sm_t *p_rsm, *p_next_rsm; - osm_prtn_t *p_prtn, *p_next_prtn; - osm_infr_t *p_infr, *p_next_infr; - - /* it might be a good idea to de-allocate all known objects */ - p_next_node = (osm_node_t *) cl_qmap_head(&p_subn->node_guid_tbl); - while (p_next_node != - (osm_node_t *) cl_qmap_end(&p_subn->node_guid_tbl)) { - p_node = p_next_node; - p_next_node = (osm_node_t *) cl_qmap_next(&p_node->map_item); - osm_node_delete(&p_node); - } - - p_next_port = (osm_port_t *) cl_qmap_head(&p_subn->port_guid_tbl); - while (p_next_port != - (osm_port_t *) cl_qmap_end(&p_subn->port_guid_tbl)) { - p_port = p_next_port; - p_next_port = (osm_port_t *) cl_qmap_next(&p_port->map_item); - osm_port_delete(&p_port); - } - - p_next_sw = (osm_switch_t *) cl_qmap_head(&p_subn->sw_guid_tbl); - while (p_next_sw != (osm_switch_t *) cl_qmap_end(&p_subn->sw_guid_tbl)) { - p_sw = p_next_sw; - p_next_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item); - osm_switch_delete(&p_sw); - } - - p_next_rsm = (osm_remote_sm_t *) cl_qmap_head(&p_subn->sm_guid_tbl); - while (p_next_rsm != - (osm_remote_sm_t *) cl_qmap_end(&p_subn->sm_guid_tbl)) { - p_rsm = p_next_rsm; - p_next_rsm = (osm_remote_sm_t *) cl_qmap_next(&p_rsm->map_item); - free(p_rsm); - } - - p_next_prtn = (osm_prtn_t *) cl_qmap_head(&p_subn->prtn_pkey_tbl); - while (p_next_prtn != - (osm_prtn_t *) cl_qmap_end(&p_subn->prtn_pkey_tbl)) { - p_prtn = p_next_prtn; - p_next_prtn = (osm_prtn_t *) cl_qmap_next(&p_prtn->map_item); - osm_prtn_delete(&p_prtn); - } - - cl_fmap_remove_all(&p_subn->mgrp_mgid_tbl); - - for (i = 0; i <= p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO; - i++) - if (p_subn->mboxes[i]) - osm_mgrp_box_delete(p_subn->mboxes[i]); - - p_next_infr = (osm_infr_t *) cl_qlist_head(&p_subn->sa_infr_list); - while (p_next_infr != - (osm_infr_t *) cl_qlist_end(&p_subn->sa_infr_list)) { - p_infr = p_next_infr; - p_next_infr = (osm_infr_t *) cl_qlist_next(&p_infr->list_item); - osm_infr_delete(p_infr); - } - - cl_ptr_vector_destroy(&p_subn->port_lid_tbl); - - osm_qos_policy_destroy(p_subn->p_qos_policy); - - while (!cl_is_qlist_empty(&p_subn->prefix_routes_list)) { - cl_list_item_t *item = cl_qlist_remove_head(&p_subn->prefix_routes_list); - free(item); - } -} - -ib_api_status_t osm_subn_init(IN osm_subn_t * p_subn, IN osm_opensm_t * p_osm, - IN const osm_subn_opt_t * p_opt) -{ - cl_status_t status; - - p_subn->p_osm = p_osm; - - status = cl_ptr_vector_init(&p_subn->port_lid_tbl, - OSM_SUBNET_VECTOR_MIN_SIZE, - OSM_SUBNET_VECTOR_GROW_SIZE); - if (status != CL_SUCCESS) - return status; - - status = cl_ptr_vector_set_capacity(&p_subn->port_lid_tbl, - OSM_SUBNET_VECTOR_CAPACITY); - if (status != CL_SUCCESS) - return status; - - /* - LID zero is not valid. NULL out this entry for the - convenience of other code. - */ - cl_ptr_vector_set(&p_subn->port_lid_tbl, 0, NULL); - - p_subn->opt = *p_opt; - p_subn->max_ucast_lid_ho = IB_LID_UCAST_END_HO; - p_subn->max_mcast_lid_ho = IB_LID_MCAST_END_HO; - p_subn->min_ca_mtu = IB_MAX_MTU; - p_subn->min_ca_rate = IB_MAX_RATE; - p_subn->ignore_existing_lfts = TRUE; - - /* we assume master by default - so we only need to set it true if STANDBY */ - p_subn->coming_out_of_standby = FALSE; - - return IB_SUCCESS; -} - -osm_port_t *osm_get_port_by_mad_addr(IN osm_log_t * p_log, - IN const osm_subn_t * p_subn, - IN osm_mad_addr_t * p_mad_addr) -{ - osm_port_t *port = osm_get_port_by_lid(p_subn, p_mad_addr->dest_lid); - if (!port) - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 7504: " - "Lid is out of range: %u\n", - cl_ntoh16(p_mad_addr->dest_lid)); - - return port; -} - -ib_api_status_t osm_get_gid_by_mad_addr(IN osm_log_t * p_log, - IN const osm_subn_t * p_subn, - IN osm_mad_addr_t * p_mad_addr, - OUT ib_gid_t * p_gid) -{ - const osm_port_t *p_port; - - if (p_gid == NULL) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 7505: " - "Provided output GID is NULL\n"); - return IB_INVALID_PARAMETER; - } - - p_port = osm_get_port_by_mad_addr(p_log, p_subn, p_mad_addr); - if (!p_port) - return IB_INVALID_PARAMETER; - - p_gid->unicast.interface_id = p_port->p_physp->port_guid; - p_gid->unicast.prefix = p_subn->opt.subnet_prefix; - - return IB_SUCCESS; -} - -osm_physp_t *osm_get_physp_by_mad_addr(IN osm_log_t * p_log, - IN const osm_subn_t * p_subn, - IN osm_mad_addr_t * p_mad_addr) -{ - osm_port_t *p_port; - - p_port = osm_get_port_by_mad_addr(p_log, p_subn, p_mad_addr); - if (!p_port) - return NULL; - - return p_port->p_physp; -} - -osm_switch_t *osm_get_switch_by_guid(IN const osm_subn_t * p_subn, - IN uint64_t guid) -{ - osm_switch_t *p_switch; - - p_switch = (osm_switch_t *) cl_qmap_get(&(p_subn->sw_guid_tbl), guid); - if (p_switch == (osm_switch_t *) cl_qmap_end(&(p_subn->sw_guid_tbl))) - p_switch = NULL; - return p_switch; -} - -osm_node_t *osm_get_node_by_guid(IN osm_subn_t const *p_subn, IN uint64_t guid) -{ - osm_node_t *p_node; - - p_node = (osm_node_t *) cl_qmap_get(&(p_subn->node_guid_tbl), guid); - if (p_node == (osm_node_t *) cl_qmap_end(&(p_subn->node_guid_tbl))) - p_node = NULL; - return p_node; -} - -osm_port_t *osm_get_port_by_guid(IN osm_subn_t const *p_subn, IN ib_net64_t guid) -{ - osm_port_t *p_port; - - p_port = (osm_port_t *) cl_qmap_get(&(p_subn->port_guid_tbl), guid); - if (p_port == (osm_port_t *) cl_qmap_end(&(p_subn->port_guid_tbl))) - p_port = NULL; - return p_port; -} - -osm_port_t *osm_get_port_by_lid_ho(IN osm_subn_t const * subn, IN uint16_t lid) -{ - if (lid < cl_ptr_vector_get_size(&subn->port_lid_tbl)) - return cl_ptr_vector_get(&subn->port_lid_tbl, lid); - return NULL; -} - -osm_mgrp_t *osm_get_mgrp_by_mgid(IN osm_subn_t * subn, IN ib_gid_t * mgid) -{ - osm_mgrp_t *mgrp; - - mgrp= (osm_mgrp_t *)cl_fmap_get(&subn->mgrp_mgid_tbl, mgid); - if (mgrp != (osm_mgrp_t *)cl_fmap_end(&subn->mgrp_mgid_tbl)) - return mgrp; - return NULL; -} - -static void subn_set_default_qos_options(IN osm_qos_options_t * opt) -{ - opt->max_vls = OSM_DEFAULT_QOS_MAX_VLS; - opt->high_limit = OSM_DEFAULT_QOS_HIGH_LIMIT; - opt->vlarb_high = OSM_DEFAULT_QOS_VLARB_HIGH; - opt->vlarb_low = OSM_DEFAULT_QOS_VLARB_LOW; - opt->sl2vl = OSM_DEFAULT_QOS_SL2VL; -} - -static void subn_init_qos_options(osm_qos_options_t *opt, osm_qos_options_t *f) -{ - opt->max_vls = 0; - opt->high_limit = -1; - if (opt->vlarb_high) - free(opt->vlarb_high); - opt->vlarb_high = NULL; - if (opt->vlarb_low) - free(opt->vlarb_low); - opt->vlarb_low = NULL; - if (opt->sl2vl) - free(opt->sl2vl); - opt->sl2vl = NULL; - if (f) - memcpy(f, opt, sizeof(*f)); -} - -void osm_subn_set_default_opt(IN osm_subn_opt_t * p_opt) -{ - memset(p_opt, 0, sizeof(osm_subn_opt_t)); - p_opt->guid = 0; - p_opt->m_key = OSM_DEFAULT_M_KEY; - p_opt->sm_key = OSM_DEFAULT_SM_KEY; - p_opt->sa_key = OSM_DEFAULT_SA_KEY; - p_opt->subnet_prefix = IB_DEFAULT_SUBNET_PREFIX; - p_opt->m_key_lease_period = 0; - p_opt->sweep_interval = OSM_DEFAULT_SWEEP_INTERVAL_SECS; - p_opt->max_wire_smps = OSM_DEFAULT_SMP_MAX_ON_WIRE; - p_opt->console = strdup(OSM_DEFAULT_CONSOLE); - p_opt->console_port = OSM_DEFAULT_CONSOLE_PORT; - p_opt->transaction_timeout = OSM_DEFAULT_TRANS_TIMEOUT_MILLISEC; - p_opt->transaction_retries = OSM_DEFAULT_RETRY_COUNT; - /* by default we will consider waiting for 50x transaction timeout normal */ - p_opt->max_msg_fifo_timeout = 50 * OSM_DEFAULT_TRANS_TIMEOUT_MILLISEC; - p_opt->sm_priority = OSM_DEFAULT_SM_PRIORITY; - p_opt->lmc = OSM_DEFAULT_LMC; - p_opt->lmc_esp0 = FALSE; - p_opt->max_op_vls = OSM_DEFAULT_MAX_OP_VLS; - p_opt->force_link_speed = 15; - p_opt->reassign_lids = FALSE; - p_opt->ignore_other_sm = FALSE; - p_opt->single_thread = FALSE; - p_opt->disable_multicast = FALSE; - p_opt->force_log_flush = FALSE; - p_opt->subnet_timeout = OSM_DEFAULT_SUBNET_TIMEOUT; - p_opt->packet_life_time = OSM_DEFAULT_SWITCH_PACKET_LIFE; - p_opt->vl_stall_count = OSM_DEFAULT_VL_STALL_COUNT; - p_opt->leaf_vl_stall_count = OSM_DEFAULT_LEAF_VL_STALL_COUNT; - p_opt->head_of_queue_lifetime = OSM_DEFAULT_HEAD_OF_QUEUE_LIFE; - p_opt->leaf_head_of_queue_lifetime = - OSM_DEFAULT_LEAF_HEAD_OF_QUEUE_LIFE; - p_opt->local_phy_errors_threshold = OSM_DEFAULT_ERROR_THRESHOLD; - p_opt->overrun_errors_threshold = OSM_DEFAULT_ERROR_THRESHOLD; - p_opt->sminfo_polling_timeout = - OSM_SM_DEFAULT_POLLING_TIMEOUT_MILLISECS; - p_opt->polling_retry_number = OSM_SM_DEFAULT_POLLING_RETRY_NUMBER; - p_opt->force_heavy_sweep = FALSE; - p_opt->log_flags = OSM_LOG_DEFAULT_LEVEL; - p_opt->honor_guid2lid_file = FALSE; - p_opt->daemon = FALSE; - p_opt->sm_inactive = FALSE; - p_opt->babbling_port_policy = FALSE; - p_opt->use_optimized_slvl = FALSE; -#ifdef ENABLE_OSM_PERF_MGR - p_opt->perfmgr = FALSE; - p_opt->perfmgr_redir = TRUE; - p_opt->perfmgr_sweep_time_s = OSM_PERFMGR_DEFAULT_SWEEP_TIME_S; - p_opt->perfmgr_max_outstanding_queries = - OSM_PERFMGR_DEFAULT_MAX_OUTSTANDING_QUERIES; - p_opt->event_db_dump_file = NULL; /* use default */ -#endif /* ENABLE_OSM_PERF_MGR */ - - p_opt->event_plugin_name = NULL; - p_opt->event_plugin_options = NULL; - p_opt->node_name_map_name = NULL; - - p_opt->dump_files_dir = getenv("OSM_TMP_DIR"); - if (!p_opt->dump_files_dir || !(*p_opt->dump_files_dir)) - p_opt->dump_files_dir = OSM_DEFAULT_TMP_DIR; - p_opt->dump_files_dir = strdup(p_opt->dump_files_dir); - p_opt->log_file = strdup(OSM_DEFAULT_LOG_FILE); - p_opt->log_max_size = 0; - p_opt->partition_config_file = strdup(OSM_DEFAULT_PARTITION_CONFIG_FILE); - p_opt->no_partition_enforcement = FALSE; - p_opt->qos = FALSE; - p_opt->qos_policy_file = strdup(OSM_DEFAULT_QOS_POLICY_FILE); - p_opt->accum_log_file = TRUE; - p_opt->port_prof_ignore_file = NULL; - p_opt->hop_weights_file = NULL; - p_opt->dimn_ports_file = NULL; - p_opt->port_profile_switch_nodes = FALSE; - p_opt->sweep_on_trap = TRUE; - p_opt->use_ucast_cache = FALSE; - p_opt->routing_engine_names = NULL; - p_opt->connect_roots = FALSE; - p_opt->lid_matrix_dump_file = NULL; - p_opt->lfts_file = NULL; - p_opt->root_guid_file = NULL; - p_opt->cn_guid_file = NULL; - p_opt->io_guid_file = NULL; - p_opt->max_reverse_hops = 0; - p_opt->ids_guid_file = NULL; - p_opt->guid_routing_order_file = NULL; - p_opt->sa_db_file = NULL; - p_opt->sa_db_dump = FALSE; - p_opt->do_mesh_analysis = FALSE; - p_opt->exit_on_fatal = TRUE; - p_opt->enable_quirks = FALSE; - p_opt->no_clients_rereg = FALSE; - p_opt->prefix_routes_file = strdup(OSM_DEFAULT_PREFIX_ROUTES_FILE); - p_opt->consolidate_ipv6_snm_req = FALSE; - p_opt->lash_start_vl = 0; - p_opt->sm_sl = OSM_DEFAULT_SL; - p_opt->log_prefix = NULL; - subn_init_qos_options(&p_opt->qos_options, NULL); - subn_init_qos_options(&p_opt->qos_ca_options, NULL); - subn_init_qos_options(&p_opt->qos_sw0_options, NULL); - subn_init_qos_options(&p_opt->qos_swe_options, NULL); - subn_init_qos_options(&p_opt->qos_rtr_options, NULL); -} - -static char *clean_val(char *val) -{ - char *p = val; - /* clean leading spaces */ - while (isspace(*p)) - p++; - val = p; - if (!*val) - return val; - /* clean trailing spaces */ - p = val + strlen(val) - 1; - while (p > val && isspace(*p)) - p--; - p[1] = '\0'; - /* clean quotas */ - if ((*val == '\"' && *p == '\"') || (*val == '\'' && *p == '\'')) { - val++; - *p-- = '\0'; - } - return val; -} - -static int subn_dump_qos_options(FILE * file, const char *set_name, - const char *prefix, osm_qos_options_t * opt) -{ - return fprintf(file, "# %s\n" - "%s_max_vls %u\n" - "%s_high_limit %d\n" - "%s_vlarb_high %s\n" - "%s_vlarb_low %s\n" - "%s_sl2vl %s\n", - set_name, - prefix, opt->max_vls, - prefix, opt->high_limit, - prefix, opt->vlarb_high, - prefix, opt->vlarb_low, prefix, opt->sl2vl); -} - -static ib_api_status_t append_prefix_route(IN osm_subn_t * p_subn, - uint64_t prefix, uint64_t guid) -{ - osm_prefix_route_t *route; - - route = malloc(sizeof *route); - if (! route) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_ERROR, "out of memory"); - return IB_ERROR; - } - - route->prefix = cl_hton64(prefix); - route->guid = cl_hton64(guid); - cl_qlist_insert_tail(&p_subn->prefix_routes_list, &route->list_item); - return IB_SUCCESS; -} - -static ib_api_status_t parse_prefix_routes_file(IN osm_subn_t * p_subn) -{ - osm_log_t *log = &p_subn->p_osm->log; - FILE *fp; - char buf[1024]; - int line = 0; - int errors = 0; - - while (!cl_is_qlist_empty(&p_subn->prefix_routes_list)) { - cl_list_item_t *item = cl_qlist_remove_head(&p_subn->prefix_routes_list); - free(item); - } - - fp = fopen(p_subn->opt.prefix_routes_file, "r"); - if (! fp) { - if (errno == ENOENT) - return IB_SUCCESS; - - OSM_LOG(log, OSM_LOG_ERROR, "fopen(%s) failed: %s", - p_subn->opt.prefix_routes_file, strerror(errno)); - return IB_ERROR; - } - - while (fgets(buf, sizeof buf, fp) != NULL) { - char *p_prefix, *p_guid, *p_extra, *p_last, *p_end; - uint64_t prefix, guid; - - line++; - if (errors > 10) - break; - - p_prefix = strtok_r(buf, " \t\n", &p_last); - if (! p_prefix) - continue; /* ignore blank lines */ - - if (*p_prefix == '#') - continue; /* ignore comment lines */ - - p_guid = strtok_r(NULL, " \t\n", &p_last); - if (! p_guid) { - OSM_LOG(log, OSM_LOG_ERROR, "%s:%d: missing GUID\n", - p_subn->opt.prefix_routes_file, line); - errors++; - continue; - } - - p_extra = strtok_r(NULL, " \t\n", &p_last); - if (p_extra && *p_extra != '#') { - OSM_LOG(log, OSM_LOG_INFO, "%s:%d: extra tokens ignored\n", - p_subn->opt.prefix_routes_file, line); - } - - if (strcmp(p_prefix, "*") == 0) - prefix = 0; - else { - prefix = strtoull(p_prefix, &p_end, 16); - if (*p_end != '\0') { - OSM_LOG(log, OSM_LOG_ERROR, "%s:%d: illegal prefix: %s\n", - p_subn->opt.prefix_routes_file, line, p_prefix); - errors++; - continue; - } - } - - if (strcmp(p_guid, "*") == 0) - guid = 0; - else { - guid = strtoull(p_guid, &p_end, 16); - if (*p_end != '\0' && *p_end != '#') { - OSM_LOG(log, OSM_LOG_ERROR, "%s:%d: illegal GUID: %s\n", - p_subn->opt.prefix_routes_file, line, p_guid); - errors++; - continue; - } - } - - if (append_prefix_route(p_subn, prefix, guid) != IB_SUCCESS) { - errors++; - break; - } - } - - fclose(fp); - return (errors == 0) ? IB_SUCCESS : IB_ERROR; -} - -static void subn_verify_max_vls(unsigned *max_vls, const char *prefix, unsigned dflt) -{ - if (!*max_vls || *max_vls > 15) { - if (*max_vls) - log_report(" Invalid Cached Option: %s_max_vls=%u: " - "Using Default = %u\n", - prefix, *max_vls, dflt); - *max_vls = dflt; - } -} - -static void subn_verify_high_limit(int *high_limit, const char *prefix, int dflt) -{ - if (*high_limit < 0 || *high_limit > 255) { - if (*high_limit > 255) - log_report(" Invalid Cached Option: %s_high_limit=%d: " - "Using Default: %d\n", - prefix, *high_limit, dflt); - *high_limit = dflt; - } -} - -static void subn_verify_vlarb(char **vlarb, const char *prefix, - const char *suffix, char *dflt) -{ - char *str, *tok, *end, *ptr; - int count = 0; - - if (*vlarb == NULL) { - *vlarb = strdup(dflt); - return; - } - - str = strdup(*vlarb); - - tok = strtok_r(str, ",\n", &ptr); - while (tok) { - char *vl_str, *weight_str; - - vl_str = tok; - weight_str = strchr(tok, ':'); - - if (weight_str) { - long vl, weight; - - *weight_str = '\0'; - weight_str++; - - vl = strtol(vl_str, &end, 0); - - if (*end) - log_report(" Warning: Cached Option " - "%s_vlarb_%s:vl=%s" - " improperly formatted\n", - prefix, suffix, vl_str); - else if (vl < 0 || vl > 14) - log_report(" Warning: Cached Option " - "%s_vlarb_%s:vl=%ld out of range\n", - prefix, suffix, vl); - - weight = strtol(weight_str, &end, 0); - - if (*end) - log_report(" Warning: Cached Option " - "%s_vlarb_%s:weight=%s " - "improperly formatted\n", - prefix, suffix, weight_str); - else if (weight < 0 || weight > 255) - log_report(" Warning: Cached Option " - "%s_vlarb_%s:weight=%ld " - "out of range\n", - prefix, suffix, weight); - } else - log_report(" Warning: Cached Option " - "%s_vlarb_%s:vl:weight=%s " - "improperly formatted\n", - prefix, suffix, tok); - - count++; - tok = strtok_r(NULL, ",\n", &ptr); - } - - if (count > 64) - log_report(" Warning: Cached Option %s_vlarb_%s: > 64 listed:" - " excess vl:weight pairs will be dropped\n", - prefix, suffix); - - free(str); -} - -static void subn_verify_sl2vl(char **sl2vl, const char *prefix, char *dflt) -{ - char *str, *tok, *end, *ptr; - int count = 0; - - if (*sl2vl == NULL) { - *sl2vl = strdup(dflt); - return; - } - - str = strdup(*sl2vl); - - tok = strtok_r(str, ",\n", &ptr); - while (tok) { - long vl = strtol(tok, &end, 0); - - if (*end) - log_report(" Warning: Cached Option %s_sl2vl:vl=%s " - "improperly formatted\n", prefix, tok); - else if (vl < 0 || vl > 15) - log_report(" Warning: Cached Option %s_sl2vl:vl=%ld " - "out of range\n", prefix, vl); - - count++; - tok = strtok_r(NULL, ",\n", &ptr); - } - - if (count < 16) - log_report(" Warning: Cached Option %s_sl2vl: < 16 VLs " - "listed\n", prefix); - - if (count > 16) - log_report(" Warning: Cached Option %s_sl2vl: > 16 listed: " - "excess VLs will be dropped\n", prefix); - - free(str); -} - -static void subn_verify_qos_set(osm_qos_options_t *set, const char *prefix, - osm_qos_options_t *dflt) -{ - subn_verify_max_vls(&set->max_vls, prefix, dflt->max_vls); - subn_verify_high_limit(&set->high_limit, prefix, dflt->high_limit); - subn_verify_vlarb(&set->vlarb_low, prefix, "low", dflt->vlarb_low); - subn_verify_vlarb(&set->vlarb_high, prefix, "high", dflt->vlarb_high); - subn_verify_sl2vl(&set->sl2vl, prefix, dflt->sl2vl); -} - -int osm_subn_verify_config(IN osm_subn_opt_t * p_opts) -{ - if (p_opts->lmc > 7) { - log_report(" Invalid Cached Option Value:lmc = %u:" - "Using Default:%u\n", p_opts->lmc, OSM_DEFAULT_LMC); - p_opts->lmc = OSM_DEFAULT_LMC; - } - - if (15 < p_opts->sm_priority) { - log_report(" Invalid Cached Option Value:sm_priority = %u:" - "Using Default:%u\n", - p_opts->sm_priority, OSM_DEFAULT_SM_PRIORITY); - p_opts->sm_priority = OSM_DEFAULT_SM_PRIORITY; - } - - if ((15 < p_opts->force_link_speed) || - (p_opts->force_link_speed > 7 && p_opts->force_link_speed < 15)) { - log_report(" Invalid Cached Option Value:force_link_speed = %u:" - "Using Default:%u\n", p_opts->force_link_speed, - IB_PORT_LINK_SPEED_ENABLED_MASK); - p_opts->force_link_speed = IB_PORT_LINK_SPEED_ENABLED_MASK; - } - - if (p_opts->max_wire_smps == 0) - p_opts->max_wire_smps = 0x7FFFFFFF; - else if (p_opts->max_wire_smps > 0x7FFFFFFF) { - log_report(" Invalid Cached Option Value: max_wire_smps = %u," - " Using Default: %u\n", - p_opts->max_wire_smps, OSM_DEFAULT_SMP_MAX_ON_WIRE); - p_opts->max_wire_smps = OSM_DEFAULT_SMP_MAX_ON_WIRE; - } - - if (strcmp(p_opts->console, OSM_DISABLE_CONSOLE) - && strcmp(p_opts->console, OSM_LOCAL_CONSOLE) -#ifdef ENABLE_OSM_CONSOLE_SOCKET - && strcmp(p_opts->console, OSM_LOOPBACK_CONSOLE) - && strcmp(p_opts->console, OSM_REMOTE_CONSOLE) -#endif - ) { - log_report(" Invalid Cached Option Value:console = %s" - ", Using Default:%s\n", - p_opts->console, OSM_DEFAULT_CONSOLE); - p_opts->console = OSM_DEFAULT_CONSOLE; - } - - if (p_opts->qos) { - osm_qos_options_t dflt; - - /* the default options in qos_options must be correct. - * every other one need not be, b/c those will default - * back to whatever is in qos_options. - */ - - subn_set_default_qos_options(&dflt); - - subn_verify_qos_set(&p_opts->qos_options, "qos", &dflt); - subn_verify_qos_set(&p_opts->qos_ca_options, "qos_ca", - &p_opts->qos_options); - subn_verify_qos_set(&p_opts->qos_sw0_options, "qos_sw0", - &p_opts->qos_options); - subn_verify_qos_set(&p_opts->qos_swe_options, "qos_swe", - &p_opts->qos_options); - subn_verify_qos_set(&p_opts->qos_rtr_options, "qos_rtr", - &p_opts->qos_options); - } - -#ifdef ENABLE_OSM_PERF_MGR - if (p_opts->perfmgr_sweep_time_s < 1) { - log_report(" Invalid Cached Option Value:perfmgr_sweep_time_s " - "= %u Using Default:%u\n", - p_opts->perfmgr_sweep_time_s, - OSM_PERFMGR_DEFAULT_SWEEP_TIME_S); - p_opts->perfmgr_sweep_time_s = OSM_PERFMGR_DEFAULT_SWEEP_TIME_S; - } - if (p_opts->perfmgr_max_outstanding_queries < 1) { - log_report(" Invalid Cached Option Value:" - "perfmgr_max_outstanding_queries = %u" - " Using Default:%u\n", - p_opts->perfmgr_max_outstanding_queries, - OSM_PERFMGR_DEFAULT_MAX_OUTSTANDING_QUERIES); - p_opts->perfmgr_max_outstanding_queries = - OSM_PERFMGR_DEFAULT_MAX_OUTSTANDING_QUERIES; - } -#endif - - return 0; -} - -int osm_subn_parse_conf_file(char *file_name, osm_subn_opt_t * p_opts) -{ - char line[1024]; - FILE *opts_file; - char *p_key, *p_val; - const opt_rec_t *r; - void *p_field1, *p_field2; - - opts_file = fopen(file_name, "r"); - if (!opts_file) { - if (errno == ENOENT) - return 1; - printf("cannot open file \'%s\': %s\n", - file_name, strerror(errno)); - return -1; - } - - printf(" Reading Cached Option File: %s\n", file_name); - cl_log_event("OpenSM", CL_LOG_INFO, line, NULL, 0); - - p_opts->config_file = file_name; - if (!p_opts->file_opts && !(p_opts->file_opts = malloc(sizeof(*p_opts)))) - return -1; - memcpy(p_opts->file_opts, p_opts, sizeof(*p_opts)); - - while (fgets(line, 1023, opts_file) != NULL) { - /* get the first token */ - p_key = strtok_r(line, " \t\n", &p_val); - if (!p_key) - continue; - - p_val = clean_val(p_val); - - for (r = opt_tbl; r->name; r++) { - if (strcmp(r->name, p_key)) - continue; - - p_field1 = (uint8_t *)p_opts->file_opts + r->opt_offset; - p_field2 = (uint8_t *)p_opts + r->opt_offset; - /* don't call setup function first time */ - r->parse_fn(NULL, p_key, p_val, p_field1, p_field2, - NULL); - break; - } - } - fclose(opts_file); - - osm_subn_verify_config(p_opts); - - return 0; -} - -int osm_subn_rescan_conf_files(IN osm_subn_t * p_subn) -{ - char line[1024]; - osm_subn_opt_t *p_opts = &p_subn->opt; - const opt_rec_t *r; - FILE *opts_file; - char *p_key, *p_val; - void *p_field1, *p_field2; - - if (!p_opts->config_file) - return 0; - - opts_file = fopen(p_opts->config_file, "r"); - if (!opts_file) { - if (errno == ENOENT) - return 1; - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_ERROR, - "cannot open file \'%s\': %s\n", - p_opts->config_file, strerror(errno)); - return -1; - } - - subn_init_qos_options(&p_opts->qos_options, - &p_opts->file_opts->qos_options); - subn_init_qos_options(&p_opts->qos_ca_options, - &p_opts->file_opts->qos_ca_options); - subn_init_qos_options(&p_opts->qos_sw0_options, - &p_opts->file_opts->qos_sw0_options); - subn_init_qos_options(&p_opts->qos_swe_options, - &p_opts->file_opts->qos_swe_options); - subn_init_qos_options(&p_opts->qos_rtr_options, - &p_opts->file_opts->qos_rtr_options); - - while (fgets(line, 1023, opts_file) != NULL) { - /* get the first token */ - p_key = strtok_r(line, " \t\n", &p_val); - if (!p_key) - continue; - - p_val = clean_val(p_val); - - for (r = opt_tbl; r->name; r++) { - if (!r->can_update || strcmp(r->name, p_key)) - continue; - - p_field1 = (uint8_t *)p_opts->file_opts + r->opt_offset; - p_field2 = (uint8_t *)p_opts + r->opt_offset; - r->parse_fn(p_subn, p_key, p_val, p_field1, p_field2, - r->setup_fn); - break; - } - } - fclose(opts_file); - - osm_subn_verify_config(p_opts); - - parse_prefix_routes_file(p_subn); - - return 0; -} - -int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opts) -{ - fprintf(out, - "#\n# DEVICE ATTRIBUTES OPTIONS\n#\n" - "# The port GUID on which the OpenSM is running\n" - "guid 0x%016" PRIx64 "\n\n" - "# M_Key value sent to all ports qualifying all Set(PortInfo)\n" - "m_key 0x%016" PRIx64 "\n\n" - "# The lease period used for the M_Key on this subnet in [sec]\n" - "m_key_lease_period %u\n\n" - "# SM_Key value of the SM used for SM authentication\n" - "sm_key 0x%016" PRIx64 "\n\n" - "# SM_Key value to qualify rcv SA queries as 'trusted'\n" - "sa_key 0x%016" PRIx64 "\n\n" - "# Note that for both values above (sm_key and sa_key)\n" - "# OpenSM version 3.2.1 and below used the default value '1'\n" - "# in a host byte order, it is fixed now but you may need to\n" - "# change the values to interoperate with old OpenSM running\n" - "# on a little endian machine.\n\n" - "# Subnet prefix used on this subnet\n" - "subnet_prefix 0x%016" PRIx64 "\n\n" - "# The LMC value used on this subnet\n" - "lmc %u\n\n" - "# lmc_esp0 determines whether LMC value used on subnet is used for\n" - "# enhanced switch port 0. If TRUE, LMC value for subnet is used for\n" - "# ESP0. Otherwise, LMC value for ESP0s is 0.\n" - "lmc_esp0 %s\n\n" - "# sm_sl determines SMSL used for SM/SA communication\n" - "sm_sl %u\n\n" - "# The code of maximal time a packet can live in a switch\n" - "# The actual time is 4.096usec * 2^\n" - "# The value 0x14 disables this mechanism\n" - "packet_life_time 0x%02x\n\n" - "# The number of sequential packets dropped that cause the port\n" - "# to enter the VLStalled state. The result of setting this value to\n" - "# zero is undefined.\n" - "vl_stall_count 0x%02x\n\n" - "# The number of sequential packets dropped that cause the port\n" - "# to enter the VLStalled state. This value is for switch ports\n" - "# driving a CA or router port. The result of setting this value\n" - "# to zero is undefined.\n" - "leaf_vl_stall_count 0x%02x\n\n" - "# The code of maximal time a packet can wait at the head of\n" - "# transmission queue.\n" - "# The actual time is 4.096usec * 2^\n" - "# The value 0x14 disables this mechanism\n" - "head_of_queue_lifetime 0x%02x\n\n" - "# The maximal time a packet can wait at the head of queue on\n" - "# switch port connected to a CA or router port\n" - "leaf_head_of_queue_lifetime 0x%02x\n\n" - "# Limit the maximal operational VLs\n" - "max_op_vls %u\n\n" - "# Force PortInfo:LinkSpeedEnabled on switch ports\n" - "# If 0, don't modify PortInfo:LinkSpeedEnabled on switch port\n" - "# Otherwise, use value for PortInfo:LinkSpeedEnabled on switch port\n" - "# Values are (IB Spec 1.2.1, 14.2.5.6 Table 146 \"PortInfo\")\n" - "# 1: 2.5 Gbps\n" - "# 3: 2.5 or 5.0 Gbps\n" - "# 5: 2.5 or 10.0 Gbps\n" - "# 7: 2.5 or 5.0 or 10.0 Gbps\n" - "# 2,4,6,8-14 Reserved\n" - "# Default 15: set to PortInfo:LinkSpeedSupported\n" - "force_link_speed %u\n\n" - "# The subnet_timeout code that will be set for all the ports\n" - "# The actual timeout is 4.096usec * 2^\n" - "subnet_timeout %u\n\n" - "# Threshold of local phy errors for sending Trap 129\n" - "local_phy_errors_threshold 0x%02x\n\n" - "# Threshold of credit overrun errors for sending Trap 130\n" - "overrun_errors_threshold 0x%02x\n\n", - cl_ntoh64(p_opts->guid), - cl_ntoh64(p_opts->m_key), - cl_ntoh16(p_opts->m_key_lease_period), - cl_ntoh64(p_opts->sm_key), - cl_ntoh64(p_opts->sa_key), - cl_ntoh64(p_opts->subnet_prefix), - p_opts->lmc, - p_opts->lmc_esp0 ? "TRUE" : "FALSE", - p_opts->sm_sl, - p_opts->packet_life_time, - p_opts->vl_stall_count, - p_opts->leaf_vl_stall_count, - p_opts->head_of_queue_lifetime, - p_opts->leaf_head_of_queue_lifetime, - p_opts->max_op_vls, - p_opts->force_link_speed, - p_opts->subnet_timeout, - p_opts->local_phy_errors_threshold, - p_opts->overrun_errors_threshold); - - fprintf(out, - "#\n# PARTITIONING OPTIONS\n#\n" - "# Partition configuration file to be used\n" - "partition_config_file %s\n\n" - "# Disable partition enforcement by switches\n" - "no_partition_enforcement %s\n\n", - p_opts->partition_config_file, - p_opts->no_partition_enforcement ? "TRUE" : "FALSE"); - - fprintf(out, - "#\n# SWEEP OPTIONS\n#\n" - "# The number of seconds between subnet sweeps (0 disables it)\n" - "sweep_interval %u\n\n" - "# If TRUE cause all lids to be reassigned\n" - "reassign_lids %s\n\n" - "# If TRUE forces every sweep to be a heavy sweep\n" - "force_heavy_sweep %s\n\n" - "# If TRUE every trap will cause a heavy sweep.\n" - "# NOTE: successive identical traps (>10) are suppressed\n" - "sweep_on_trap %s\n\n", - p_opts->sweep_interval, - p_opts->reassign_lids ? "TRUE" : "FALSE", - p_opts->force_heavy_sweep ? "TRUE" : "FALSE", - p_opts->sweep_on_trap ? "TRUE" : "FALSE"); - - fprintf(out, - "#\n# ROUTING OPTIONS\n#\n" - "# If TRUE count switches as link subscriptions\n" - "port_profile_switch_nodes %s\n\n", - p_opts->port_profile_switch_nodes ? "TRUE" : "FALSE"); - - fprintf(out, - "# Name of file with port guids to be ignored by port profiling\n" - "port_prof_ignore_file %s\n\n", p_opts->port_prof_ignore_file ? - p_opts->port_prof_ignore_file : null_str); - - fprintf(out, - "# The file holding routing weighting factors per output port\n" - "hop_weights_file %s\n\n", - p_opts->hop_weights_file ? p_opts->hop_weights_file : null_str); - - fprintf(out, - "# The file holding non-default port order per switch for DOR routing \n" - "dimn_ports_file %s\n\n", - p_opts->dimn_ports_file ? p_opts->dimn_ports_file : null_str); - - fprintf(out, - "# Routing engine\n" - "# Multiple routing engines can be specified separated by\n" - "# commas so that specific ordering of routing algorithms will\n" - "# be tried if earlier routing engines fail.\n" - "# Supported engines: minhop, updn, file, ftree, lash, dor\n" - "routing_engine %s\n\n", p_opts->routing_engine_names ? - p_opts->routing_engine_names : null_str); - - fprintf(out, - "# Connect roots (use FALSE if unsure)\n" - "connect_roots %s\n\n", - p_opts->connect_roots ? "TRUE" : "FALSE"); - - fprintf(out, - "# Use unicast routing cache (use FALSE if unsure)\n" - "use_ucast_cache %s\n\n", - p_opts->use_ucast_cache ? "TRUE" : "FALSE"); - - fprintf(out, - "# Lid matrix dump file name\n" - "lid_matrix_dump_file %s\n\n", p_opts->lid_matrix_dump_file ? - p_opts->lid_matrix_dump_file : null_str); - - fprintf(out, - "# LFTs file name\nlfts_file %s\n\n", - p_opts->lfts_file ? p_opts->lfts_file : null_str); - - fprintf(out, - "# The file holding the root node guids (for fat-tree or Up/Down)\n" - "# One guid in each line\nroot_guid_file %s\n\n", - p_opts->root_guid_file ? p_opts->root_guid_file : null_str); - - fprintf(out, - "# The file holding the fat-tree compute node guids\n" - "# One guid in each line\ncn_guid_file %s\n\n", - p_opts->cn_guid_file ? p_opts->cn_guid_file : null_str); - - fprintf(out, - "# The file holding the fat-tree I/O node guids\n" - "# One guid in each line\nio_guid_file %s\n\n", - p_opts->io_guid_file ? p_opts->io_guid_file : null_str); - - fprintf(out, - "# Number of reverse hops allowed for I/O nodes \n" - "# Used for connectivity between I/O nodes connected to Top Switches\nmax_reverse_hops %d\n\n", - p_opts->max_reverse_hops); - - fprintf(out, - "# The file holding the node ids which will be used by" - " Up/Down algorithm instead\n# of GUIDs (one guid and" - " id in each line)\nids_guid_file %s\n\n", - p_opts->ids_guid_file ? p_opts->ids_guid_file : null_str); - - fprintf(out, - "# The file holding guid routing order guids (for MinHop and Up/Down)\n" - "guid_routing_order_file %s\n\n", - p_opts->guid_routing_order_file ? p_opts->guid_routing_order_file : null_str); - - fprintf(out, - "# Do mesh topology analysis (for LASH algorithm)\n" - "do_mesh_analysis %s\n\n", - p_opts->do_mesh_analysis ? "TRUE" : "FALSE"); - - fprintf(out, - "# Starting VL for LASH algorithm\n" - "lash_start_vl %u\n\n", - p_opts->lash_start_vl); - - fprintf(out, - "# SA database file name\nsa_db_file %s\n\n", - p_opts->sa_db_file ? p_opts->sa_db_file : null_str); - - fprintf(out, - "# If TRUE causes OpenSM to dump SA database at the end of\n" - "# every light sweep, regardless of the verbosity level\n" - "sa_db_dump %s\n\n", - p_opts->sa_db_dump ? "TRUE" : "FALSE"); - - fprintf(out, - "#\n# HANDOVER - MULTIPLE SMs OPTIONS\n#\n" - "# SM priority used for deciding who is the master\n" - "# Range goes from 0 (lowest priority) to 15 (highest).\n" - "sm_priority %u\n\n" - "# If TRUE other SMs on the subnet should be ignored\n" - "ignore_other_sm %s\n\n" - "# Timeout in [msec] between two polls of active master SM\n" - "sminfo_polling_timeout %u\n\n" - "# Number of failing polls of remote SM that declares it dead\n" - "polling_retry_number %u\n\n" - "# If TRUE honor the guid2lid file when coming out of standby\n" - "# state, if such file exists and is valid\n" - "honor_guid2lid_file %s\n\n", - p_opts->sm_priority, - p_opts->ignore_other_sm ? "TRUE" : "FALSE", - p_opts->sminfo_polling_timeout, - p_opts->polling_retry_number, - p_opts->honor_guid2lid_file ? "TRUE" : "FALSE"); - - fprintf(out, - "#\n# TIMING AND THREADING OPTIONS\n#\n" - "# Maximum number of SMPs sent in parallel\n" - "max_wire_smps %u\n\n" - "# The maximum time in [msec] allowed for a transaction to complete\n" - "transaction_timeout %u\n\n" - "# The maximum number of retries allowed for a transaction to complete\n" - "transaction_retries %u\n\n" - "# Maximal time in [msec] a message can stay in the incoming message queue.\n" - "# If there is more than one message in the queue and the last message\n" - "# stayed in the queue more than this value, any SA request will be\n" - "# immediately returned with a BUSY status.\n" - "max_msg_fifo_timeout %u\n\n" - "# Use a single thread for handling SA queries\n" - "single_thread %s\n\n", - p_opts->max_wire_smps, - p_opts->transaction_timeout, - p_opts->transaction_retries, - p_opts->max_msg_fifo_timeout, - p_opts->single_thread ? "TRUE" : "FALSE"); - - fprintf(out, - "#\n# MISC OPTIONS\n#\n" - "# Daemon mode\n" - "daemon %s\n\n" - "# SM Inactive\n" - "sm_inactive %s\n\n" - "# Babbling Port Policy\n" - "babbling_port_policy %s\n\n" - "# Use Optimized SLtoVLMapping programming if supported by device\n" - "use_optimized_slvl %s\n\n", - p_opts->daemon ? "TRUE" : "FALSE", - p_opts->sm_inactive ? "TRUE" : "FALSE", - p_opts->babbling_port_policy ? "TRUE" : "FALSE", - p_opts->use_optimized_slvl ? "TRUE" : "FALSE"); - -#ifdef ENABLE_OSM_PERF_MGR - fprintf(out, - "#\n# Performance Manager Options\n#\n" - "# perfmgr enable\n" - "perfmgr %s\n\n" - "# perfmgr redirection enable\n" - "perfmgr_redir %s\n\n" - "# sweep time in seconds\n" - "perfmgr_sweep_time_s %u\n\n" - "# Max outstanding queries\n" - "perfmgr_max_outstanding_queries %u\n\n", - p_opts->perfmgr ? "TRUE" : "FALSE", - p_opts->perfmgr_redir ? "TRUE" : "FALSE", - p_opts->perfmgr_sweep_time_s, - p_opts->perfmgr_max_outstanding_queries); - - fprintf(out, - "#\n# Event DB Options\n#\n" - "# Dump file to dump the events to\n" - "event_db_dump_file %s\n\n", p_opts->event_db_dump_file ? - p_opts->event_db_dump_file : null_str); -#endif /* ENABLE_OSM_PERF_MGR */ - - fprintf(out, - "#\n# Event Plugin Options\n#\n" - "# Event plugin name(s)\n" - "event_plugin_name %s\n\n" - "# Options string that would be passed to the plugin(s)\n" - "event_plugin_options %s\n\n", - p_opts->event_plugin_name ? - p_opts->event_plugin_name : null_str, - p_opts->event_plugin_options ? - p_opts->event_plugin_options : null_str); - - fprintf(out, - "#\n# Node name map for mapping node's to more descriptive node descriptions\n" - "# (man ibnetdiscover for more information)\n#\n" - "node_name_map_name %s\n\n", p_opts->node_name_map_name ? - p_opts->node_name_map_name : null_str); - - fprintf(out, - "#\n# DEBUG FEATURES\n#\n" - "# The log flags used\n" - "log_flags 0x%02x\n\n" - "# Force flush of the log file after each log message\n" - "force_log_flush %s\n\n" - "# Log file to be used\n" - "log_file %s\n\n" - "# Limit the size of the log file in MB. If overrun, log is restarted\n" - "log_max_size %lu\n\n" - "# If TRUE will accumulate the log over multiple OpenSM sessions\n" - "accum_log_file %s\n\n" - "# The directory to hold the file OpenSM dumps\n" - "dump_files_dir %s\n\n" - "# If TRUE enables new high risk options and hardware specific quirks\n" - "enable_quirks %s\n\n" - "# If TRUE disables client reregistration\n" - "no_clients_rereg %s\n\n" - "# If TRUE OpenSM should disable multicast support and\n" - "# no multicast routing is performed if TRUE\n" - "disable_multicast %s\n\n" - "# If TRUE opensm will exit on fatal initialization issues\n" - "exit_on_fatal %s\n\n" "# console [off|local" -#ifdef ENABLE_OSM_CONSOLE_SOCKET - "|loopback|socket]\n" -#else - "]\n" -#endif - "console %s\n\n" - "# Telnet port for console (default %d)\n" - "console_port %d\n\n", - p_opts->log_flags, - p_opts->force_log_flush ? "TRUE" : "FALSE", - p_opts->log_file, - p_opts->log_max_size, - p_opts->accum_log_file ? "TRUE" : "FALSE", - p_opts->dump_files_dir, - p_opts->enable_quirks ? "TRUE" : "FALSE", - p_opts->no_clients_rereg ? "TRUE" : "FALSE", - p_opts->disable_multicast ? "TRUE" : "FALSE", - p_opts->exit_on_fatal ? "TRUE" : "FALSE", - p_opts->console, - OSM_DEFAULT_CONSOLE_PORT, p_opts->console_port); - - fprintf(out, - "#\n# QoS OPTIONS\n#\n" - "# Enable QoS setup\n" - "qos %s\n\n" - "# QoS policy file to be used\n" - "qos_policy_file %s\n\n", - p_opts->qos ? "TRUE" : "FALSE", p_opts->qos_policy_file); - - subn_dump_qos_options(out, - "QoS default options", "qos", - &p_opts->qos_options); - fprintf(out, "\n"); - subn_dump_qos_options(out, - "QoS CA options", "qos_ca", - &p_opts->qos_ca_options); - fprintf(out, "\n"); - subn_dump_qos_options(out, - "QoS Switch Port 0 options", "qos_sw0", - &p_opts->qos_sw0_options); - fprintf(out, "\n"); - subn_dump_qos_options(out, - "QoS Switch external ports options", "qos_swe", - &p_opts->qos_swe_options); - fprintf(out, "\n"); - subn_dump_qos_options(out, - "QoS Router ports options", "qos_rtr", - &p_opts->qos_rtr_options); - fprintf(out, "\n"); - - fprintf(out, - "# Prefix routes file name\n" - "prefix_routes_file %s\n\n", - p_opts->prefix_routes_file); - - fprintf(out, - "#\n# IPv6 Solicited Node Multicast (SNM) Options\n#\n" - "consolidate_ipv6_snm_req %s\n\n", - p_opts->consolidate_ipv6_snm_req ? "TRUE" : "FALSE"); - - fprintf(out, "# Log prefix\nlog_prefix %s\n\n", p_opts->log_prefix); - - /* optional string attributes ... */ - - return 0; -} - -int osm_subn_write_conf_file(char *file_name, IN osm_subn_opt_t * p_opts) -{ - FILE *opts_file; - - opts_file = fopen(file_name, "w"); - if (!opts_file) { - printf("cannot open file \'%s\' for writing: %s\n", - file_name, strerror(errno)); - return -1; - } - - if (osm_subn_output_conf(opts_file, p_opts) < 0) - return -1; - - fclose(opts_file); - - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_sw_info_rcv.c b/branches/opensm_3/user/opensm/osm_sw_info_rcv.c deleted file mode 100644 index f79aca73..00000000 --- a/branches/opensm_3/user/opensm/osm_sw_info_rcv.c +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_si_rcv_t. - * This object represents the SwitchInfo Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if 0 -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void si_rcv_get_fwd_tbl(IN osm_sm_t * sm, IN osm_switch_t * p_sw) -{ - osm_madw_context_t context; - osm_dr_path_t *p_dr_path; - osm_physp_t *p_physp; - osm_node_t *p_node; - uint32_t block_id_ho; - uint32_t max_block_id_ho; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_sw); - - p_node = p_sw->p_node; - - CL_ASSERT(osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH); - - context.lft_context.node_guid = osm_node_get_node_guid(p_node); - context.lft_context.set_method = FALSE; - - max_block_id_ho = osm_switch_get_max_block_id_in_use(p_sw); - - p_physp = osm_node_get_physp_ptr(p_node, 0); - p_dr_path = osm_physp_get_dr_path_ptr(p_physp); - - for (block_id_ho = 0; block_id_ho <= max_block_id_ho; block_id_ho++) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Retrieving FT block %u\n", block_id_ho); - - status = osm_req_get(sm, p_dr_path, IB_MAD_ATTR_LIN_FWD_TBL, - cl_hton32(block_id_ho), - CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) - /* continue the loop despite the error */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3603: " - "Failure initiating PortInfo request (%s)\n", - ib_get_err_str(status)); - } - - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - The plock must be held before calling this function. -**********************************************************************/ -static void si_rcv_get_mcast_fwd_tbl(IN osm_sm_t * sm, IN osm_switch_t * p_sw) -{ - osm_madw_context_t context; - osm_dr_path_t *p_dr_path; - osm_physp_t *p_physp; - osm_node_t *p_node; - osm_mcast_tbl_t *p_tbl; - uint32_t block_id_ho; - uint32_t max_block_id_ho; - uint32_t position; - uint32_t max_position; - uint32_t attr_mod_ho; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_sw); - - p_node = p_sw->p_node; - - CL_ASSERT(osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH); - - if (osm_switch_get_mcast_fwd_tbl_size(p_sw) == 0) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Multicast not supported by switch 0x%016" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - goto Exit; - } - - context.mft_context.node_guid = osm_node_get_node_guid(p_node); - context.mft_context.set_method = FALSE; - - p_tbl = osm_switch_get_mcast_tbl_ptr(p_sw); - max_block_id_ho = osm_mcast_tbl_get_max_block(p_tbl); - - if (max_block_id_ho > IB_MCAST_MAX_BLOCK_ID) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3609: " - "Out-of-range mcast block size = %u on switch 0x%016" - PRIx64 "\n", max_block_id_ho, - cl_ntoh64(osm_node_get_node_guid(p_node))); - goto Exit; - } - - max_position = osm_mcast_tbl_get_max_position(p_tbl); - - CL_ASSERT(max_position <= IB_MCAST_POSITION_MAX); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Max MFT block = %u, Max position = %u\n", max_block_id_ho, - max_position); - - p_physp = osm_node_get_physp_ptr(p_node, 0); - p_dr_path = osm_physp_get_dr_path_ptr(p_physp); - - for (block_id_ho = 0; block_id_ho <= max_block_id_ho; block_id_ho++) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Retrieving MFT block %u\n", block_id_ho); - - for (position = 0; position <= max_position; position++) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Retrieving MFT position %u\n", position); - - attr_mod_ho = - block_id_ho | position << IB_MCAST_POSITION_SHIFT; - status = - osm_req_get(sm, p_dr_path, - IB_MAD_ATTR_MCAST_FWD_TBL, - cl_hton32(attr_mod_ho), - CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) - /* continue the loop despite the error */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3607: " - "Failure initiating PortInfo request (%s)\n", - ib_get_err_str(status)); - } - } - -Exit: - OSM_LOG_EXIT(sm->p_log); -} -#endif - -/********************************************************************** - Lock must be held on entry to this function. -**********************************************************************/ -static void si_rcv_process_new(IN osm_sm_t * sm, IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - osm_switch_t *p_sw; - osm_switch_t *p_check; - ib_switch_info_t *p_si; - ib_smp_t *p_smp; - cl_qmap_t *p_sw_guid_tbl; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_sw_guid_tbl = &sm->p_subn->sw_guid_tbl; - p_smp = osm_madw_get_smp_ptr(p_madw); - p_si = ib_smp_get_payload_ptr(p_smp); - - osm_dump_switch_info(sm->p_log, p_si, OSM_LOG_DEBUG); - - p_sw = osm_switch_new(p_node, p_madw); - if (p_sw == NULL) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3608: " - "Unable to allocate new switch object\n"); - goto Exit; - } - - /* set subnet max mlid to the minimum MulticastFDBCap of all switches */ - if (cl_ntoh16(p_si->mcast_cap) + IB_LID_MCAST_START_HO - 1 < - sm->p_subn->max_mcast_lid_ho) { - sm->p_subn->max_mcast_lid_ho = cl_ntoh16(p_si->mcast_cap) + - IB_LID_MCAST_START_HO - 1; - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Subnet max multicast lid is 0x%X\n", - sm->p_subn->max_mcast_lid_ho); - } - - /* set subnet max unicast lid to the minimum LinearFDBCap of all switches */ - if (cl_ntoh16(p_si->lin_cap) < sm->p_subn->max_ucast_lid_ho) { - sm->p_subn->max_ucast_lid_ho = cl_ntoh16(p_si->lin_cap); - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Subnet max unicast lid is 0x%X\n", - sm->p_subn->max_ucast_lid_ho); - } - - p_check = (osm_switch_t *) cl_qmap_insert(p_sw_guid_tbl, - osm_node_get_node_guid - (p_node), &p_sw->map_item); - if (p_check != p_sw) { - /* This shouldn't happen since we hold the lock! */ - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3605: " - "Unable to add new switch object to database\n"); - osm_switch_delete(&p_sw); - goto Exit; - } - - p_node->sw = p_sw; - - /* Update the switch info according to the info we just received. */ - osm_switch_set_switch_info(p_sw, p_si); - -#if 0 - /* Don't bother retrieving the current unicast and multicast tables - from the switches. The current version of SM does - not support silent take-over of an existing multicast - configuration. - - Gathering the multicast tables can also generate large amounts - of extra subnet-init traffic. - - The code to retrieve the tables was fully debugged. */ - - si_rcv_get_fwd_tbl(sm, p_sw); - if (!sm->p_subn->opt.disable_multicast) - si_rcv_get_mcast_fwd_tbl(sm, p_sw); -#endif - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -/********************************************************************** - Lock must be held on entry to this function. - Return 1 if the caller is expected to send a change_detected event. - this can not be done internally as the event needs the lock... -**********************************************************************/ -static boolean_t si_rcv_process_existing(IN osm_sm_t * sm, - IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - osm_switch_t *p_sw = p_node->sw; - ib_switch_info_t *p_si; - osm_si_context_t *p_si_context; - ib_smp_t *p_smp; - boolean_t is_change_detected = FALSE; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_si = ib_smp_get_payload_ptr(p_smp); - p_si_context = osm_madw_get_si_context_ptr(p_madw); - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Received logical %cetResp()\n", - p_si_context->set_method ? 'S' : 'G'); - - osm_switch_set_switch_info(p_sw, p_si); - - if (p_si_context->light_sweep == TRUE && !p_si_context->set_method) { - /* If state changed bit is on the mad was returned with an - error - signal a change to the state manager. */ - if (ib_smp_get_status(p_smp) != 0) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "GetResp() received with error in light sweep. " - "Commencing heavy sweep\n"); - is_change_detected = TRUE; - } else if (ib_switch_info_get_state_change(p_si)) { - osm_dump_switch_info(sm->p_log, p_si, OSM_LOG_DEBUG); - is_change_detected = TRUE; - } - } - - OSM_LOG_EXIT(sm->p_log); - return is_change_detected; -} - -void osm_si_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_switch_info_t *p_si; - ib_smp_t *p_smp; - osm_node_t *p_node; - ib_net64_t node_guid; - osm_si_context_t *p_context; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_si = ib_smp_get_payload_ptr(p_smp); - p_context = osm_madw_get_si_context_ptr(p_madw); - node_guid = p_context->node_guid; - - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Switch GUID 0x%016" PRIx64 ", TID 0x%" PRIx64 "\n", - cl_ntoh64(node_guid), cl_ntoh64(p_smp->trans_id)); - - CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); - - p_node = osm_get_node_by_guid(sm->p_subn, node_guid); - if (!p_node) { - CL_PLOCK_RELEASE(sm->p_lock); - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3606: " - "SwitchInfo received for nonexistent node " - "with GUID 0x%" PRIx64 "\n", cl_ntoh64(node_guid)); - goto Exit; - } - - /* Hack for bad value in Mellanox switch */ - if (cl_ntoh16(p_si->lin_top) > IB_LID_UCAST_END_HO) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3610: " - "\n\t\t\t\tBad LinearFDBTop value = 0x%X " - "on switch 0x%" PRIx64 - "\n\t\t\t\tForcing internal correction to 0x%X\n", - cl_ntoh16(p_si->lin_top), - cl_ntoh64(osm_node_get_node_guid(p_node)), 0); - p_si->lin_top = 0; - } - - /* Acquire the switch object for this switch. */ - if (!p_node->sw) { - si_rcv_process_new(sm, p_node, p_madw); - /* A new switch was found during the sweep so we need - to ignore the current LFT settings. */ - sm->p_subn->ignore_existing_lfts = TRUE; - } else if (si_rcv_process_existing(sm, p_node, p_madw)) - /* we might get back a request for signaling change was detected */ - sm->p_subn->force_heavy_sweep = TRUE; - - CL_PLOCK_RELEASE(sm->p_lock); -Exit: - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_switch.c b/branches/opensm_3/user/opensm/osm_switch.c deleted file mode 100644 index 9581c4c9..00000000 --- a/branches/opensm_3/user/opensm/osm_switch.c +++ /dev/null @@ -1,638 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_switch_t. - * This object represents an Infiniband switch. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include - -cl_status_t osm_switch_set_hops(IN osm_switch_t * p_sw, IN uint16_t lid_ho, - IN uint8_t port_num, IN uint8_t num_hops) -{ - if (lid_ho > p_sw->max_lid_ho) - return -1; - if (!p_sw->hops[lid_ho]) { - p_sw->hops[lid_ho] = malloc(p_sw->num_ports); - if (!p_sw->hops[lid_ho]) - return -1; - memset(p_sw->hops[lid_ho], OSM_NO_PATH, p_sw->num_ports); - } - - p_sw->hops[lid_ho][port_num] = num_hops; - if (p_sw->hops[lid_ho][0] > num_hops) - p_sw->hops[lid_ho][0] = num_hops; - - return 0; -} - -void osm_switch_delete(IN OUT osm_switch_t ** pp_sw) -{ - osm_switch_t *p_sw = *pp_sw; - unsigned i; - - osm_mcast_tbl_destroy(&p_sw->mcast_tbl); - if (p_sw->p_prof) - free(p_sw->p_prof); - if (p_sw->dimn_ports) - free(p_sw->dimn_ports); - if (p_sw->lft) - free(p_sw->lft); - if (p_sw->new_lft) - free(p_sw->new_lft); - if (p_sw->hops) { - for (i = 0; i < p_sw->num_hops; i++) - if (p_sw->hops[i]) - free(p_sw->hops[i]); - free(p_sw->hops); - } - free(*pp_sw); - *pp_sw = NULL; -} - -osm_switch_t *osm_switch_new(IN osm_node_t * p_node, - IN const osm_madw_t * p_madw) -{ - osm_switch_t *p_sw; - ib_switch_info_t *p_si; - ib_smp_t *p_smp; - uint8_t num_ports; - uint32_t port_num; - - CL_ASSERT(p_madw); - CL_ASSERT(p_node); - - p_smp = osm_madw_get_smp_ptr(p_madw); - p_si = ib_smp_get_payload_ptr(p_smp); - num_ports = osm_node_get_num_physp(p_node); - - CL_ASSERT(p_smp->attr_id == IB_MAD_ATTR_SWITCH_INFO); - - if (!p_si->lin_cap) /* The switch doesn't support LFT */ - return NULL; - - p_sw = malloc(sizeof(*p_sw)); - if (!p_sw) - return NULL; - - memset(p_sw, 0, sizeof(*p_sw)); - - p_sw->p_node = p_node; - p_sw->switch_info = *p_si; - p_sw->num_ports = num_ports; - p_sw->need_update = 2; - - p_sw->p_prof = malloc(sizeof(*p_sw->p_prof) * num_ports); - if (!p_sw->p_prof) - goto err; - - memset(p_sw->p_prof, 0, sizeof(*p_sw->p_prof) * num_ports); - - osm_mcast_tbl_init(&p_sw->mcast_tbl, osm_node_get_num_physp(p_node), - cl_ntoh16(p_si->mcast_cap)); - - for (port_num = 0; port_num < num_ports; port_num++) - osm_port_prof_construct(&p_sw->p_prof[port_num]); - - return p_sw; - -err: - osm_switch_delete(&p_sw); - return NULL; -} - -boolean_t osm_switch_get_lft_block(IN const osm_switch_t * p_sw, - IN uint16_t block_id, OUT uint8_t * p_block) -{ - uint16_t base_lid_ho = block_id * IB_SMP_DATA_SIZE; - - CL_ASSERT(p_sw); - CL_ASSERT(p_block); - - if (base_lid_ho > p_sw->max_lid_ho) - return FALSE; - - CL_ASSERT(base_lid_ho + IB_SMP_DATA_SIZE <= IB_LID_UCAST_END_HO); - memcpy(p_block, &(p_sw->lft[base_lid_ho]), IB_SMP_DATA_SIZE); - return TRUE; -} - -static struct osm_remote_node * -switch_find_guid_common(IN const osm_switch_t * p_sw, - IN struct osm_remote_guids_count *r, - IN uint8_t port_num, IN int find_sys_guid, - IN int find_node_guid) -{ - struct osm_remote_node *p_remote_guid = NULL; - osm_physp_t *p_physp; - osm_physp_t *p_rem_physp; - osm_node_t *p_rem_node; - uint64_t sys_guid; - uint64_t node_guid; - unsigned int i; - - CL_ASSERT(p_sw); - - p_physp = osm_node_get_physp_ptr(p_sw->p_node, port_num); - p_rem_physp = osm_physp_get_remote(p_physp); - p_rem_node = osm_physp_get_node_ptr(p_rem_physp); - sys_guid = p_rem_node->node_info.sys_guid; - node_guid = p_rem_node->node_info.node_guid; - - for (i = 0; i < r->count; i++) { - if ((!find_sys_guid - || r->guids[i].node->node_info.sys_guid == sys_guid) - && (!find_node_guid - || r->guids[i].node->node_info.node_guid == node_guid)) { - p_remote_guid = &r->guids[i]; - break; - } - } - - return p_remote_guid; -} - -static struct osm_remote_node * -switch_find_sys_guid_count(IN const osm_switch_t * p_sw, - IN struct osm_remote_guids_count *r, - IN uint8_t port_num) -{ - return switch_find_guid_common(p_sw, r, port_num, 1, 0); -} - -static struct osm_remote_node * -switch_find_node_guid_count(IN const osm_switch_t * p_sw, - IN struct osm_remote_guids_count *r, - IN uint8_t port_num) -{ - return switch_find_guid_common(p_sw, r, port_num, 0, 1); -} - -uint8_t osm_switch_recommend_path(IN const osm_switch_t * p_sw, - IN osm_port_t * p_port, IN uint16_t lid_ho, - IN unsigned start_from, - IN boolean_t ignore_existing, - IN boolean_t dor) -{ - /* - We support an enhanced LMC aware routing mode: - In the case of LMC > 0, we can track the remote side - system and node for all of the lids of the target - and try and avoid routing again through the same - system / node. - - If this procedure is provided with the tracking array - and counter we can conduct this algorithm. - */ - boolean_t routing_for_lmc = (p_port->priv != NULL); - uint16_t base_lid; - uint8_t hops; - uint8_t least_hops; - uint8_t port_num; - uint8_t num_ports; - uint32_t least_paths = 0xFFFFFFFF; - unsigned i; - /* - The follwing will track the least paths if the - route should go through a new system/node - */ - uint32_t least_paths_other_sys = 0xFFFFFFFF; - uint32_t least_paths_other_nodes = 0xFFFFFFFF; - uint32_t least_forwarded_to = 0xFFFFFFFF; - uint32_t check_count; - uint8_t best_port = 0; - /* - These vars track the best port if it connects to - not used system/node. - */ - uint8_t best_port_other_sys = 0; - uint8_t best_port_other_node = 0; - boolean_t port_found = FALSE; - osm_physp_t *p_physp; - osm_physp_t *p_rem_physp; - osm_node_t *p_rem_node; - osm_node_t *p_rem_node_first = NULL; - struct osm_remote_node *p_remote_guid = NULL; - struct osm_remote_node null_remote_node = {NULL, 0, 0}; - - CL_ASSERT(lid_ho > 0); - - if (p_port->p_node->sw) { - if (p_port->p_node->sw == p_sw) - return 0; - base_lid = osm_port_get_base_lid(p_port); - } else { - p_physp = p_port->p_physp; - if (!p_physp || !p_physp->p_remote_physp || - !p_physp->p_remote_physp->p_node->sw) - return OSM_NO_PATH; - - if (p_physp->p_remote_physp->p_node->sw == p_sw) - return p_physp->p_remote_physp->port_num; - base_lid = - osm_node_get_base_lid(p_physp->p_remote_physp->p_node, 0); - } - base_lid = cl_ntoh16(base_lid); - - num_ports = p_sw->num_ports; - - least_hops = osm_switch_get_least_hops(p_sw, base_lid); - if (least_hops == OSM_NO_PATH) - return OSM_NO_PATH; - - /* - First, inquire with the forwarding table for an existing - route. If one is found, honor it unless: - 1. the ignore existing flag is set. - 2. the physical port is not a valid one or not healthy - 3. the physical port has a remote port (the link is up) - 4. the port has min-hops to the target (avoid loops) - */ - if (!ignore_existing) { - port_num = osm_switch_get_port_by_lid(p_sw, lid_ho); - - if (port_num != OSM_NO_PATH) { - CL_ASSERT(port_num < num_ports); - - p_physp = - osm_node_get_physp_ptr(p_sw->p_node, port_num); - /* - Don't be too trusting of the current forwarding table! - Verify that the port number is legal and that the - LID is reachable through this port. - */ - if (p_physp && osm_physp_is_healthy(p_physp) && - osm_physp_get_remote(p_physp)) { - hops = - osm_switch_get_hop_count(p_sw, base_lid, - port_num); - /* - If we aren't using pre-defined user routes - function, then we need to make sure that the - current path is the minimum one. In case of - having such a user function - this check will - not be done, and the old routing will be used. - Note: This means that it is the user's job to - clean all data in the forwarding tables that - he wants to be overridden by the minimum - hop function. - */ - if (hops == least_hops) - return port_num; - } - } - } - - /* - This algorithm selects a port based on a static load balanced - selection across equal hop-count ports. - There is lots of room for improved sophistication here, - possibly guided by user configuration info. - */ - - /* - OpenSM routing is "local" - not considering a full lid to lid - path. As such we can not guarantee a path will not loop if we - do not always follow least hops. - So we must abort if not least hops. - */ - - /* port number starts with one and num_ports is 1 + num phys ports */ - for (i = start_from; i < start_from + num_ports; i++) { - port_num = osm_switch_get_dimn_port(p_sw, i % num_ports); - if (!port_num || - osm_switch_get_hop_count(p_sw, base_lid, port_num) != - least_hops) - continue; - - /* let us make sure it is not down or unhealthy */ - p_physp = osm_node_get_physp_ptr(p_sw->p_node, port_num); - if (!p_physp || !osm_physp_is_healthy(p_physp) || - /* - we require all - non sma ports to be linked - to be routed through - */ - !osm_physp_get_remote(p_physp)) - continue; - - /* - We located a least-hop port, possibly one of many. - For this port, check the running total count of - the number of paths through this port. Select - the port routing the least number of paths. - */ - check_count = - osm_port_prof_path_count_get(&p_sw->p_prof[port_num]); - - if (dor) { - /* Get the Remote Node */ - p_rem_physp = osm_physp_get_remote(p_physp); - p_rem_node = osm_physp_get_node_ptr(p_rem_physp); - /* use the first dimension, but spread traffic - * out among the group of ports representing - * that dimension */ - if (!p_rem_node_first) - p_rem_node_first = p_rem_node; - else if (p_rem_node != p_rem_node_first) - continue; - if (routing_for_lmc) { - struct osm_remote_guids_count *r = p_port->priv; - uint8_t rem_port = osm_physp_get_port_num(p_rem_physp); - unsigned int j; - - for (j = 0; j < r->count; j++) { - p_remote_guid = &r->guids[j]; - if ((p_remote_guid->node == p_rem_node) - && (p_remote_guid->port == rem_port)) - break; - } - if (j == r->count) - p_remote_guid = &null_remote_node; - } - /* - Advanced LMC routing requires tracking of the - best port by the node connected to the other side of - it. - */ - } else if (routing_for_lmc) { - /* Is the sys guid already used ? */ - p_remote_guid = switch_find_sys_guid_count(p_sw, - p_port->priv, - port_num); - - /* If not update the least hops for this case */ - if (!p_remote_guid) { - if (check_count < least_paths_other_sys) { - least_paths_other_sys = check_count; - best_port_other_sys = port_num; - least_forwarded_to = 0; - } - } else { /* same sys found - try node */ - /* Else is the node guid already used ? */ - p_remote_guid = switch_find_node_guid_count(p_sw, - p_port->priv, - port_num); - - /* If not update the least hops for this case */ - if (!p_remote_guid - && check_count < least_paths_other_nodes) { - least_paths_other_nodes = check_count; - best_port_other_node = port_num; - least_forwarded_to = 0; - } - /* else prior sys and node guid already used */ - - } /* same sys found */ - } - - /* routing for LMC mode */ - /* - the count is min but also lower then the max subscribed - */ - if (check_count < least_paths) { - port_found = TRUE; - best_port = port_num; - least_paths = check_count; - if (routing_for_lmc - && p_remote_guid - && p_remote_guid->forwarded_to < least_forwarded_to) - least_forwarded_to = p_remote_guid->forwarded_to; - } else if (routing_for_lmc - && p_remote_guid - && check_count == least_paths - && p_remote_guid->forwarded_to < least_forwarded_to) { - least_forwarded_to = p_remote_guid->forwarded_to; - best_port = port_num; - } - } - - if (port_found == FALSE) - return OSM_NO_PATH; - - /* - if we are in enhanced routing mode and the best port is not - the local port 0 - */ - if (routing_for_lmc && best_port) { - /* Select the least hop port of the non used sys first */ - if (best_port_other_sys) - best_port = best_port_other_sys; - else if (best_port_other_node) - best_port = best_port_other_node; - } - - return best_port; -} - -void osm_switch_clear_hops(IN osm_switch_t * p_sw) -{ - unsigned i; - - for (i = 0; i < p_sw->num_hops; i++) - if (p_sw->hops[i]) - memset(p_sw->hops[i], OSM_NO_PATH, p_sw->num_ports); -} - -static int alloc_lft(IN osm_switch_t * p_sw, uint16_t lids) -{ - uint16_t lft_size; - - /* Ensure LFT is in units of LFT block size */ - lft_size = (lids / IB_SMP_DATA_SIZE + 1) * IB_SMP_DATA_SIZE; - if (lft_size > p_sw->lft_size) { - uint8_t *new_lft = realloc(p_sw->lft, lft_size); - if (!new_lft) - return -1; - memset(new_lft + p_sw->lft_size, OSM_NO_PATH, - lft_size - p_sw->lft_size); - p_sw->lft = new_lft; - p_sw->lft_size = lft_size; - } - - return 0; -} - -int osm_switch_prepare_path_rebuild(IN osm_switch_t * p_sw, IN uint16_t max_lids) -{ - uint8_t **hops; - unsigned i; - - if (alloc_lft(p_sw, max_lids)) - return -1; - - for (i = 0; i < p_sw->num_ports; i++) - osm_port_prof_construct(&p_sw->p_prof[i]); - - osm_switch_clear_hops(p_sw); - - if (!(p_sw->new_lft = realloc(p_sw->new_lft, p_sw->lft_size))) - return -1; - - memset(p_sw->new_lft, OSM_NO_PATH, p_sw->lft_size); - - if (!p_sw->hops) { - hops = malloc((max_lids + 1) * sizeof(hops[0])); - if (!hops) - return -1; - memset(hops, 0, (max_lids + 1) * sizeof(hops[0])); - p_sw->hops = hops; - p_sw->num_hops = max_lids + 1; - } else if (max_lids + 1 > p_sw->num_hops) { - hops = realloc(p_sw->hops, (max_lids + 1) * sizeof(hops[0])); - if (!hops) - return -1; - memset(hops + p_sw->num_hops, 0, - (max_lids + 1 - p_sw->num_hops) * sizeof(hops[0])); - p_sw->hops = hops; - p_sw->num_hops = max_lids + 1; - } - p_sw->max_lid_ho = max_lids; - - return 0; -} - -uint8_t osm_switch_get_port_least_hops(IN const osm_switch_t * p_sw, - IN const osm_port_t * p_port) -{ - uint16_t lid; - - if (p_port->p_node->sw) { - if (p_port->p_node->sw == p_sw) - return 0; - lid = osm_node_get_base_lid(p_port->p_node, 0); - return osm_switch_get_least_hops(p_sw, cl_ntoh16(lid)); - } else { - osm_physp_t *p = p_port->p_physp; - uint8_t hops; - - if (!p || !p->p_remote_physp || !p->p_remote_physp->p_node->sw) - return OSM_NO_PATH; - if (p->p_remote_physp->p_node->sw == p_sw) - return 1; - lid = osm_node_get_base_lid(p->p_remote_physp->p_node, 0); - hops = osm_switch_get_least_hops(p_sw, cl_ntoh16(lid)); - return hops != OSM_NO_PATH ? hops + 1 : OSM_NO_PATH; - } -} - -uint8_t osm_switch_recommend_mcast_path(IN osm_switch_t * p_sw, - IN osm_port_t * p_port, - IN uint16_t mlid_ho, - IN boolean_t ignore_existing) -{ - uint16_t base_lid; - uint8_t hops; - uint8_t port_num; - uint8_t num_ports; - uint8_t least_hops; - - CL_ASSERT(mlid_ho >= IB_LID_MCAST_START_HO); - - if (p_port->p_node->sw) { - if (p_port->p_node->sw == p_sw) - return 0; - base_lid = osm_port_get_base_lid(p_port); - } else { - osm_physp_t *p_physp = p_port->p_physp; - if (!p_physp || !p_physp->p_remote_physp || - !p_physp->p_remote_physp->p_node->sw) - return OSM_NO_PATH; - if (p_physp->p_remote_physp->p_node->sw == p_sw) - return p_physp->p_remote_physp->port_num; - base_lid = - osm_node_get_base_lid(p_physp->p_remote_physp->p_node, 0); - } - base_lid = cl_ntoh16(base_lid); - num_ports = p_sw->num_ports; - - /* - If the user wants us to ignore existing multicast routes, - then simply return the shortest hop count path to the - target port. - - Otherwise, return the first port that has a path to the target, - picking from the ports that are already in the multicast group. - */ - if (!ignore_existing) { - for (port_num = 1; port_num < num_ports; port_num++) { - if (!osm_mcast_tbl_is_port - (&p_sw->mcast_tbl, mlid_ho, port_num)) - continue; - /* - Don't be too trusting of the current forwarding table! - Verify that the LID is reachable through this port. - */ - hops = - osm_switch_get_hop_count(p_sw, base_lid, port_num); - if (hops != OSM_NO_PATH) - return port_num; - } - } - - /* - Either no existing mcast paths reach this port or we are - ignoring existing paths. - - Determine the best multicast path to the target. Note that this - algorithm is slightly different from the one used for unicast route - recommendation. In this case (multicast), we must NOT - perform any sort of load balancing. We MUST take the FIRST - port found that has <= the lowest hop count path. This prevents - more than one multicast path to the same remote switch which - prevents a multicast loop. Multicast loops are bad since the same - multicast packet will go around and around, inevitably creating - a black hole that will destroy the Earth in a firey conflagration. - */ - least_hops = osm_switch_get_least_hops(p_sw, base_lid); - for (port_num = 1; port_num < num_ports; port_num++) - if (osm_switch_get_hop_count(p_sw, base_lid, port_num) == - least_hops) - break; - - CL_ASSERT(port_num < num_ports); - return port_num; -} diff --git a/branches/opensm_3/user/opensm/osm_trap_rcv.c b/branches/opensm_3/user/opensm/osm_trap_rcv.c deleted file mode 100644 index 3a78e37a..00000000 --- a/branches/opensm_3/user/opensm/osm_trap_rcv.c +++ /dev/null @@ -1,622 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_trap_rcv_t. - * This object represents the Trap Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern void osm_req_get_node_desc(IN osm_sm_t * sm, osm_physp_t *p_physp); - -/********************************************************************** - * - * TRAP HANDLING: - * - * Assuming traps can be caused by bad hardware we should provide - * a mechanism for filtering their propagation into the actual logic - * of OpenSM such that it is not overloaded by them. - * - * We will provide a trap filtering mechanism with "Aging" capability. - * This mechanism will track incoming traps, clasify them by their - * source and content and provide back their age. - * - * A timer running in the background will toggle a timer counter - * that should be referenced by the aging algorithm. - * To provide an efficient handling of aging, we also track all traps - * in a sorted list by their aging. - * - * The generic Aging Tracker mechanism is implemented in the - * cl_aging_tracker object. - * - **********************************************************************/ - -static osm_physp_t *get_physp_by_lid_and_num(IN osm_sm_t * sm, - IN ib_net16_t lid, IN uint8_t num) -{ - osm_port_t *p_port = osm_get_port_by_lid(sm->p_subn, lid); - if (!p_port) - return NULL; - - if (osm_node_get_num_physp(p_port->p_node) < num) - return NULL; - - return osm_node_get_physp_ptr(p_port->p_node, num); -} - -static uint64_t aging_tracker_callback(IN uint64_t key, IN uint32_t num_regs, - IN void *context) -{ - osm_sm_t *sm = context; - ib_net16_t lid; - uint8_t port_num; - osm_physp_t *p_physp; - - OSM_LOG_ENTER(sm->p_log); - - if (osm_exit_flag) - /* We got an exit flag - do nothing */ - return 0; - - lid = (ib_net16_t) ((key & 0x0000FFFF00000000ULL) >> 32); - port_num = (uint8_t) ((key & 0x00FF000000000000ULL) >> 48); - - p_physp = get_physp_by_lid_and_num(sm, lid, port_num); - if (!p_physp) - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Cannot find port num:%u with lid:%u\n", - port_num, cl_ntoh16(lid)); - /* make sure the physp is still valid */ - /* If the health port was false - set it to true */ - else if (!osm_physp_is_healthy(p_physp)) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Clearing health bit of port num:%u with lid:%u\n", - port_num, cl_ntoh16(lid)); - - /* Clear its health bit */ - osm_physp_set_health(p_physp, TRUE); - } - - OSM_LOG_EXIT(sm->p_log); - - /* We want to remove the event from the tracker - so - need to return zero. */ - return 0; -} - -/********************************************************************** - * CRC calculation for notice identification - **********************************************************************/ - -#define CRC32_POLYNOMIAL 0xEDB88320L - -/* calculate the crc for a given buffer */ -static uint32_t trap_calc_crc32(void *buffer, uint32_t count) -{ - uint32_t temp1, temp2; - uint32_t crc = -1L; - unsigned char *p = (unsigned char *)buffer; - /* precalculated table for faster crc calculation */ - static uint32_t crc_table[256]; - static boolean_t first = TRUE; - int i, j; - - /* if we need to initialize the lookup table */ - if (first) { - /* calc the CRC table */ - for (i = 0; i <= 255; i++) { - crc = i; - for (j = 8; j > 0; j--) - if (crc & 1) - crc = (crc >> 1) ^ CRC32_POLYNOMIAL; - else - crc >>= 1; - crc_table[i] = crc; - } - first = FALSE; - } - - crc = -1L; - /* do the calculation */ - while (count-- != 0) { - temp1 = (crc >> 8) & 0x00FFFFFFL; - temp2 = crc_table[((int)crc ^ *p++) & 0xFF]; - crc = temp1 ^ temp2; - } - return crc; -} - -/* The key is created in the following manner: - port_num lid crc - \______/ \___/ \___/ - 16b 16b 32b -*/ -static uint64_t trap_get_key(IN uint16_t lid, IN uint8_t port_num, - IN ib_mad_notice_attr_t * p_ntci) -{ - uint32_t crc = trap_calc_crc32(p_ntci, sizeof(ib_mad_notice_attr_t)); - return ((uint64_t) port_num << 48) | ((uint64_t) lid << 32) | crc; -} - -static int print_num_received(IN uint32_t num_received) -{ - uint32_t i; - - /* Series is 10, 20, 50, 100, 200, 500, ... */ - i = num_received; - while (i >= 10) { - if (i % 10) - break; - i = i / 10; - } - - if (i == 1 || i == 2 || i == 5) - return 1; - else - return 0; -} - -static int disable_port(osm_sm_t *sm, osm_physp_t *p) -{ - uint8_t payload[IB_SMP_DATA_SIZE]; - osm_madw_context_t context; - ib_port_info_t *pi = (ib_port_info_t *)payload; - - /* select the nearest port to master opensm */ - if (p->p_remote_physp && - p->dr_path.hop_count > p->p_remote_physp->dr_path.hop_count) - p = p->p_remote_physp; - - /* If trap 131, might want to disable peer port if available */ - /* but peer port has been observed not to respond to SM requests */ - - memcpy(payload, &p->port_info, sizeof(ib_port_info_t)); - - /* Set port to disabled/down */ - ib_port_info_set_port_state(pi, IB_LINK_DOWN); - ib_port_info_set_port_phys_state(IB_PORT_PHYS_STATE_DISABLED, pi); - - /* Issue set of PortInfo */ - context.pi_context.node_guid = osm_node_get_node_guid(p->p_node); - context.pi_context.port_guid = osm_physp_get_port_guid(p); - context.pi_context.set_method = TRUE; - context.pi_context.light_sweep = FALSE; - context.pi_context.active_transition = FALSE; - - return osm_req_set(sm, osm_physp_get_dr_path_ptr(p), - payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO, - cl_hton32(osm_physp_get_port_num(p)), - CL_DISP_MSGID_NONE, &context); -} - -static void log_trap_info(osm_log_t *p_log, ib_mad_notice_attr_t *p_ntci, - ib_net16_t source_lid, ib_net64_t trans_id) -{ - if (!osm_log_is_active(p_log, OSM_LOG_ERROR)) - return; - - if (ib_notice_is_generic(p_ntci)) { - char str[32]; - - if ((p_ntci->g_or_v.generic.trap_num == CL_HTON16(129)) || - (p_ntci->g_or_v.generic.trap_num == CL_HTON16(130)) || - (p_ntci->g_or_v.generic.trap_num == CL_HTON16(131))) - snprintf(str, sizeof(str), " Port %u", - p_ntci->data_details.ntc_129_131.port_num); - else - str[0] = '\0'; - - OSM_LOG(p_log, OSM_LOG_ERROR, - "Received Generic Notice type:%u " - "num:%u (%s) Producer:%u (%s) " - "from LID:%u%s TID:0x%016" PRIx64 "\n", - ib_notice_get_type(p_ntci), - cl_ntoh16(p_ntci->g_or_v.generic.trap_num), - ib_get_trap_str(p_ntci->g_or_v.generic.trap_num), - cl_ntoh32(ib_notice_get_prod_type(p_ntci)), - ib_get_producer_type_str(ib_notice_get_prod_type(p_ntci)), - cl_hton16(source_lid), str, cl_ntoh64(trans_id)); - } else - OSM_LOG(p_log, OSM_LOG_ERROR, - "Received Vendor Notice type:%u vend:0x%06X " - "dev:%u from LID:%u TID:0x%016" PRIx64 "\n", - ib_notice_get_type(p_ntci), - cl_ntoh32(ib_notice_get_vend_id(p_ntci)), - cl_ntoh16(p_ntci->g_or_v.vend.dev_id), - cl_ntoh16(source_lid), cl_ntoh64(trans_id)); -} - -static int shutup_noisy_port(osm_sm_t *sm, ib_net16_t lid, uint8_t port, - unsigned num) -{ - osm_physp_t *p = get_physp_by_lid_and_num(sm, lid, port); - if (!p) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3805: " - "Failed to find physical port by lid:%u num:%u\n", - cl_ntoh16(lid), port); - return -1; - } - - /* When babbling port policy option is enabled and - Threshold for disabling a "babbling" port is exceeded */ - if (sm->p_subn->opt.babbling_port_policy && num >= 250) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Disabling noisy physical port 0x%016" PRIx64 - ": lid %u, num %u\n", - cl_ntoh64(osm_physp_get_port_guid(p)), - cl_ntoh16(lid), port); - if (disable_port(sm, p)) - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3811: " - "Failed to disable.\n"); - else - return 1; - } - - /* check if the current state of the p_physp is healthy. If - it is - then this is a first change of state. Run a heavy sweep. */ - if (osm_physp_is_healthy(p)) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Marking unhealthy physical port by lid:%u num:%u\n", - cl_ntoh16(lid), port); - osm_physp_set_health(p, FALSE); - return 2; - } - return 0; -} - -static void trap_rcv_process_request(IN osm_sm_t * sm, - IN const osm_madw_t * p_madw) -{ - uint8_t payload[sizeof(ib_mad_notice_attr_t)]; - ib_smp_t *p_smp; - ib_mad_notice_attr_t *p_ntci = (ib_mad_notice_attr_t *) payload; - ib_api_status_t status; - osm_madw_t tmp_madw; /* we need a copy to last after repress */ - uint64_t trap_key; - uint32_t num_received; - osm_physp_t *p_physp; - osm_port_t *p_port; - ib_net16_t source_lid = 0; - boolean_t is_gsi = TRUE; - uint8_t port_num = 0; - boolean_t physp_change_trap = FALSE; - uint64_t event_wheel_timeout = OSM_DEFAULT_TRAP_SUPRESSION_TIMEOUT; - boolean_t run_heavy_sweep = FALSE; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - if (osm_exit_flag) - /* - We got an exit flag - do nothing - Otherwise we start a sweep on the trap 144 caused by - cleaning up SM Cap bit... - */ - goto Exit; - - /* update the is_gsi flag according to the mgmt_class field */ - if (p_madw->p_mad->mgmt_class == IB_MCLASS_SUBN_LID || - p_madw->p_mad->mgmt_class == IB_MCLASS_SUBN_DIR) - is_gsi = FALSE; - - /* No real need to grab the lock for this function. */ - memset(payload, 0, sizeof(payload)); - memset(&tmp_madw, 0, sizeof(tmp_madw)); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - if (p_smp->method != IB_MAD_METHOD_TRAP) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3801: " - "Unsupported method 0x%X\n", p_smp->method); - goto Exit; - } - - /* - * The NOTICE Attribute is part of the SMP CLASS attributes - * As such the actual attribute data resides inside the SMP - * payload. - */ - - memcpy(payload, &p_smp->data, IB_SMP_DATA_SIZE); - memcpy(&tmp_madw, p_madw, sizeof(tmp_madw)); - - if (is_gsi == FALSE) { - /* We are in smi flow */ - /* - * When we receive a TRAP with dlid = 0 - it means it - * came from our own node. So we need to fix it. - */ - - if (p_madw->mad_addr.addr_type.smi.source_lid == 0) { - /* Check if the sm_base_lid is 0. If yes - this means - that the local lid wasn't configured yet. Don't send - a response to the trap. */ - if (sm->p_subn->sm_base_lid == 0) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Received SLID=0 Trap with local LID=0. Ignoring MAD\n"); - goto Exit; - } - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Received SLID=0 Trap. Using local LID:%u instead\n", - cl_ntoh16(sm->p_subn->sm_base_lid)); - tmp_madw.mad_addr.addr_type.smi.source_lid = - sm->p_subn->sm_base_lid; - } - - source_lid = tmp_madw.mad_addr.addr_type.smi.source_lid; - - /* Print some info about the incoming Trap */ - log_trap_info(sm->p_log, p_ntci, source_lid, p_smp->trans_id); - } - - osm_dump_notice(sm->p_log, p_ntci, OSM_LOG_VERBOSE); - - p_physp = osm_get_physp_by_mad_addr(sm->p_log, sm->p_subn, - &tmp_madw.mad_addr); - if (p_physp) - p_smp->m_key = p_physp->port_info.m_key; - else - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3809: " - "Failed to find source physical port for trap\n"); - - status = osm_resp_send(sm, &tmp_madw, 0, payload); - if (status != IB_SUCCESS) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3802: " - "Error sending response (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * We would like to filter out recurring Traps so we track them by - * their source lid and content. If the same trap was already - * received within the aging time window more than 10 times, - * we simply ignore it. This is done only if we are in smi mode - */ - - if (is_gsi == FALSE) { - if (ib_notice_is_generic(p_ntci) && - (p_ntci->g_or_v.generic.trap_num == CL_HTON16(129) || - p_ntci->g_or_v.generic.trap_num == CL_HTON16(130) || - p_ntci->g_or_v.generic.trap_num == CL_HTON16(131))) { - /* If this is a trap 129, 130, or 131 - then this is a - * trap signaling a change on a physical port. - * Mark the physp_change_trap flag as TRUE. - */ - physp_change_trap = TRUE; - /* The source_lid should be based on the source_lid from the trap */ - source_lid = p_ntci->data_details.ntc_129_131.lid; - port_num = p_ntci->data_details.ntc_129_131.port_num; - } - - /* try to find it in the aging tracker */ - trap_key = trap_get_key(source_lid, port_num, p_ntci); - num_received = cl_event_wheel_num_regs(&sm->trap_aging_tracker, - trap_key); - - /* Now we know how many times it provided this trap */ - if (num_received > 10) { - if (print_num_received(num_received)) - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Received trap %u times consecutively\n", - num_received); - /* - * If the trap provides info about a bad port - * we mark it as unhealthy. - */ - if (physp_change_trap == TRUE) { - int ret = shutup_noisy_port(sm, source_lid, - port_num, - num_received); - if (ret == 1) /* port disabled */ - goto Exit; - else if (ret == 2) /* unhealthy - run sweep */ - run_heavy_sweep = TRUE; - /* in any case increase timeout interval */ - event_wheel_timeout = - OSM_DEFAULT_UNHEALTHY_TIMEOUT; - } - } - - /* restart the aging anyway */ - /* If physp_change_trap is TRUE - then use a callback to unset - the healthy bit. If not - no need to use a callback. */ - if (physp_change_trap == TRUE) - cl_event_wheel_reg(&sm->trap_aging_tracker, trap_key, - cl_get_time_stamp() + event_wheel_timeout, - aging_tracker_callback, sm); - else - cl_event_wheel_reg(&sm->trap_aging_tracker, trap_key, - cl_get_time_stamp() + event_wheel_timeout, - NULL, NULL); - - /* If was already registered do nothing more */ - if (num_received > 10 && run_heavy_sweep == FALSE) { - if (print_num_received(num_received)) - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Ignoring noisy traps.\n"); - goto Exit; - } - } - - /* Check for node description update. IB Spec v1.2.1 pg 823 */ - if (!ib_notice_is_generic(p_ntci)) - goto check_sweep; - if (cl_ntoh16(p_ntci->g_or_v.generic.trap_num) == 144 && - p_ntci->data_details.ntc_144.local_changes & TRAP_144_MASK_OTHER_LOCAL_CHANGES && - p_ntci->data_details.ntc_144.change_flgs & TRAP_144_MASK_NODE_DESCRIPTION_CHANGE) { - OSM_LOG(sm->p_log, OSM_LOG_INFO, "Trap 144 Node description update\n"); - - if (p_physp) { - CL_PLOCK_ACQUIRE(sm->p_lock); - osm_req_get_node_desc(sm, p_physp); - CL_PLOCK_RELEASE(sm->p_lock); - } else - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "ERR 3812: No physical port found for " - "trap 144: \"node description update\"\n"); - goto check_sweep; - } else if (cl_ntoh16(p_ntci->g_or_v.generic.trap_num) == 145) - /* this assumes that trap 145 content is not broken? */ - p_physp->p_node->node_info.sys_guid = - p_ntci->data_details.ntc_145.new_sys_guid; - -check_sweep: - /* do a sweep if we received a trap */ - if (sm->p_subn->opt.sweep_on_trap) { - /* if this is trap number 128 or run_heavy_sweep is TRUE - - update the force_heavy_sweep flag of the subnet. - Sweep also on traps 144 - these traps signal a change of - certain port capabilities. - TODO: In the future this can be changed to just getting - PortInfo on this port instead of sweeping the entire subnet. */ - if (ib_notice_is_generic(p_ntci) && - (cl_ntoh16(p_ntci->g_or_v.generic.trap_num) == 128 || - cl_ntoh16(p_ntci->g_or_v.generic.trap_num) == 144 || - run_heavy_sweep)) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Forcing heavy sweep. Received trap:%u\n", - cl_ntoh16(p_ntci->g_or_v.generic.trap_num)); - - sm->p_subn->force_heavy_sweep = TRUE; - } - osm_sm_signal(sm, OSM_SIGNAL_SWEEP); - } - - /* If we reached here due to trap 129/130/131 - do not need to do - the notice report. Just goto exit. We know this is the case - if physp_change_trap is TRUE. */ - if (physp_change_trap == TRUE) - goto Exit; - - /* Add a call to osm_report_notice */ - /* We are going to report the notice - so need to fix the IssuerGID - accordingly. See IBA 1.2 p.739 or IBA 1.1 p.653 for details. */ - if (is_gsi) { - if (!tmp_madw.mad_addr.addr_type.gsi.global_route) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3806: " - "Received gsi trap with global_route FALSE. " - "Cannot update issuer_gid!\n"); - goto Exit; - } - memcpy(&p_ntci->issuer_gid, - &tmp_madw.mad_addr.addr_type.gsi.grh_info.src_gid, - sizeof(ib_gid_t)); - } else { - /* Need to use the IssuerLID */ - p_port = osm_get_port_by_lid(sm->p_subn, source_lid); - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Cannot find port corresponding to lid:%u\n", - cl_ntoh16(source_lid)); - - goto Exit; - } - - p_ntci->issuer_gid.unicast.prefix = - sm->p_subn->opt.subnet_prefix; - p_ntci->issuer_gid.unicast.interface_id = p_port->guid; - } - - /* we need a lock here as the InformInfo DB must be stable */ - CL_PLOCK_ACQUIRE(sm->p_lock); - status = osm_report_notice(sm->p_log, sm->p_subn, p_ntci); - CL_PLOCK_RELEASE(sm->p_lock); - if (status != IB_SUCCESS) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3803: " - "Error sending trap reports (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(sm->p_log); -} - -static void trap_rcv_process_response(IN osm_sm_t * sm, - IN const osm_madw_t * p_madw) -{ - - OSM_LOG_ENTER(sm->p_log); - - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3808: " - "This function is not supported yet\n"); - - OSM_LOG_EXIT(sm->p_log); -} - -void osm_trap_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_smp_t *p_smp; - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - /* - Determine if this is a request for our own Trap - or if this is a response to our request for another - SM's Trap. - */ - if (ib_smp_is_response(p_smp)) - trap_rcv_process_response(sm, p_madw); - else - trap_rcv_process_request(sm, p_madw); - - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_ucast_cache.c b/branches/opensm_3/user/opensm/osm_ucast_cache.c deleted file mode 100644 index c84e0660..00000000 --- a/branches/opensm_3/user/opensm/osm_ucast_cache.c +++ /dev/null @@ -1,1028 +0,0 @@ -/* - * Copyright (c) 2008-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2008-2009 Mellanox Technologies LTD. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of OpenSM Cached Unicast Routing - * - * Environment: - * Linux User Mode - * - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct cache_port { - boolean_t is_leaf; - uint16_t remote_lid_ho; -} cache_port_t; - -typedef struct cache_switch { - cl_map_item_t map_item; - boolean_t dropped; - uint16_t max_lid_ho; - uint16_t num_hops; - uint8_t **hops; - uint8_t *lft; - uint8_t num_ports; - cache_port_t ports[0]; -} cache_switch_t; - -static uint16_t cache_sw_get_base_lid_ho(cache_switch_t * p_sw) -{ - return p_sw->ports[0].remote_lid_ho; -} - -static boolean_t cache_sw_is_leaf(cache_switch_t * p_sw) -{ - return p_sw->ports[0].is_leaf; -} - -static void cache_sw_set_leaf(cache_switch_t * p_sw) -{ - p_sw->ports[0].is_leaf = TRUE; -} - -static cache_switch_t *cache_sw_new(uint16_t lid_ho, unsigned num_ports) -{ - cache_switch_t *p_cache_sw = malloc(sizeof(cache_switch_t) + - num_ports * sizeof(cache_port_t)); - if (!p_cache_sw) - return NULL; - - memset(p_cache_sw, 0, - sizeof(*p_cache_sw) + num_ports * sizeof(cache_port_t)); - - p_cache_sw->num_ports = num_ports; - - /* port[0] fields represent this switch details - lid and type */ - p_cache_sw->ports[0].remote_lid_ho = lid_ho; - p_cache_sw->ports[0].is_leaf = FALSE; - - return p_cache_sw; -} - -static void cache_sw_destroy(cache_switch_t * p_sw) -{ - if (!p_sw) - return; - - if (p_sw->lft) - free(p_sw->lft); - if (p_sw->hops) - free(p_sw->hops); - free(p_sw); -} - -static cache_switch_t *cache_get_sw(osm_ucast_mgr_t * p_mgr, uint16_t lid_ho) -{ - cache_switch_t *p_cache_sw = (cache_switch_t *) - cl_qmap_get(&p_mgr->cache_sw_tbl, lid_ho); - if (p_cache_sw == (cache_switch_t *) - cl_qmap_end(&p_mgr->cache_sw_tbl)) - p_cache_sw = NULL; - - return p_cache_sw; -} - -static void cache_add_sw_link(osm_ucast_mgr_t * p_mgr, osm_physp_t *p, - uint16_t remote_lid_ho, boolean_t is_ca) -{ - cache_switch_t *p_cache_sw; - uint16_t lid_ho = cl_ntoh16(osm_node_get_base_lid(p->p_node, 0)); - - OSM_LOG_ENTER(p_mgr->p_log); - - if (!lid_ho || !remote_lid_ho || !p->port_num) - goto Exit; - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Caching switch port: lid %u [port %u] -> lid %u (%s)\n", - lid_ho, p->port_num, remote_lid_ho, (is_ca) ? "CA/RTR" : "SW"); - - p_cache_sw = cache_get_sw(p_mgr, lid_ho); - if (!p_cache_sw) { - p_cache_sw = cache_sw_new(lid_ho, p->p_node->sw->num_ports); - if (!p_cache_sw) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, - "ERR AD01: Out of memory - cache is invalid\n"); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - cl_qmap_insert(&p_mgr->cache_sw_tbl, lid_ho, - &p_cache_sw->map_item); - } - - if (p->port_num >= p_cache_sw->num_ports) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, - "ERR AD02: Wrong switch? - cache is invalid\n"); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - if (is_ca) - cache_sw_set_leaf(p_cache_sw); - - if (p_cache_sw->ports[p->port_num].remote_lid_ho == 0) { - /* cache this link only if it hasn't been already cached */ - p_cache_sw->ports[p->port_num].remote_lid_ho = remote_lid_ho; - p_cache_sw->ports[p->port_num].is_leaf = is_ca; - } -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} - -static void cache_cleanup_switches(osm_ucast_mgr_t * p_mgr) -{ - cache_switch_t *p_sw; - cache_switch_t *p_next_sw; - unsigned port_num; - boolean_t found_port; - - if (!p_mgr->cache_valid) - return; - - p_next_sw = (cache_switch_t *) cl_qmap_head(&p_mgr->cache_sw_tbl); - while (p_next_sw != - (cache_switch_t *) cl_qmap_end(&p_mgr->cache_sw_tbl)) { - p_sw = p_next_sw; - p_next_sw = (cache_switch_t *) cl_qmap_next(&p_sw->map_item); - - found_port = FALSE; - for (port_num = 1; port_num < p_sw->num_ports; port_num++) - if (p_sw->ports[port_num].remote_lid_ho) - found_port = TRUE; - - if (!found_port) { - cl_qmap_remove_item(&p_mgr->cache_sw_tbl, - &p_sw->map_item); - cache_sw_destroy(p_sw); - } - } -} - -static void -cache_check_link_change(osm_ucast_mgr_t * p_mgr, - osm_physp_t * p_physp_1, osm_physp_t * p_physp_2) -{ - OSM_LOG_ENTER(p_mgr->p_log); - CL_ASSERT(p_physp_1 && p_physp_2); - - if (!p_mgr->cache_valid) - goto Exit; - - if (!p_physp_1->p_remote_physp && !p_physp_2->p_remote_physp) - /* both ports were down - new link */ - goto Exit; - - /* unicast cache cannot tolerate any link location change */ - - if ((p_physp_1->p_remote_physp && - p_physp_1->p_remote_physp->p_remote_physp) || - (p_physp_2->p_remote_physp && - p_physp_2->p_remote_physp->p_remote_physp)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Link location change discovered\n"); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} - -static void cache_remove_port(osm_ucast_mgr_t * p_mgr, uint16_t lid_ho, - uint8_t port_num, uint16_t remote_lid_ho, - boolean_t is_ca) -{ - cache_switch_t *p_cache_sw; - - OSM_LOG_ENTER(p_mgr->p_log); - - if (!p_mgr->cache_valid) - goto Exit; - - p_cache_sw = cache_get_sw(p_mgr, lid_ho); - if (!p_cache_sw) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Found uncached switch/link (lid %u, port %u)\n", - lid_ho, port_num); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - if (port_num >= p_cache_sw->num_ports || - !p_cache_sw->ports[port_num].remote_lid_ho) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Found uncached switch link (lid %u, port %u)\n", - lid_ho, port_num); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - if (p_cache_sw->ports[port_num].remote_lid_ho != remote_lid_ho) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Remote lid change on switch lid %u, port %u " - "(was %u, now %u)\n", lid_ho, port_num, - p_cache_sw->ports[port_num].remote_lid_ho, - remote_lid_ho); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - if ((p_cache_sw->ports[port_num].is_leaf && !is_ca) || - (!p_cache_sw->ports[port_num].is_leaf && is_ca)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Remote node type change on switch lid %u, port %u\n", - lid_ho, port_num); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "New link from lid %u, port %u to lid %u - " - "found in cache\n", lid_ho, port_num, remote_lid_ho); - - /* the new link was cached - clean it from the cache */ - - p_cache_sw->ports[port_num].remote_lid_ho = 0; - p_cache_sw->ports[port_num].is_leaf = FALSE; -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} /* cache_remove_port() */ - -static void -cache_restore_ucast_info(osm_ucast_mgr_t * p_mgr, - cache_switch_t * p_cache_sw, osm_switch_t * p_sw) -{ - if (!p_mgr->cache_valid) - return; - - /* when seting unicast info, the cached port - should have all the required info */ - CL_ASSERT(p_cache_sw->max_lid_ho && p_cache_sw->lft && - p_cache_sw->num_hops && p_cache_sw->hops); - - p_sw->max_lid_ho = p_cache_sw->max_lid_ho; - - if (p_sw->new_lft) - free(p_sw->new_lft); - p_sw->new_lft = p_cache_sw->lft; - p_cache_sw->lft = NULL; - - p_sw->num_hops = p_cache_sw->num_hops; - p_cache_sw->num_hops = 0; - if (p_sw->hops) - free(p_sw->hops); - p_sw->hops = p_cache_sw->hops; - p_cache_sw->hops = NULL; -} - -static void ucast_cache_dump(osm_ucast_mgr_t * p_mgr) -{ - cache_switch_t *p_sw; - unsigned i; - - OSM_LOG_ENTER(p_mgr->p_log); - - if (!osm_log_is_active(p_mgr->p_log, OSM_LOG_DEBUG)) - goto Exit; - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Dumping missing nodes/links as logged by unicast cache:\n"); - for (p_sw = (cache_switch_t *) cl_qmap_head(&p_mgr->cache_sw_tbl); - p_sw != (cache_switch_t *) cl_qmap_end(&p_mgr->cache_sw_tbl); - p_sw = (cache_switch_t *) cl_qmap_next(&p_sw->map_item)) { - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "\t Switch lid %u %s%s\n", - cache_sw_get_base_lid_ho(p_sw), - (cache_sw_is_leaf(p_sw)) ? "[leaf switch] " : "", - (p_sw->dropped) ? "[whole switch missing]" : ""); - - for (i = 1; i < p_sw->num_ports; i++) - if (p_sw->ports[i].remote_lid_ho > 0) - OSM_LOG(p_mgr->p_log, - OSM_LOG_DEBUG, - "\t - port %u -> lid %u %s\n", - i, p_sw->ports[i].remote_lid_ho, - (p_sw->ports[i].is_leaf) ? - "[remote node is leaf]" : ""); - } -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} - -void osm_ucast_cache_invalidate(osm_ucast_mgr_t * p_mgr) -{ - cache_switch_t *p_sw; - cache_switch_t *p_next_sw; - - OSM_LOG_ENTER(p_mgr->p_log); - - if (!p_mgr->cache_valid) - goto Exit; - - p_mgr->cache_valid = FALSE; - - p_next_sw = (cache_switch_t *) cl_qmap_head(&p_mgr->cache_sw_tbl); - while (p_next_sw != - (cache_switch_t *) cl_qmap_end(&p_mgr->cache_sw_tbl)) { - p_sw = p_next_sw; - p_next_sw = (cache_switch_t *) cl_qmap_next(&p_sw->map_item); - cache_sw_destroy(p_sw); - } - cl_qmap_remove_all(&p_mgr->cache_sw_tbl); - - OSM_LOG(p_mgr->p_log, OSM_LOG_VERBOSE, "Unicast Cache invalidated\n"); -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} - -static void ucast_cache_validate(osm_ucast_mgr_t * p_mgr) -{ - cache_switch_t *p_cache_sw; - cache_switch_t *p_remote_cache_sw; - unsigned port_num; - unsigned max_ports; - uint8_t remote_node_type; - uint16_t lid_ho; - uint16_t remote_lid_ho; - osm_switch_t *p_sw; - osm_switch_t *p_remote_sw; - osm_node_t *p_node; - osm_physp_t *p_physp; - osm_physp_t *p_remote_physp; - osm_port_t *p_remote_port; - cl_qmap_t *p_sw_tbl; - - OSM_LOG_ENTER(p_mgr->p_log); - if (!p_mgr->cache_valid) - goto Exit; - - /* If there are no switches in the subnet, we are done */ - p_sw_tbl = &p_mgr->p_subn->sw_guid_tbl; - if (cl_qmap_count(p_sw_tbl) == 0) { - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - /* - * Scan all the physical switch ports in the subnet. - * If the port need_update flag is on, check whether - * it's just some node/port reset or a cached topology - * change. Otherwise the cache is invalid. - */ - for (p_sw = (osm_switch_t *) cl_qmap_head(p_sw_tbl); - p_sw != (osm_switch_t *) cl_qmap_end(p_sw_tbl); - p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item)) { - - p_node = p_sw->p_node; - - lid_ho = cl_ntoh16(osm_node_get_base_lid(p_node, 0)); - p_cache_sw = cache_get_sw(p_mgr, lid_ho); - - max_ports = osm_node_get_num_physp(p_node); - - /* skip port 0 */ - for (port_num = 1; port_num < max_ports; port_num++) { - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - - if (!p_physp || !p_physp->p_remote_physp || - !osm_physp_link_exists(p_physp, - p_physp->p_remote_physp)) - /* no valid link */ - continue; - - /* - * While scanning all the physical ports in the subnet, - * mark corresponding leaf switches in the cache. - */ - if (p_cache_sw && - !p_cache_sw->dropped && - !cache_sw_is_leaf(p_cache_sw) && - p_physp->p_remote_physp->p_node && - osm_node_get_type(p_physp->p_remote_physp-> - p_node) != IB_NODE_TYPE_SWITCH) - cache_sw_set_leaf(p_cache_sw); - - if (!p_physp->need_update) - continue; - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Checking switch lid %u, port %u\n", - lid_ho, port_num); - - p_remote_physp = osm_physp_get_remote(p_physp); - remote_node_type = - osm_node_get_type(p_remote_physp->p_node); - - if (remote_node_type == IB_NODE_TYPE_SWITCH) - remote_lid_ho = - cl_ntoh16(osm_node_get_base_lid - (p_remote_physp->p_node, 0)); - else - remote_lid_ho = - cl_ntoh16(osm_node_get_base_lid - (p_remote_physp->p_node, - osm_physp_get_port_num - (p_remote_physp))); - - if (!p_cache_sw || - port_num >= p_cache_sw->num_ports || - !p_cache_sw->ports[port_num].remote_lid_ho) { - /* - * There is some uncached change on the port. - * In general, the reasons might be as follows: - * - switch reset - * - port reset (or port down/up) - * - quick connection location change - * - new link (or new switch) - * - * First two reasons allow cache usage, while - * the last two reasons should invalidate cache. - * - * In case of quick connection location change, - * cache would have been invalidated by - * osm_ucast_cache_check_new_link() function. - * - * In case of new link between two known nodes, - * cache also would have been invalidated by - * osm_ucast_cache_check_new_link() function. - * - * Another reason is cached link between two - * known switches went back. In this case the - * osm_ucast_cache_check_new_link() function would - * clear both sides of the link from the cache - * during the discovery process, so effectively - * this would be equivalent to port reset. - * - * So three possible reasons remain: - * - switch reset - * - port reset (or port down/up) - * - link of a new switch - * - * To validate cache, we need to check only the - * third reason - link of a new node/switch: - * - If this is the local switch that is new, - * then it should have (p_sw->need_update == 2). - * - If the remote node is switch and it's new, - * then it also should have - * (p_sw->need_update == 2). - * - If the remote node is CA/RTR and it's new, - * then its port should have is_new flag on. - */ - if (p_sw->need_update == 2) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "New switch found (lid %u)\n", - lid_ho); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - if (remote_node_type == IB_NODE_TYPE_SWITCH) { - - p_remote_sw = - p_remote_physp->p_node->sw; - if (p_remote_sw->need_update == 2) { - /* this could also be case of - switch coming back with an - additional link that it - didn't have before */ - OSM_LOG(p_mgr->p_log, - OSM_LOG_DEBUG, - "New switch/link found (lid %u)\n", - remote_lid_ho); - osm_ucast_cache_invalidate - (p_mgr); - goto Exit; - } - } else { - /* - * Remote node is CA/RTR. - * Get p_port of the remote node and - * check its p_port->is_new flag. - */ - p_remote_port = - osm_get_port_by_guid(p_mgr->p_subn, - osm_physp_get_port_guid - (p_remote_physp)); - if (p_remote_port->is_new) { - OSM_LOG(p_mgr->p_log, - OSM_LOG_DEBUG, - "New CA/RTR found (lid %u)\n", - remote_lid_ho); - osm_ucast_cache_invalidate - (p_mgr); - goto Exit; - } - } - } else { - /* - * The change on the port is cached. - * In general, the reasons might be as follows: - * - link between two known nodes went back - * - one or more nodes went back, causing all - * the links to reappear - * - * If it was link that went back, then this case - * would have been taken care of during the - * discovery by osm_ucast_cache_check_new_link(), - * so it's some node that went back. - */ - if ((p_cache_sw->ports[port_num].is_leaf && - remote_node_type == IB_NODE_TYPE_SWITCH) || - (!p_cache_sw->ports[port_num].is_leaf && - remote_node_type != IB_NODE_TYPE_SWITCH)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Remote node type change on switch lid %u, port %u\n", - lid_ho, port_num); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - if (p_cache_sw->ports[port_num].remote_lid_ho != - remote_lid_ho) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Remote lid change on switch lid %u, port %u" - "(was %u, now %u)\n", - lid_ho, port_num, - p_cache_sw->ports[port_num]. - remote_lid_ho, remote_lid_ho); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - /* - * We don't care who is the node that has - * reappeared in the subnet (local or remote). - * What's important that the cached link matches - * the real fabrics link. - * Just clean it from cache. - */ - - p_cache_sw->ports[port_num].remote_lid_ho = 0; - p_cache_sw->ports[port_num].is_leaf = FALSE; - if (p_cache_sw->dropped) { - cache_restore_ucast_info(p_mgr, - p_cache_sw, - p_sw); - p_cache_sw->dropped = FALSE; - } - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Restored link from cache: lid %u, port %u to lid %u\n", - lid_ho, port_num, remote_lid_ho); - } - } - } - - /* Remove all the cached switches that - have all their ports restored */ - cache_cleanup_switches(p_mgr); - - /* - * Done scanning all the physical switch ports in the subnet. - * Now we need to check the other side: - * Scan all the cached switches and their ports: - * - If the cached switch is missing in the subnet - * (dropped flag is on), check that it's a leaf switch. - * If it's not a leaf, the cache is invalid, because - * cache can tolerate only leaf switch removal. - * - If the cached switch exists in fabric, check all - * its cached ports. These cached ports represent - * missing link in the fabric. - * The missing links that can be tolerated are: - * + link to missing CA/RTR - * + link to missing leaf switch - */ - for (p_cache_sw = (cache_switch_t *) cl_qmap_head(&p_mgr->cache_sw_tbl); - p_cache_sw != (cache_switch_t *) cl_qmap_end(&p_mgr->cache_sw_tbl); - p_cache_sw = - (cache_switch_t *) cl_qmap_next(&p_cache_sw->map_item)) { - - if (p_cache_sw->dropped) { - if (!cache_sw_is_leaf(p_cache_sw)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Missing non-leaf switch (lid %u)\n", - cache_sw_get_base_lid_ho(p_cache_sw)); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Missing leaf switch (lid %u) - " - "continuing validation\n", - cache_sw_get_base_lid_ho(p_cache_sw)); - continue; - } - - for (port_num = 1; port_num < p_cache_sw->num_ports; port_num++) { - if (!p_cache_sw->ports[port_num].remote_lid_ho) - continue; - - if (p_cache_sw->ports[port_num].is_leaf) { - CL_ASSERT(cache_sw_is_leaf(p_cache_sw)); - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Switch lid %u, port %u: missing link to CA/RTR - " - "continuing validation\n", - cache_sw_get_base_lid_ho(p_cache_sw), - port_num); - continue; - } - - p_remote_cache_sw = cache_get_sw(p_mgr, - p_cache_sw-> - ports[port_num]. - remote_lid_ho); - - if (!p_remote_cache_sw || !p_remote_cache_sw->dropped) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Switch lid %u, port %u: missing link to existing switch\n", - cache_sw_get_base_lid_ho(p_cache_sw), - port_num); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - if (!cache_sw_is_leaf(p_remote_cache_sw)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Switch lid %u, port %u: missing link to non-leaf switch\n", - cache_sw_get_base_lid_ho(p_cache_sw), - port_num); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - /* - * At this point we know that the missing link is to - * a leaf switch. However, one case deserves a special - * treatment. If there was a link between two leaf - * switches, then missing leaf switch might break - * routing. It is possible that there are routes - * that use leaf switches to get from switch to switch - * and not just to get to the CAs behind the leaf switch. - */ - if (cache_sw_is_leaf(p_cache_sw) && - cache_sw_is_leaf(p_remote_cache_sw)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Switch lid %u, port %u: missing leaf-2-leaf link\n", - cache_sw_get_base_lid_ho(p_cache_sw), - port_num); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Switch lid %u, port %u: missing remote leaf switch - " - "continuing validation\n", - cache_sw_get_base_lid_ho(p_cache_sw), - port_num); - } - } - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, "Unicast cache is valid\n"); - ucast_cache_dump(p_mgr); -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} /* osm_ucast_cache_validate() */ - -void osm_ucast_cache_check_new_link(osm_ucast_mgr_t * p_mgr, - osm_node_t * p_node_1, uint8_t port_num_1, - osm_node_t * p_node_2, uint8_t port_num_2) -{ - uint16_t lid_ho_1; - uint16_t lid_ho_2; - - OSM_LOG_ENTER(p_mgr->p_log); - - if (!p_mgr->cache_valid) - goto Exit; - - cache_check_link_change(p_mgr, - osm_node_get_physp_ptr(p_node_1, port_num_1), - osm_node_get_physp_ptr(p_node_2, port_num_2)); - - if (!p_mgr->cache_valid) - goto Exit; - - if (osm_node_get_type(p_node_1) != IB_NODE_TYPE_SWITCH && - osm_node_get_type(p_node_2) != IB_NODE_TYPE_SWITCH) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, "Found CA-2-CA link\n"); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - /* for code simplicity, we want the first node to be switch */ - if (osm_node_get_type(p_node_1) != IB_NODE_TYPE_SWITCH) { - osm_node_t *tmp_node = p_node_1; - uint8_t tmp_port_num = port_num_1; - p_node_1 = p_node_2; - port_num_1 = port_num_2; - p_node_2 = tmp_node; - port_num_2 = tmp_port_num; - } - - lid_ho_1 = cl_ntoh16(osm_node_get_base_lid(p_node_1, 0)); - - if (osm_node_get_type(p_node_2) == IB_NODE_TYPE_SWITCH) - lid_ho_2 = cl_ntoh16(osm_node_get_base_lid(p_node_2, 0)); - else - lid_ho_2 = - cl_ntoh16(osm_node_get_base_lid(p_node_2, port_num_2)); - - if (!lid_ho_1 || !lid_ho_2) { - /* - * No lid assigned, which means that one of the nodes is new. - * Need to wait for lid manager to process this node. - * The switches and their links will be checked later when - * the whole cache validity will be verified. - */ - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Link port %u <-> %u reveals new node - cache will " - "be validated later\n", port_num_1, port_num_2); - goto Exit; - } - - cache_remove_port(p_mgr, lid_ho_1, port_num_1, lid_ho_2, - (osm_node_get_type(p_node_2) != - IB_NODE_TYPE_SWITCH)); - - /* if node_2 is a switch, the link should be cleaned from its cache */ - - if (osm_node_get_type(p_node_2) == IB_NODE_TYPE_SWITCH) - cache_remove_port(p_mgr, lid_ho_2, - port_num_2, lid_ho_1, FALSE); - -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} /* osm_ucast_cache_check_new_link() */ - -void osm_ucast_cache_add_link(osm_ucast_mgr_t * p_mgr, - osm_physp_t * p_physp1, osm_physp_t * p_physp2) -{ - osm_node_t *p_node_1 = p_physp1->p_node, *p_node_2 = p_physp2->p_node; - uint16_t lid_ho_1, lid_ho_2; - - OSM_LOG_ENTER(p_mgr->p_log); - - if (!p_mgr->cache_valid) - goto Exit; - - if (osm_node_get_type(p_node_1) != IB_NODE_TYPE_SWITCH && - osm_node_get_type(p_node_2) != IB_NODE_TYPE_SWITCH) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, "Dropping CA-2-CA link\n"); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - if ((osm_node_get_type(p_node_1) == IB_NODE_TYPE_SWITCH && - !osm_node_get_physp_ptr(p_node_1, 0)) || - (osm_node_get_type(p_node_2) == IB_NODE_TYPE_SWITCH && - !osm_node_get_physp_ptr(p_node_2, 0))) { - /* we're caching a link when one of the nodes - has already been dropped and cached */ - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Port %u <-> port %u: port0 on one of the nodes " - "has already been dropped and cached\n", - p_physp1->port_num, p_physp2->port_num); - goto Exit; - } - - /* One of the nodes is switch. Just for code - simplicity, make sure that it's the first node. */ - - if (osm_node_get_type(p_node_1) != IB_NODE_TYPE_SWITCH) { - osm_physp_t *tmp = p_physp1; - p_physp1 = p_physp2; - p_physp2 = tmp; - p_node_1 = p_physp1->p_node; - p_node_2 = p_physp2->p_node; - } - - if (!p_node_1->sw) { - /* something is wrong - we'd better not use cache */ - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - lid_ho_1 = cl_ntoh16(osm_node_get_base_lid(p_node_1, 0)); - - if (osm_node_get_type(p_node_2) == IB_NODE_TYPE_SWITCH) { - - if (!p_node_2->sw) { - /* something is wrong - we'd better not use cache */ - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - lid_ho_2 = cl_ntoh16(osm_node_get_base_lid(p_node_2, 0)); - - /* lost switch-2-switch link - cache both sides */ - cache_add_sw_link(p_mgr, p_physp1, lid_ho_2, FALSE); - cache_add_sw_link(p_mgr, p_physp2, lid_ho_1, FALSE); - } else { - lid_ho_2 = cl_ntoh16(osm_physp_get_base_lid(p_physp2)); - - /* lost link to CA/RTR - cache only switch side */ - cache_add_sw_link(p_mgr, p_physp1, lid_ho_2, TRUE); - } - -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} /* osm_ucast_cache_add_link() */ - -void osm_ucast_cache_add_node(osm_ucast_mgr_t * p_mgr, osm_node_t * p_node) -{ - uint16_t lid_ho; - uint8_t max_ports; - uint8_t port_num; - osm_physp_t *p_physp; - cache_switch_t *p_cache_sw; - - OSM_LOG_ENTER(p_mgr->p_log); - - if (!p_mgr->cache_valid) - goto Exit; - - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH) { - - lid_ho = cl_ntoh16(osm_node_get_base_lid(p_node, 0)); - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Caching dropped switch lid %u\n", lid_ho); - - if (!p_node->sw) { - /* something is wrong - forget about cache */ - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, - "ERR AD03: no switch info for node lid %u - " - "clearing cache\n", lid_ho); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - /* unlink (add to cache) all the ports of this switch */ - max_ports = osm_node_get_num_physp(p_node); - for (port_num = 1; port_num < max_ports; port_num++) { - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_physp || !p_physp->p_remote_physp) - continue; - - osm_ucast_cache_add_link(p_mgr, p_physp, - p_physp->p_remote_physp); - } - - /* - * All the ports have been dropped (cached). - * If one of the ports was connected to CA/RTR, - * then the cached switch would be marked as leaf. - * If it isn't, then the dropped switch isn't a leaf, - * and cache can't handle it. - */ - - p_cache_sw = cache_get_sw(p_mgr, lid_ho); - CL_ASSERT(p_cache_sw); - - if (!cache_sw_is_leaf(p_cache_sw)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Dropped non-leaf switch (lid %u)\n", lid_ho); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - p_cache_sw->dropped = TRUE; - - if (!p_node->sw->num_hops || !p_node->sw->hops) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "No LID matrices for switch lid %u\n", lid_ho); - osm_ucast_cache_invalidate(p_mgr); - goto Exit; - } - - /* lid matrices */ - - p_cache_sw->num_hops = p_node->sw->num_hops; - p_node->sw->num_hops = 0; - p_cache_sw->hops = p_node->sw->hops; - p_node->sw->hops = NULL; - - /* linear forwarding table */ - - if (p_node->sw->new_lft) { - /* LFT buffer exists - we use it, because - it is more updated than the switch's LFT */ - p_cache_sw->lft = p_node->sw->new_lft; - p_node->sw->new_lft = NULL; - } else { - /* no LFT buffer, so we use the switch's LFT */ - p_cache_sw->lft = p_node->sw->lft; - p_node->sw->lft = NULL; - } - p_cache_sw->max_lid_ho = p_node->sw->max_lid_ho; - } else { - /* dropping CA/RTR: add to cache all the ports of this node */ - max_ports = osm_node_get_num_physp(p_node); - for (port_num = 1; port_num < max_ports; port_num++) { - - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_physp || !p_physp->p_remote_physp) - continue; - - CL_ASSERT(osm_node_get_type - (p_physp->p_remote_physp->p_node) == - IB_NODE_TYPE_SWITCH); - - osm_ucast_cache_add_link(p_mgr, - p_physp->p_remote_physp, - p_physp); - } - } -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} /* osm_ucast_cache_add_node() */ - -int osm_ucast_cache_process(osm_ucast_mgr_t * p_mgr) -{ - cl_qmap_t *tbl = &p_mgr->p_subn->sw_guid_tbl; - cl_map_item_t *item; - osm_switch_t *p_sw; - - if (!p_mgr->p_subn->opt.use_ucast_cache) - return 1; - - ucast_cache_validate(p_mgr); - if (!p_mgr->cache_valid) - return 1; - - OSM_LOG(p_mgr->p_log, OSM_LOG_INFO, - "Configuring switch tables using cached routing\n"); - - for (item = cl_qmap_head(tbl); item != cl_qmap_end(tbl); - item = cl_qmap_next(item)) { - p_sw = (osm_switch_t *) item; - - if (p_sw->need_update && !p_sw->new_lft) { - /* no new routing was recently calculated for this - switch, but the LFT needs to be updated anyway */ - p_sw->new_lft = p_sw->lft; - p_sw->lft = malloc(p_sw->lft_size); - if (!p_sw->lft) - return IB_INSUFFICIENT_MEMORY; - memset(p_sw->lft, OSM_NO_PATH, p_sw->lft_size); - } - - } - - osm_ucast_mgr_set_fwd_tables(p_mgr); - - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_ucast_file.c b/branches/opensm_3/user/opensm/osm_ucast_file.c deleted file mode 100644 index f1cd5973..00000000 --- a/branches/opensm_3/user/opensm/osm_ucast_file.c +++ /dev/null @@ -1,389 +0,0 @@ -/* - * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2006,2008-2009 Mellanox Technologies LTD. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of OpenSM unicast routing module which loads - * routes from the dump file - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -static uint16_t remap_lid(osm_opensm_t * p_osm, uint16_t lid, ib_net64_t guid) -{ - osm_port_t *p_port; - uint16_t min_lid, max_lid; - uint8_t lmc; - - p_port = osm_get_port_by_guid(&p_osm->subn, guid); - if (!p_port) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "cannot find port guid 0x%016" PRIx64 - " , will use the same lid\n", cl_ntoh64(guid)); - return lid; - } - - osm_port_get_lid_range_ho(p_port, &min_lid, &max_lid); - if (min_lid <= lid && lid <= max_lid) - return lid; - - lmc = osm_port_get_lmc(p_port); - return min_lid + (lid & ((1 << lmc) - 1)); -} - -static void add_path(osm_opensm_t * p_osm, - osm_switch_t * p_sw, uint16_t lid, uint8_t port_num, - ib_net64_t port_guid) -{ - uint16_t new_lid; - uint8_t old_port; - - new_lid = port_guid ? remap_lid(p_osm, lid, port_guid) : lid; - old_port = osm_switch_get_port_by_lid(p_sw, new_lid); - if (old_port != OSM_NO_PATH && old_port != port_num) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "LID collision is detected on switch " - "0x016%" PRIx64 ", will overwrite LID %u entry\n", - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node)), - new_lid); - } - - p_sw->new_lft[new_lid] = port_num; - if (!(p_osm->subn.opt.port_profile_switch_nodes && port_guid && - osm_get_switch_by_guid(&p_osm->subn, port_guid))) - osm_switch_count_path(p_sw, port_num); - - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, - "route 0x%04x(was 0x%04x) %u 0x%016" PRIx64 - " is added to switch 0x%016" PRIx64 "\n", - new_lid, lid, port_num, cl_ntoh64(port_guid), - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node))); -} - -static void add_lid_hops(osm_opensm_t * p_osm, osm_switch_t * p_sw, - uint16_t lid, ib_net64_t guid, - uint8_t hops[], unsigned len) -{ - uint16_t new_lid; - uint8_t i; - - new_lid = guid ? remap_lid(p_osm, lid, guid) : lid; - if (len > p_sw->num_ports) - len = p_sw->num_ports; - - for (i = 0; i < len; i++) - osm_switch_set_hops(p_sw, lid, i, hops[i]); -} - -static int do_ucast_file_load(void *context) -{ - char line[1024]; - char *file_name; - FILE *file; - ib_net64_t sw_guid, port_guid; - osm_opensm_t *p_osm = context; - osm_switch_t *p_sw; - uint16_t lid; - uint8_t port_num; - unsigned lineno; - - file_name = p_osm->subn.opt.lfts_file; - if (!file_name) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "LFTs file name is not given; " - "using default routing algorithm\n"); - return 1; - } - - file = fopen(file_name, "r"); - if (!file) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR | OSM_LOG_SYS, "ERR 6302: " - "cannot open ucast dump file \'%s\': %m\n", file_name); - return -1; - } - - lineno = 0; - p_sw = NULL; - - while (fgets(line, sizeof(line) - 1, file) != NULL) { - char *p, *q; - lineno++; - - p = line; - while (isspace(*p)) - p++; - - if (*p == '#') - continue; - - if (!strncmp(p, "Multicast mlids", 15)) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR | OSM_LOG_SYS, - "ERR 6303: " - "Multicast dump file detected; " - "skipping parsing. Using default " - "routing algorithm\n"); - } else if (!strncmp(p, "Unicast lids", 12)) { - q = strstr(p, " guid 0x"); - if (!q) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "PARSE ERROR: %s:%u: " - "cannot parse switch definition\n", - file_name, lineno); - return -1; - } - p = q + 8; - sw_guid = strtoull(p, &q, 16); - if (q == p || !isspace(*q)) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "PARSE ERROR: %s:%u: " - "cannot parse switch guid: \'%s\'\n", - file_name, lineno, p); - return -1; - } - sw_guid = cl_hton64(sw_guid); - - p_sw = osm_get_switch_by_guid(&p_osm->subn, sw_guid); - if (!p_sw) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "cannot find switch %016" PRIx64 "\n", - cl_ntoh64(sw_guid)); - continue; - } - memset(p_sw->new_lft, OSM_NO_PATH, p_sw->lft_size); - } else if (p_sw && !strncmp(p, "0x", 2)) { - p += 2; - lid = (uint16_t) strtoul(p, &q, 16); - if (q == p || !isspace(*q)) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "PARSE ERROR: %s:%u: " - "cannot parse lid: \'%s\'\n", - file_name, lineno, p); - return -1; - } - p = q; - while (isspace(*p)) - p++; - port_num = (uint8_t) strtoul(p, &q, 10); - if (q == p || !isspace(*q)) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "PARSE ERROR: %s:%u: " - "cannot parse port: \'%s\'\n", - file_name, lineno, p); - return -1; - } - p = q; - /* additionally try to extract guid */ - q = strstr(p, " portguid 0x"); - if (!q) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "PARSE WARNING: %s:%u: " - "cannot find port guid " - "(maybe broken dump): \'%s\'\n", - file_name, lineno, p); - port_guid = 0; - } else { - p = q + 12; - port_guid = strtoull(p, &q, 16); - if (q == p || (!isspace(*q) && *q != ':')) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "PARSE WARNING: %s:%u: " - "cannot parse port guid " - "(maybe broken dump): \'%s\'\n", - file_name, lineno, p); - port_guid = 0; - } - } - port_guid = cl_hton64(port_guid); - add_path(p_osm, p_sw, lid, port_num, port_guid); - } - } - - fclose(file); - return 0; -} - -static int do_lid_matrix_file_load(void *context) -{ - char line[1024]; - uint8_t hops[256]; - char *file_name; - FILE *file; - ib_net64_t guid; - osm_opensm_t *p_osm = context; - osm_switch_t *p_sw; - unsigned lineno; - uint16_t lid; - - file_name = p_osm->subn.opt.lid_matrix_dump_file; - if (!file_name) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "lid matrix file name is not given; " - "using default lid matrix generation algorithm\n"); - return 1; - } - - file = fopen(file_name, "r"); - if (!file) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR | OSM_LOG_SYS, "ERR 6305: " - "cannot open lid matrix file \'%s\': %m\n", file_name); - return -1; - } - - lineno = 0; - p_sw = NULL; - - while (fgets(line, sizeof(line) - 1, file) != NULL) { - char *p, *q; - lineno++; - - p = line; - while (isspace(*p)) - p++; - - if (*p == '#') - continue; - - if (!strncmp(p, "Switch", 6)) { - q = strstr(p, " guid 0x"); - if (!q) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "PARSE ERROR: %s:%u: " - "cannot parse switch definition\n", - file_name, lineno); - return -1; - } - p = q + 8; - guid = strtoull(p, &q, 16); - if (q == p || !isspace(*q)) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "PARSE ERROR: %s:%u: " - "cannot parse switch guid: \'%s\'\n", - file_name, lineno, p); - return -1; - } - guid = cl_hton64(guid); - - p_sw = osm_get_switch_by_guid(&p_osm->subn, guid); - if (!p_sw) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "cannot find switch %016" PRIx64 "\n", - cl_ntoh64(guid)); - continue; - } - } else if (p_sw && !strncmp(p, "0x", 2)) { - unsigned long num; - unsigned len = 0; - - memset(hops, 0xff, sizeof(hops)); - - p += 2; - num = strtoul(p, &q, 16); - if (num > 0xffff || q == p || - (*q != ':' && !isspace(*q))) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "PARSE ERROR: %s:%u: " - "cannot parse lid: \'%s\'\n", - file_name, lineno, p); - return -1; - } - /* Just checked the range, so casting is safe */ - lid = (uint16_t) num; - p = q; - while (isspace(*p) || *p == ':') - p++; - while (len < 256 && *p && *p != '#') { - num = strtoul(p, &q, 16); - if (num > 0xff || q == p) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, - "PARSE ERROR: %s:%u: " - "cannot parse hops number: \'%s\'\n", - file_name, lineno, p); - return -1; - } - /* Just checked the range, so casting is safe */ - hops[len++] = (uint8_t) num; - p = q; - while (isspace(*p)) - p++; - } - /* additionally try to extract guid */ - q = strstr(p, " portguid 0x"); - if (!q) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "PARSE WARNING: %s:%u: " - "cannot find port guid " - "(maybe broken dump): \'%s\'\n", - file_name, lineno, p); - guid = 0; - } else { - p = q + 12; - guid = strtoull(p, &q, 16); - if (q == p || !isspace(*q)) { - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "PARSE WARNING: %s:%u: " - "cannot parse port guid " - "(maybe broken dump): \'%s\'\n", - file_name, lineno, p); - guid = 0; - } - } - guid = cl_hton64(guid); - add_lid_hops(p_osm, p_sw, lid, guid, hops, len); - } - } - - fclose(file); - return 0; -} - -int osm_ucast_file_setup(struct osm_routing_engine *r, osm_opensm_t *osm) -{ - r->context = osm; - r->build_lid_matrices = do_lid_matrix_file_load; - r->ucast_build_fwd_tables = do_ucast_file_load; - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_ucast_ftree.c b/branches/opensm_3/user/opensm/osm_ucast_ftree.c deleted file mode 100644 index a66be414..00000000 --- a/branches/opensm_3/user/opensm/osm_ucast_ftree.c +++ /dev/null @@ -1,4112 +0,0 @@ -/* - * Copyright (c) 2009 Simula Research Laboratory. All rights reserved. - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of OpenSM FatTree routing - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * FatTree rank is bounded between 2 and 8: - * - Tree of rank 1 has only trivial routing paths, - * so no need to use FatTree routing. - * - Why maximum rank is 8: - * Each node (switch) is assigned a unique tuple. - * Switches are stored in two cl_qmaps - one is - * ordered by guid, and the other by a key that is - * generated from tuple. Since cl_qmap supports only - * a 64-bit key, the maximal tuple lenght is 8 bytes. - * which means that maximal tree rank is 8. - * Note that the above also implies that each switch - * can have at max 255 up/down ports. - */ - -#define FAT_TREE_MIN_RANK 2 -#define FAT_TREE_MAX_RANK 8 - -typedef enum { - FTREE_DIRECTION_DOWN = -1, - FTREE_DIRECTION_SAME, - FTREE_DIRECTION_UP -} ftree_direction_t; - -/*************************************************** - ** - ** Forward references - ** - ***************************************************/ -struct ftree_sw_t_; -struct ftree_hca_t_; -struct ftree_port_t_; -struct ftree_port_group_t_; -struct ftree_fabric_t_; - -/*************************************************** - ** - ** ftree_tuple_t definition - ** - ***************************************************/ - -#define FTREE_TUPLE_BUFF_LEN 1024 -#define FTREE_TUPLE_LEN 8 - -typedef uint8_t ftree_tuple_t[FTREE_TUPLE_LEN]; -typedef uint64_t ftree_tuple_key_t; - -/*************************************************** - ** - ** ftree_sw_table_element_t definition - ** - ***************************************************/ - -typedef struct { - cl_map_item_t map_item; - struct ftree_sw_t_ *p_sw; -} ftree_sw_tbl_element_t; - -/*************************************************** - ** - ** ftree_port_t definition - ** - ***************************************************/ - -typedef struct ftree_port_t_ { - cl_map_item_t map_item; - uint8_t port_num; /* port number on the current node */ - uint8_t remote_port_num; /* port number on the remote node */ - uint32_t counter_up; /* number of allocated routes upwards */ - uint32_t counter_down; /* number of allocated routes downwards */ -} ftree_port_t; - -/*************************************************** - ** - ** ftree_port_group_t definition - ** - ***************************************************/ - -typedef union ftree_hca_or_sw_ { - struct ftree_hca_t_ *p_hca; - struct ftree_sw_t_ *p_sw; -} ftree_hca_or_sw; - -typedef struct ftree_port_group_t_ { - cl_map_item_t map_item; - uint16_t base_lid; /* base lid of the current node */ - uint16_t remote_base_lid; /* base lid of the remote node */ - ib_net64_t port_guid; /* port guid of this port */ - ib_net64_t node_guid; /* this node's guid */ - uint8_t node_type; /* this node's type */ - ib_net64_t remote_port_guid; /* port guid of the remote port */ - ib_net64_t remote_node_guid; /* node guid of the remote node */ - uint8_t remote_node_type; /* IB_NODE_TYPE_{CA,SWITCH,ROUTER,...} */ - ftree_hca_or_sw hca_or_sw; /* pointer to this hca/switch */ - ftree_hca_or_sw remote_hca_or_sw; /* pointer to remote hca/switch */ - cl_ptr_vector_t ports; /* vector of ports to the same lid */ - boolean_t is_cn; /* whether this port is a compute node */ - boolean_t is_io; /* whether this port is an I/O node */ - uint32_t counter_down; /* number of allocated routes downwards */ - uint32_t counter_up; /* number of allocated routes upwards */ -} ftree_port_group_t; - -/*************************************************** - ** - ** ftree_sw_t definition - ** - ***************************************************/ - -typedef struct ftree_sw_t_ { - cl_map_item_t map_item; - osm_switch_t *p_osm_sw; - uint32_t rank; - ftree_tuple_t tuple; - uint16_t base_lid; - ftree_port_group_t **down_port_groups; - uint8_t down_port_groups_num; - ftree_port_group_t **sibling_port_groups; - uint8_t sibling_port_groups_num; - ftree_port_group_t **up_port_groups; - uint8_t up_port_groups_num; - boolean_t is_leaf; - unsigned down_port_groups_idx; - uint8_t *hops; - uint32_t min_counter_down; - boolean_t counter_up_changed; -} ftree_sw_t; - -/*************************************************** - ** - ** ftree_hca_t definition - ** - ***************************************************/ - -typedef struct ftree_hca_t_ { - cl_map_item_t map_item; - osm_node_t *p_osm_node; - ftree_port_group_t **up_port_groups; - uint16_t up_port_groups_num; - unsigned cn_num; -} ftree_hca_t; - -/*************************************************** - ** - ** ftree_fabric_t definition - ** - ***************************************************/ - -typedef struct ftree_fabric_t_ { - osm_opensm_t *p_osm; - cl_qmap_t hca_tbl; - cl_qmap_t sw_tbl; - cl_qmap_t sw_by_tuple_tbl; - cl_qmap_t cn_guid_tbl; - cl_qmap_t io_guid_tbl; - unsigned cn_num; - unsigned ca_ports; - uint8_t leaf_switch_rank; - uint8_t max_switch_rank; - ftree_sw_t **leaf_switches; - uint32_t leaf_switches_num; - uint16_t max_cn_per_leaf; - uint16_t lft_max_lid; - boolean_t fabric_built; -} ftree_fabric_t; - -/*************************************************** - ** - ** comparators - ** - ***************************************************/ - -static int OSM_CDECL compare_switches_by_index(IN const void *p1, IN const void *p2) -{ - ftree_sw_t **pp_sw1 = (ftree_sw_t **) p1; - ftree_sw_t **pp_sw2 = (ftree_sw_t **) p2; - - uint16_t i; - for (i = 0; i < FTREE_TUPLE_LEN; i++) { - if ((*pp_sw1)->tuple[i] > (*pp_sw2)->tuple[i]) - return 1; - if ((*pp_sw1)->tuple[i] < (*pp_sw2)->tuple[i]) - return -1; - } - return 0; -} - -/***************************************************/ - -static int OSM_CDECL -compare_port_groups_by_remote_switch_index(IN const void *p1, IN const void *p2) -{ - ftree_port_group_t **pp_g1 = (ftree_port_group_t **) p1; - ftree_port_group_t **pp_g2 = (ftree_port_group_t **) p2; - - return - compare_switches_by_index(&((*pp_g1)->remote_hca_or_sw.p_sw), - &((*pp_g2)->remote_hca_or_sw.p_sw)); -} - -/*************************************************** - ** - ** ftree_tuple_t functions - ** - ***************************************************/ - -static void tuple_init(IN ftree_tuple_t tuple) -{ - memset(tuple, 0xFF, FTREE_TUPLE_LEN); -} - -/***************************************************/ - -static inline boolean_t tuple_assigned(IN ftree_tuple_t tuple) -{ - return (tuple[0] != 0xFF); -} - -/***************************************************/ - -#define FTREE_TUPLE_BUFFERS_NUM 6 - -static char *tuple_to_str(IN ftree_tuple_t tuple) -{ - static char buffer[FTREE_TUPLE_BUFFERS_NUM][FTREE_TUPLE_BUFF_LEN]; - static uint8_t ind = 0; - char *ret_buffer; - uint32_t i; - - if (!tuple_assigned(tuple)) - return "INDEX.NOT.ASSIGNED"; - - buffer[ind][0] = '\0'; - - for (i = 0; (i < FTREE_TUPLE_LEN) && (tuple[i] != 0xFF); i++) { - if ((strlen(buffer[ind]) + 10) > FTREE_TUPLE_BUFF_LEN) - return "INDEX.TOO.LONG"; - if (i != 0) - strcat(buffer[ind], "."); - sprintf(&buffer[ind][strlen(buffer[ind])], "%u", tuple[i]); - } - - ret_buffer = buffer[ind]; - ind = (ind + 1) % FTREE_TUPLE_BUFFERS_NUM; - return ret_buffer; -} /* tuple_to_str() */ - -/***************************************************/ - -static inline ftree_tuple_key_t tuple_to_key(IN ftree_tuple_t tuple) -{ - ftree_tuple_key_t key; - memcpy(&key, tuple, FTREE_TUPLE_LEN); - return key; -} - -/***************************************************/ - -static inline void tuple_from_key(IN ftree_tuple_t tuple, - IN ftree_tuple_key_t key) -{ - memcpy(tuple, &key, FTREE_TUPLE_LEN); -} - -/*************************************************** - ** - ** ftree_sw_tbl_element_t functions - ** - ***************************************************/ - -static ftree_sw_tbl_element_t *sw_tbl_element_create(IN ftree_sw_t * p_sw) -{ - ftree_sw_tbl_element_t *p_element = - (ftree_sw_tbl_element_t *) malloc(sizeof(ftree_sw_tbl_element_t)); - if (!p_element) - return NULL; - memset(p_element, 0, sizeof(ftree_sw_tbl_element_t)); - - p_element->p_sw = p_sw; - return p_element; -} - -/***************************************************/ - -static void sw_tbl_element_destroy(IN ftree_sw_tbl_element_t * p_element) -{ - if (!p_element) - return; - free(p_element); -} - -/*************************************************** - ** - ** ftree_port_t functions - ** - ***************************************************/ - -static ftree_port_t *port_create(IN uint8_t port_num, - IN uint8_t remote_port_num) -{ - ftree_port_t *p_port = (ftree_port_t *) malloc(sizeof(ftree_port_t)); - if (!p_port) - return NULL; - memset(p_port, 0, sizeof(ftree_port_t)); - - p_port->port_num = port_num; - p_port->remote_port_num = remote_port_num; - - return p_port; -} - -/***************************************************/ - -static void port_destroy(IN ftree_port_t * p_port) -{ - if (p_port) - free(p_port); -} - -/*************************************************** - ** - ** ftree_port_group_t functions - ** - ***************************************************/ - -static ftree_port_group_t *port_group_create(IN uint16_t base_lid, - IN uint16_t remote_base_lid, - IN ib_net64_t port_guid, - IN ib_net64_t node_guid, - IN uint8_t node_type, - IN void *p_hca_or_sw, - IN ib_net64_t remote_port_guid, - IN ib_net64_t remote_node_guid, - IN uint8_t remote_node_type, - IN void *p_remote_hca_or_sw, - IN boolean_t is_cn, - IN boolean_t is_io) -{ - ftree_port_group_t *p_group = - (ftree_port_group_t *) malloc(sizeof(ftree_port_group_t)); - if (p_group == NULL) - return NULL; - memset(p_group, 0, sizeof(ftree_port_group_t)); - - p_group->base_lid = base_lid; - p_group->remote_base_lid = remote_base_lid; - memcpy(&p_group->port_guid, &port_guid, sizeof(ib_net64_t)); - memcpy(&p_group->node_guid, &node_guid, sizeof(ib_net64_t)); - memcpy(&p_group->remote_port_guid, &remote_port_guid, - sizeof(ib_net64_t)); - memcpy(&p_group->remote_node_guid, &remote_node_guid, - sizeof(ib_net64_t)); - - p_group->node_type = node_type; - switch (node_type) { - case IB_NODE_TYPE_CA: - p_group->hca_or_sw.p_hca = (ftree_hca_t *) p_hca_or_sw; - break; - case IB_NODE_TYPE_SWITCH: - p_group->hca_or_sw.p_sw = (ftree_sw_t *) p_hca_or_sw; - break; - default: - /* we shouldn't get here - port is created only in hca or switch */ - CL_ASSERT(0); - } - - p_group->remote_node_type = remote_node_type; - switch (remote_node_type) { - case IB_NODE_TYPE_CA: - p_group->remote_hca_or_sw.p_hca = - (ftree_hca_t *) p_remote_hca_or_sw; - break; - case IB_NODE_TYPE_SWITCH: - p_group->remote_hca_or_sw.p_sw = - (ftree_sw_t *) p_remote_hca_or_sw; - break; - default: - /* we shouldn't get here - port is created only in hca or switch */ - CL_ASSERT(0); - } - - cl_ptr_vector_init(&p_group->ports, 0, /* min size */ - 8); /* grow size */ - p_group->is_cn = is_cn; - p_group->is_io = is_io; - return p_group; -} /* port_group_create() */ - -/***************************************************/ - -static void port_group_destroy(IN ftree_port_group_t * p_group) -{ - uint32_t i; - uint32_t size; - ftree_port_t *p_port; - - if (!p_group) - return; - - /* remove all the elements of p_group->ports vector */ - size = cl_ptr_vector_get_size(&p_group->ports); - for (i = 0; i < size; i++) { - cl_ptr_vector_at(&p_group->ports, i, (void *)&p_port); - port_destroy(p_port); - } - cl_ptr_vector_destroy(&p_group->ports); - free(p_group); -} /* port_group_destroy() */ - -/***************************************************/ - -static void port_group_dump(IN ftree_fabric_t * p_ftree, - IN ftree_port_group_t * p_group, - IN ftree_direction_t direction) -{ - ftree_port_t *p_port; - uint32_t size; - uint32_t i; - char buff[10 * 1024]; - - if (!p_group) - return; - - if (!osm_log_is_active(&p_ftree->p_osm->log, OSM_LOG_DEBUG)) - return; - - size = cl_ptr_vector_get_size(&p_group->ports); - buff[0] = '\0'; - - for (i = 0; i < size; i++) { - cl_ptr_vector_at(&p_group->ports, i, (void *)&p_port); - CL_ASSERT(p_port); - - if (i != 0) - strcat(buff, ", "); - sprintf(buff + strlen(buff), "%u", p_port->port_num); - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - " Port Group of size %u, port(s): %s, direction: %s\n" - " Local <--> Remote GUID (LID):" - "0x%016" PRIx64 " (0x%04x) <--> 0x%016" PRIx64 " (0x%04x)\n", - size, buff, - (direction == FTREE_DIRECTION_DOWN) ? "DOWN" : (direction == - FTREE_DIRECTION_SAME) - ? "SIBLING" : "UP", cl_ntoh64(p_group->port_guid), - p_group->base_lid, cl_ntoh64(p_group->remote_port_guid), - p_group->remote_base_lid); - -} /* port_group_dump() */ - -/***************************************************/ - -static void port_group_add_port(IN ftree_port_group_t * p_group, - IN uint8_t port_num, IN uint8_t remote_port_num) -{ - uint16_t i; - ftree_port_t *p_port; - - for (i = 0; i < cl_ptr_vector_get_size(&p_group->ports); i++) { - cl_ptr_vector_at(&p_group->ports, i, (void *)&p_port); - if (p_port->port_num == port_num) - return; - } - - p_port = port_create(port_num, remote_port_num); - cl_ptr_vector_insert(&p_group->ports, p_port, NULL); -} - -/*************************************************** - ** - ** ftree_sw_t functions - ** - ***************************************************/ - -static ftree_sw_t *sw_create(IN ftree_fabric_t * p_ftree, - IN osm_switch_t * p_osm_sw) -{ - ftree_sw_t *p_sw; - uint8_t ports_num; - - /* make sure that the switch has ports */ - if (p_osm_sw->num_ports == 1) - return NULL; - - p_sw = (ftree_sw_t *) malloc(sizeof(ftree_sw_t)); - if (p_sw == NULL) - return NULL; - memset(p_sw, 0, sizeof(ftree_sw_t)); - - p_sw->p_osm_sw = p_osm_sw; - p_sw->rank = 0xFFFFFFFF; - tuple_init(p_sw->tuple); - - p_sw->base_lid = - cl_ntoh16(osm_node_get_base_lid(p_sw->p_osm_sw->p_node, 0)); - - ports_num = osm_node_get_num_physp(p_sw->p_osm_sw->p_node); - p_sw->down_port_groups = - (ftree_port_group_t **) malloc(ports_num * - sizeof(ftree_port_group_t *)); - p_sw->up_port_groups = - (ftree_port_group_t **) malloc(ports_num * - sizeof(ftree_port_group_t *)); - p_sw->sibling_port_groups = - (ftree_port_group_t **) malloc(ports_num * - sizeof(ftree_port_group_t *)); - - if (!p_sw->down_port_groups || !p_sw->up_port_groups - || !p_sw->sibling_port_groups) - return NULL; - - /* initialize lft buffer */ - memset(p_osm_sw->new_lft, OSM_NO_PATH, p_osm_sw->lft_size); - p_sw->hops = malloc((p_osm_sw->max_lid_ho + 1) * sizeof(*(p_sw->hops))); - if (p_sw->hops == NULL) - return NULL; - memset(p_sw->hops, OSM_NO_PATH, p_osm_sw->max_lid_ho + 1); - - return p_sw; -} /* sw_create() */ - -/***************************************************/ - -static void sw_destroy(IN ftree_fabric_t * p_ftree, IN ftree_sw_t * p_sw) -{ - uint8_t i; - - if (!p_sw) - return; - free(p_sw->hops); - - for (i = 0; i < p_sw->down_port_groups_num; i++) - port_group_destroy(p_sw->down_port_groups[i]); - for (i = 0; i < p_sw->sibling_port_groups_num; i++) - port_group_destroy(p_sw->sibling_port_groups[i]); - for (i = 0; i < p_sw->up_port_groups_num; i++) - port_group_destroy(p_sw->up_port_groups[i]); - if (p_sw->down_port_groups) - free(p_sw->down_port_groups); - if (p_sw->sibling_port_groups) - free(p_sw->sibling_port_groups); - if (p_sw->up_port_groups) - free(p_sw->up_port_groups); - - free(p_sw); -} /* sw_destroy() */ - -/***************************************************/ - -static uint64_t sw_get_guid_no(IN ftree_sw_t * p_sw) -{ - if (!p_sw) - return 0; - return osm_node_get_node_guid(p_sw->p_osm_sw->p_node); -} - -/***************************************************/ - -static uint64_t sw_get_guid_ho(IN ftree_sw_t * p_sw) -{ - return cl_ntoh64(sw_get_guid_no(p_sw)); -} - -/***************************************************/ - -static void sw_dump(IN ftree_fabric_t * p_ftree, IN ftree_sw_t * p_sw) -{ - uint32_t i; - - if (!p_sw) - return; - - if (!osm_log_is_active(&p_ftree->p_osm->log, OSM_LOG_DEBUG)) - return; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Switch index: %s, GUID: 0x%016" PRIx64 - ", Ports: %u DOWN, %u SIBLINGS, %u UP\n", - tuple_to_str(p_sw->tuple), sw_get_guid_ho(p_sw), - p_sw->down_port_groups_num, p_sw->sibling_port_groups_num, - p_sw->up_port_groups_num); - - for (i = 0; i < p_sw->down_port_groups_num; i++) - port_group_dump(p_ftree, p_sw->down_port_groups[i], - FTREE_DIRECTION_DOWN); - for (i = 0; i < p_sw->sibling_port_groups_num; i++) - port_group_dump(p_ftree, p_sw->sibling_port_groups[i], - FTREE_DIRECTION_SAME); - for (i = 0; i < p_sw->up_port_groups_num; i++) - port_group_dump(p_ftree, p_sw->up_port_groups[i], - FTREE_DIRECTION_UP); - -} /* sw_dump() */ - -/***************************************************/ - -static boolean_t sw_ranked(IN ftree_sw_t * p_sw) -{ - return (p_sw->rank != 0xFFFFFFFF); -} - -/***************************************************/ - -static ftree_port_group_t *sw_get_port_group_by_remote_lid(IN ftree_sw_t * p_sw, - IN uint16_t - remote_base_lid, - IN ftree_direction_t - direction) -{ - uint32_t i; - uint32_t size; - ftree_port_group_t **port_groups; - - if (direction == FTREE_DIRECTION_UP) { - port_groups = p_sw->up_port_groups; - size = p_sw->up_port_groups_num; - } else if (direction == FTREE_DIRECTION_SAME) { - port_groups = p_sw->sibling_port_groups; - size = p_sw->sibling_port_groups_num; - } else { - port_groups = p_sw->down_port_groups; - size = p_sw->down_port_groups_num; - } - - for (i = 0; i < size; i++) - if (remote_base_lid == port_groups[i]->remote_base_lid) - return port_groups[i]; - - return NULL; -} /* sw_get_port_group_by_remote_lid() */ - -/***************************************************/ - -static void sw_add_port(IN ftree_sw_t * p_sw, IN uint8_t port_num, - IN uint8_t remote_port_num, IN uint16_t base_lid, - IN uint16_t remote_base_lid, IN ib_net64_t port_guid, - IN ib_net64_t remote_port_guid, - IN ib_net64_t remote_node_guid, - IN uint8_t remote_node_type, - IN void *p_remote_hca_or_sw, - IN ftree_direction_t direction) -{ - ftree_port_group_t *p_group = - sw_get_port_group_by_remote_lid(p_sw, remote_base_lid, direction); - - if (!p_group) { - p_group = port_group_create(base_lid, remote_base_lid, - port_guid, sw_get_guid_no(p_sw), - IB_NODE_TYPE_SWITCH, p_sw, - remote_port_guid, remote_node_guid, - remote_node_type, - p_remote_hca_or_sw, FALSE, FALSE); - CL_ASSERT(p_group); - - if (direction == FTREE_DIRECTION_UP) { - p_sw->up_port_groups[p_sw->up_port_groups_num++] = - p_group; - } else if (direction == FTREE_DIRECTION_SAME) { - p_sw-> - sibling_port_groups[p_sw->sibling_port_groups_num++] - = p_group; - } else - p_sw->down_port_groups[p_sw->down_port_groups_num++] = - p_group; - } - port_group_add_port(p_group, port_num, remote_port_num); - -} /* sw_add_port() */ - -/***************************************************/ - -static inline cl_status_t sw_set_hops(IN ftree_sw_t * p_sw, IN uint16_t lid, - IN uint8_t port_num, IN uint8_t hops, - IN boolean_t is_target_sw) -{ - /* set local min hop table(LID) */ - p_sw->hops[lid] = hops; - if (is_target_sw) - return osm_switch_set_hops(p_sw->p_osm_sw, lid, port_num, hops); - return 0; -} - -/***************************************************/ - -static int set_hops_on_remote_sw(IN ftree_port_group_t * p_group, - IN uint16_t target_lid, IN uint8_t hops, - IN boolean_t is_target_sw) -{ - ftree_port_t *p_port; - uint8_t i, ports_num; - ftree_sw_t *p_remote_sw = p_group->remote_hca_or_sw.p_sw; - - /* if lid is a switch, we set the min hop table in the osm_switch struct */ - CL_ASSERT(p_group->remote_node_type == IB_NODE_TYPE_SWITCH); - p_remote_sw->hops[target_lid] = hops; - - /* If taget lid is a switch we set the min hop table values - * for each port on the associated osm_sw struct */ - if (!is_target_sw) - return 0; - - ports_num = (uint8_t) cl_ptr_vector_get_size(&p_group->ports); - for (i = 0; i < ports_num; i++) { - cl_ptr_vector_at(&p_group->ports, i, (void *)&p_port); - if (sw_set_hops(p_remote_sw, target_lid, - p_port->remote_port_num, hops, is_target_sw)) - return -1; - } - return 0; -} - -/***************************************************/ - -static inline uint8_t -sw_get_least_hops(IN ftree_sw_t * p_sw, IN uint16_t target_lid) -{ - CL_ASSERT(p_sw->hops != NULL); - return p_sw->hops[target_lid]; -} - -/*************************************************** - ** - ** ftree_hca_t functions - ** - ***************************************************/ - -static ftree_hca_t *hca_create(IN osm_node_t * p_osm_node) -{ - ftree_hca_t *p_hca = (ftree_hca_t *) malloc(sizeof(ftree_hca_t)); - if (p_hca == NULL) - return NULL; - memset(p_hca, 0, sizeof(ftree_hca_t)); - - p_hca->p_osm_node = p_osm_node; - p_hca->up_port_groups = (ftree_port_group_t **) - malloc(osm_node_get_num_physp(p_hca->p_osm_node) * - sizeof(ftree_port_group_t *)); - if (!p_hca->up_port_groups) - return NULL; - p_hca->up_port_groups_num = 0; - return p_hca; -} - -/***************************************************/ - -static void hca_destroy(IN ftree_hca_t * p_hca) -{ - uint32_t i; - - if (!p_hca) - return; - - for (i = 0; i < p_hca->up_port_groups_num; i++) - port_group_destroy(p_hca->up_port_groups[i]); - - if (p_hca->up_port_groups) - free(p_hca->up_port_groups); - - free(p_hca); -} - -/***************************************************/ - -static uint64_t hca_get_guid_no(IN ftree_hca_t * p_hca) -{ - if (!p_hca) - return 0; - return osm_node_get_node_guid(p_hca->p_osm_node); -} - -/***************************************************/ - -static uint64_t hca_get_guid_ho(IN ftree_hca_t * p_hca) -{ - return cl_ntoh64(hca_get_guid_no(p_hca)); -} - -/***************************************************/ - -static void hca_dump(IN ftree_fabric_t * p_ftree, IN ftree_hca_t * p_hca) -{ - uint32_t i; - - if (!p_hca) - return; - - if (!osm_log_is_active(&p_ftree->p_osm->log, OSM_LOG_DEBUG)) - return; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "CA GUID: 0x%016" PRIx64 ", Ports: %u UP\n", - hca_get_guid_ho(p_hca), p_hca->up_port_groups_num); - - for (i = 0; i < p_hca->up_port_groups_num; i++) - port_group_dump(p_ftree, p_hca->up_port_groups[i], - FTREE_DIRECTION_UP); -} - -/***************************************************/ - -static ftree_port_group_t *hca_get_port_group_by_remote_lid(IN ftree_hca_t * - p_hca, - IN uint16_t - remote_base_lid) -{ - uint32_t i; - for (i = 0; i < p_hca->up_port_groups_num; i++) - if (remote_base_lid == - p_hca->up_port_groups[i]->remote_base_lid) - return p_hca->up_port_groups[i]; - - return NULL; -} - -/***************************************************/ - -static void hca_add_port(IN ftree_hca_t * p_hca, IN uint8_t port_num, - IN uint8_t remote_port_num, IN uint16_t base_lid, - IN uint16_t remote_base_lid, IN ib_net64_t port_guid, - IN ib_net64_t remote_port_guid, - IN ib_net64_t remote_node_guid, - IN uint8_t remote_node_type, - IN void *p_remote_hca_or_sw, IN boolean_t is_cn, - IN boolean_t is_io) -{ - ftree_port_group_t *p_group; - - /* this function is supposed to be called only for adding ports - in hca's that lead to switches */ - CL_ASSERT(remote_node_type == IB_NODE_TYPE_SWITCH); - - p_group = hca_get_port_group_by_remote_lid(p_hca, remote_base_lid); - - if (!p_group) { - p_group = port_group_create(base_lid, remote_base_lid, - port_guid, hca_get_guid_no(p_hca), - IB_NODE_TYPE_CA, p_hca, - remote_port_guid, remote_node_guid, - remote_node_type, - p_remote_hca_or_sw, is_cn, is_io); - p_hca->up_port_groups[p_hca->up_port_groups_num++] = p_group; - } - port_group_add_port(p_group, port_num, remote_port_num); - -} /* hca_add_port() */ - -/*************************************************** - ** - ** ftree_fabric_t functions - ** - ***************************************************/ - -static ftree_fabric_t *fabric_create() -{ - ftree_fabric_t *p_ftree = - (ftree_fabric_t *) malloc(sizeof(ftree_fabric_t)); - if (p_ftree == NULL) - return NULL; - - memset(p_ftree, 0, sizeof(ftree_fabric_t)); - - cl_qmap_init(&p_ftree->hca_tbl); - cl_qmap_init(&p_ftree->sw_tbl); - cl_qmap_init(&p_ftree->sw_by_tuple_tbl); - cl_qmap_init(&p_ftree->cn_guid_tbl); - cl_qmap_init(&p_ftree->io_guid_tbl); - - return p_ftree; -} - -/***************************************************/ - -static void fabric_clear(ftree_fabric_t * p_ftree) -{ - ftree_hca_t *p_hca; - ftree_hca_t *p_next_hca; - ftree_sw_t *p_sw; - ftree_sw_t *p_next_sw; - ftree_sw_tbl_element_t *p_element; - ftree_sw_tbl_element_t *p_next_element; - name_map_item_t *p_guid_element, *p_next_guid_element; - - if (!p_ftree) - return; - - /* remove all the elements of hca_tbl */ - - p_next_hca = (ftree_hca_t *) cl_qmap_head(&p_ftree->hca_tbl); - while (p_next_hca != (ftree_hca_t *) cl_qmap_end(&p_ftree->hca_tbl)) { - p_hca = p_next_hca; - p_next_hca = (ftree_hca_t *) cl_qmap_next(&p_hca->map_item); - hca_destroy(p_hca); - } - cl_qmap_remove_all(&p_ftree->hca_tbl); - - /* remove all the elements of sw_tbl */ - - p_next_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - while (p_next_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl)) { - p_sw = p_next_sw; - p_next_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item); - sw_destroy(p_ftree, p_sw); - } - cl_qmap_remove_all(&p_ftree->sw_tbl); - - /* remove all the elements of sw_by_tuple_tbl */ - - p_next_element = - (ftree_sw_tbl_element_t *) cl_qmap_head(&p_ftree->sw_by_tuple_tbl); - while (p_next_element != (ftree_sw_tbl_element_t *) - cl_qmap_end(&p_ftree->sw_by_tuple_tbl)) { - p_element = p_next_element; - p_next_element = (ftree_sw_tbl_element_t *) - cl_qmap_next(&p_element->map_item); - sw_tbl_element_destroy(p_element); - } - cl_qmap_remove_all(&p_ftree->sw_by_tuple_tbl); - - /* remove all the elements of cn_guid_tbl */ - p_next_guid_element = - (name_map_item_t *) cl_qmap_head(&p_ftree->cn_guid_tbl); - while (p_next_guid_element != - (name_map_item_t *) cl_qmap_end(&p_ftree->cn_guid_tbl)) { - p_guid_element = p_next_guid_element; - p_next_guid_element = - (name_map_item_t *) cl_qmap_next(&p_guid_element->item); - free(p_guid_element); - } - cl_qmap_remove_all(&p_ftree->cn_guid_tbl); - - /* remove all the elements of io_guid_tbl */ - p_next_guid_element = - (name_map_item_t *) cl_qmap_head(&p_ftree->io_guid_tbl); - while (p_next_guid_element != - (name_map_item_t *) cl_qmap_end(&p_ftree->io_guid_tbl)) { - p_guid_element = p_next_guid_element; - p_next_guid_element = - (name_map_item_t *) cl_qmap_next(&p_guid_element->item); - free(p_guid_element); - } - cl_qmap_remove_all(&p_ftree->io_guid_tbl); - - /* free the leaf switches array */ - if ((p_ftree->leaf_switches_num > 0) && (p_ftree->leaf_switches)) - free(p_ftree->leaf_switches); - - p_ftree->leaf_switches_num = 0; - p_ftree->cn_num = 0; - p_ftree->ca_ports = 0; - p_ftree->leaf_switch_rank = 0; - p_ftree->max_switch_rank = 0; - p_ftree->max_cn_per_leaf = 0; - p_ftree->lft_max_lid = 0; - p_ftree->leaf_switches = NULL; - p_ftree->fabric_built = FALSE; - -} /* fabric_destroy() */ - -/***************************************************/ - -static void fabric_destroy(ftree_fabric_t * p_ftree) -{ - if (!p_ftree) - return; - fabric_clear(p_ftree); - free(p_ftree); -} - -/***************************************************/ - -static uint8_t fabric_get_rank(ftree_fabric_t * p_ftree) -{ - return p_ftree->leaf_switch_rank + 1; -} - -/***************************************************/ - -static void fabric_add_hca(ftree_fabric_t * p_ftree, osm_node_t * p_osm_node) -{ - ftree_hca_t *p_hca = hca_create(p_osm_node); - - CL_ASSERT(osm_node_get_type(p_osm_node) == IB_NODE_TYPE_CA); - - cl_qmap_insert(&p_ftree->hca_tbl, p_osm_node->node_info.node_guid, - &p_hca->map_item); -} - -/***************************************************/ - -static void fabric_add_sw(ftree_fabric_t * p_ftree, osm_switch_t * p_osm_sw) -{ - ftree_sw_t *p_sw = sw_create(p_ftree, p_osm_sw); - - CL_ASSERT(osm_node_get_type(p_osm_sw->p_node) == IB_NODE_TYPE_SWITCH); - - cl_qmap_insert(&p_ftree->sw_tbl, p_osm_sw->p_node->node_info.node_guid, - &p_sw->map_item); - - /* track the max lid (in host order) that exists in the fabric */ - if (p_sw->base_lid > p_ftree->lft_max_lid) - p_ftree->lft_max_lid = p_sw->base_lid; -} - -/***************************************************/ - -static void fabric_add_sw_by_tuple(IN ftree_fabric_t * p_ftree, - IN ftree_sw_t * p_sw) -{ - CL_ASSERT(tuple_assigned(p_sw->tuple)); - - cl_qmap_insert(&p_ftree->sw_by_tuple_tbl, tuple_to_key(p_sw->tuple), - &sw_tbl_element_create(p_sw)->map_item); -} - -/***************************************************/ - -static ftree_sw_t *fabric_get_sw_by_tuple(IN ftree_fabric_t * p_ftree, - IN ftree_tuple_t tuple) -{ - ftree_sw_tbl_element_t *p_element; - - CL_ASSERT(tuple_assigned(tuple)); - - tuple_to_key(tuple); - - p_element = - (ftree_sw_tbl_element_t *) cl_qmap_get(&p_ftree->sw_by_tuple_tbl, - tuple_to_key(tuple)); - if (p_element == - (ftree_sw_tbl_element_t *) cl_qmap_end(&p_ftree->sw_by_tuple_tbl)) - return NULL; - - return p_element->p_sw; -} - -/***************************************************/ - -static ftree_sw_t *fabric_get_sw_by_guid(IN ftree_fabric_t * p_ftree, - IN uint64_t guid) -{ - ftree_sw_t *p_sw; - p_sw = (ftree_sw_t *) cl_qmap_get(&p_ftree->sw_tbl, guid); - if (p_sw == (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl)) - return NULL; - return p_sw; -} - -/***************************************************/ - -static ftree_hca_t *fabric_get_hca_by_guid(IN ftree_fabric_t * p_ftree, - IN uint64_t guid) -{ - ftree_hca_t *p_hca; - p_hca = (ftree_hca_t *) cl_qmap_get(&p_ftree->hca_tbl, guid); - if (p_hca == (ftree_hca_t *) cl_qmap_end(&p_ftree->hca_tbl)) - return NULL; - return p_hca; -} - -/***************************************************/ - -static void fabric_dump(ftree_fabric_t * p_ftree) -{ - uint32_t i; - ftree_hca_t *p_hca; - ftree_sw_t *p_sw; - - if (!osm_log_is_active(&p_ftree->p_osm->log, OSM_LOG_DEBUG)) - return; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, "\n" - " |-------------------------------|\n" - " |- Full fabric topology dump -|\n" - " |-------------------------------|\n\n"); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, "-- CAs:\n"); - - for (p_hca = (ftree_hca_t *) cl_qmap_head(&p_ftree->hca_tbl); - p_hca != (ftree_hca_t *) cl_qmap_end(&p_ftree->hca_tbl); - p_hca = (ftree_hca_t *) cl_qmap_next(&p_hca->map_item)) { - hca_dump(p_ftree, p_hca); - } - - for (i = 0; i <= p_ftree->max_switch_rank; i++) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "-- Rank %u switches\n", i); - for (p_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - p_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl); - p_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item)) { - if (p_sw->rank == i) - sw_dump(p_ftree, p_sw); - } - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, "\n" - " |---------------------------------------|\n" - " |- Full fabric topology dump completed -|\n" - " |---------------------------------------|\n\n"); -} /* fabric_dump() */ - -/***************************************************/ - -static void fabric_dump_general_info(IN ftree_fabric_t * p_ftree) -{ - uint32_t i, j; - ftree_sw_t *p_sw; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_INFO, - "General fabric topology info\n"); - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_INFO, - "============================\n"); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_INFO, - " - FatTree rank (roots to leaf switches): %u\n", - p_ftree->leaf_switch_rank + 1); - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_INFO, - " - FatTree max switch rank: %u\n", p_ftree->max_switch_rank); - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_INFO, - " - Fabric has %u CAs, %u CA ports (%u of them CNs), %u switches\n", - cl_qmap_count(&p_ftree->hca_tbl), p_ftree->ca_ports, - p_ftree->cn_num, cl_qmap_count(&p_ftree->sw_tbl)); - - CL_ASSERT(p_ftree->ca_ports >= p_ftree->cn_num); - - for (i = 0; i <= p_ftree->max_switch_rank; i++) { - j = 0; - for (p_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - p_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl); - p_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item)) { - if (p_sw->rank == i) - j++; - } - if (i == 0) - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_INFO, - " - Fabric has %u switches at rank %u (roots)\n", - j, i); - else if (i == p_ftree->leaf_switch_rank) - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_INFO, - " - Fabric has %u switches at rank %u (%u of them leafs)\n", - j, i, p_ftree->leaf_switches_num); - else - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_INFO, - " - Fabric has %u switches at rank %u\n", j, - i); - } - - if (osm_log_is_active(&p_ftree->p_osm->log, OSM_LOG_VERBOSE)) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - " - Root switches:\n"); - for (p_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - p_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl); - p_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item)) { - if (p_sw->rank == 0) - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - " GUID: 0x%016" PRIx64 - ", LID: %u, Index %s\n", - sw_get_guid_ho(p_sw), - p_sw->base_lid, - tuple_to_str(p_sw->tuple)); - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - " - Leaf switches (sorted by index):\n"); - for (i = 0; i < p_ftree->leaf_switches_num; i++) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - " GUID: 0x%016" PRIx64 - ", LID: %u, Index %s\n", - sw_get_guid_ho(p_ftree->leaf_switches[i]), - p_ftree->leaf_switches[i]->base_lid, - tuple_to_str(p_ftree->leaf_switches[i]->tuple)); - } - } -} /* fabric_dump_general_info() */ - -/***************************************************/ - -static void fabric_dump_hca_ordering(IN ftree_fabric_t * p_ftree) -{ - ftree_hca_t *p_hca; - ftree_sw_t *p_sw; - ftree_port_group_t *p_group_on_sw; - ftree_port_group_t *p_group_on_hca; - uint32_t i; - uint32_t j; - unsigned printed_hcas_on_leaf; - - char path[1024]; - FILE *p_hca_ordering_file; - char *filename = "opensm-ftree-ca-order.dump"; - - snprintf(path, sizeof(path), "%s/%s", - p_ftree->p_osm->subn.opt.dump_files_dir, filename); - p_hca_ordering_file = fopen(path, "w"); - if (!p_hca_ordering_file) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, "ERR AB01: " - "cannot open file \'%s\': %s\n", filename, - strerror(errno)); - return; - } - - /* for each leaf switch (in indexing order) */ - for (i = 0; i < p_ftree->leaf_switches_num; i++) { - p_sw = p_ftree->leaf_switches[i]; - printed_hcas_on_leaf = 0; - - /* for each real CA (CNs and not) connected to this switch */ - for (j = 0; j < p_sw->down_port_groups_num; j++) { - p_group_on_sw = p_sw->down_port_groups[j]; - - if (p_group_on_sw->remote_node_type != IB_NODE_TYPE_CA) - continue; - - p_hca = p_group_on_sw->remote_hca_or_sw.p_hca; - p_group_on_hca = - hca_get_port_group_by_remote_lid(p_hca, - p_group_on_sw-> - base_lid); - - /* treat non-compute nodes as dummies */ - if (!p_group_on_hca->is_cn) - continue; - - fprintf(p_hca_ordering_file, "0x%04x\t%s\n", - p_group_on_hca->base_lid, - p_hca->p_osm_node->print_desc); - - printed_hcas_on_leaf++; - } - - /* now print missing HCAs */ - for (j = 0; - j < (p_ftree->max_cn_per_leaf - printed_hcas_on_leaf); j++) - fprintf(p_hca_ordering_file, "0xFFFF\tDUMMY\n"); - - } - /* done going through all the leaf switches */ - - fclose(p_hca_ordering_file); -} /* fabric_dump_hca_ordering() */ - -/***************************************************/ - -static void fabric_assign_tuple(IN ftree_fabric_t * p_ftree, - IN ftree_sw_t * p_sw, - IN ftree_tuple_t new_tuple) -{ - memcpy(p_sw->tuple, new_tuple, FTREE_TUPLE_LEN); - fabric_add_sw_by_tuple(p_ftree, p_sw); -} - -/***************************************************/ - -static void fabric_assign_first_tuple(IN ftree_fabric_t * p_ftree, - IN ftree_sw_t * p_sw) -{ - uint8_t i; - ftree_tuple_t new_tuple; - - tuple_init(new_tuple); - new_tuple[0] = (uint8_t) p_sw->rank; - for (i = 1; i <= p_sw->rank; i++) - new_tuple[i] = 0; - - fabric_assign_tuple(p_ftree, p_sw, new_tuple); -} - -/***************************************************/ - -static void fabric_get_new_tuple(IN ftree_fabric_t * p_ftree, - OUT ftree_tuple_t new_tuple, - IN ftree_tuple_t from_tuple, - IN ftree_direction_t direction) -{ - ftree_sw_t *p_sw; - ftree_tuple_t temp_tuple; - uint8_t var_index; - uint8_t i; - - tuple_init(new_tuple); - memcpy(temp_tuple, from_tuple, FTREE_TUPLE_LEN); - - if (direction == FTREE_DIRECTION_DOWN) { - temp_tuple[0]++; - var_index = from_tuple[0] + 1; - } else { - temp_tuple[0]--; - var_index = from_tuple[0]; - } - - for (i = 0; i < 0xFF; i++) { - temp_tuple[var_index] = i; - p_sw = fabric_get_sw_by_tuple(p_ftree, temp_tuple); - if (p_sw == NULL) /* found free tuple */ - break; - } - - if (i == 0xFF) { - /* new tuple not found - there are more than 255 ports in one direction */ - return; - } - memcpy(new_tuple, temp_tuple, FTREE_TUPLE_LEN); - -} /* fabric_get_new_tuple() */ - -/***************************************************/ - -static inline boolean_t fabric_roots_provided(IN ftree_fabric_t * p_ftree) -{ - return (p_ftree->p_osm->subn.opt.root_guid_file != NULL); -} - -/***************************************************/ - -static inline boolean_t fabric_cns_provided(IN ftree_fabric_t * p_ftree) -{ - return (p_ftree->p_osm->subn.opt.cn_guid_file != NULL); -} - -/***************************************************/ - -static inline boolean_t fabric_ios_provided(IN ftree_fabric_t * p_ftree) -{ - return (p_ftree->p_osm->subn.opt.io_guid_file != NULL); -} - -/***************************************************/ - -static int fabric_mark_leaf_switches(IN ftree_fabric_t * p_ftree) -{ - ftree_sw_t *p_sw; - ftree_hca_t *p_hca; - ftree_hca_t *p_next_hca; - unsigned i; - int res = 0; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Marking leaf switches in fabric\n"); - - /* Scan all the CAs, if they have CNs - find CN port and mark switch - that is connected to this port as leaf switch. - Also, ensure that this marked leaf has rank of p_ftree->leaf_switch_rank. */ - p_next_hca = (ftree_hca_t *) cl_qmap_head(&p_ftree->hca_tbl); - while (p_next_hca != (ftree_hca_t *) cl_qmap_end(&p_ftree->hca_tbl)) { - p_hca = p_next_hca; - p_next_hca = (ftree_hca_t *) cl_qmap_next(&p_hca->map_item); - if (!p_hca->cn_num) - continue; - - for (i = 0; i < p_hca->up_port_groups_num; i++) { - if (!p_hca->up_port_groups[i]->is_cn) - continue; - - /* In CAs, port group alway has one port, and since this - port group is CN, we know that this port is compute node */ - CL_ASSERT(p_hca->up_port_groups[i]->remote_node_type == - IB_NODE_TYPE_SWITCH); - p_sw = p_hca->up_port_groups[i]->remote_hca_or_sw.p_sw; - - /* check if this switch was already processed */ - if (p_sw->is_leaf) - continue; - p_sw->is_leaf = TRUE; - - /* ensure that this leaf switch is at the correct tree level */ - if (p_sw->rank != p_ftree->leaf_switch_rank) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB26: CN port 0x%" PRIx64 - " is connected to switch 0x%" PRIx64 - " with rank %u, " - "while FatTree leaf rank is %u\n", - cl_ntoh64(p_hca-> - up_port_groups[i]->port_guid), - sw_get_guid_ho(p_sw), p_sw->rank, - p_ftree->leaf_switch_rank); - res = -1; - goto Exit; - - } - } - } - -Exit: - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return res; -} /* fabric_mark_leaf_switches() */ - -/***************************************************/ - -static void fabric_make_indexing(IN ftree_fabric_t * p_ftree) -{ - ftree_sw_t *p_remote_sw; - ftree_sw_t *p_sw = NULL; - ftree_sw_t *p_next_sw; - ftree_tuple_t new_tuple; - uint32_t i; - cl_list_t bfs_list; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Starting FatTree indexing\n"); - - /* using the first leaf switch as a starting point for indexing algorithm. */ - p_next_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - while (p_next_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl)) { - p_sw = p_next_sw; - if (p_sw->is_leaf) - break; - p_next_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item); - } - - CL_ASSERT(p_next_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl)); - - /* Assign the first tuple to the switch that is used as BFS starting point. - The tuple will be as follows: [rank].0.0.0... - This fuction also adds the switch it into the switch_by_tuple table. */ - fabric_assign_first_tuple(p_ftree, p_sw); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Indexing starting point:\n" - " - Switch rank : %u\n" - " - Switch index : %s\n" - " - Node LID : %u\n" - " - Node GUID : 0x%016" - PRIx64 "\n", p_sw->rank, tuple_to_str(p_sw->tuple), - p_sw->base_lid, sw_get_guid_ho(p_sw)); - - /* - * Now run BFS and assign indexes to all switches - * Pseudo code of the algorithm is as follows: - * - * * Add first switch to BFS queue - * * While (BFS queue not empty) - * - Pop the switch from the head of the queue - * - Scan all the downward and upward ports - * - For each port - * + Get the remote switch - * + Assign index to the remote switch - * + Add remote switch to the BFS queue - */ - - cl_list_init(&bfs_list, cl_qmap_count(&p_ftree->sw_tbl)); - cl_list_insert_tail(&bfs_list, p_sw); - - while (!cl_is_list_empty(&bfs_list)) { - p_sw = (ftree_sw_t *) cl_list_remove_head(&bfs_list); - - /* Discover all the nodes from ports that are pointing down */ - - if (p_sw->rank >= p_ftree->leaf_switch_rank) { - /* whether downward ports are pointing to CAs or switches, - we don't assign indexes to switches that are located - lower than leaf switches */ - } else { - /* This is not the leaf switch */ - for (i = 0; i < p_sw->down_port_groups_num; i++) { - /* Work with port groups that are pointing to switches only. - No need to assign indexing to HCAs */ - if (p_sw-> - down_port_groups[i]->remote_node_type != - IB_NODE_TYPE_SWITCH) - continue; - - p_remote_sw = - p_sw->down_port_groups[i]-> - remote_hca_or_sw.p_sw; - if (tuple_assigned(p_remote_sw->tuple)) { - /* this switch has been already indexed */ - continue; - } - /* allocate new tuple */ - fabric_get_new_tuple(p_ftree, new_tuple, - p_sw->tuple, - FTREE_DIRECTION_DOWN); - /* Assign the new tuple to the remote switch. - This fuction also adds the switch into the switch_by_tuple table. */ - fabric_assign_tuple(p_ftree, p_remote_sw, - new_tuple); - - /* add the newly discovered switch to the BFS queue */ - cl_list_insert_tail(&bfs_list, p_remote_sw); - } - /* Done assigning indexes to all the remote switches - that are pointed by the downgoing ports. - Now sort port groups according to remote index. */ - qsort(p_sw->down_port_groups, /* array */ - p_sw->down_port_groups_num, /* number of elements */ - sizeof(ftree_port_group_t *), /* size of each element */ - compare_port_groups_by_remote_switch_index); /* comparator */ - } - - /* Done indexing switches from ports that go down. - Now do the same with ports that are pointing up. */ - - if (p_sw->rank != 0) { - /* This is not the root switch, which means that all the ports - that are pointing up are taking us to another switches. */ - for (i = 0; i < p_sw->up_port_groups_num; i++) { - p_remote_sw = - p_sw->up_port_groups[i]-> - remote_hca_or_sw.p_sw; - if (tuple_assigned(p_remote_sw->tuple)) - continue; - /* allocate new tuple */ - fabric_get_new_tuple(p_ftree, new_tuple, - p_sw->tuple, - FTREE_DIRECTION_UP); - /* Assign the new tuple to the remote switch. - This fuction also adds the switch to the - switch_by_tuple table. */ - fabric_assign_tuple(p_ftree, - p_remote_sw, new_tuple); - /* add the newly discovered switch to the BFS queue */ - cl_list_insert_tail(&bfs_list, p_remote_sw); - } - /* Done assigning indexes to all the remote switches - that are pointed by the upgoing ports. - Now sort port groups according to remote index. */ - qsort(p_sw->up_port_groups, /* array */ - p_sw->up_port_groups_num, /* number of elements */ - sizeof(ftree_port_group_t *), /* size of each element */ - compare_port_groups_by_remote_switch_index); /* comparator */ - } - /* Done assigning indexes to all the switches that are directly connected - to the current switch - go to the next switch in the BFS queue */ - } - cl_list_destroy(&bfs_list); - - OSM_LOG_EXIT(&p_ftree->p_osm->log); -} /* fabric_make_indexing() */ - -/***************************************************/ - -static int fabric_create_leaf_switch_array(IN ftree_fabric_t * p_ftree) -{ - ftree_sw_t *p_sw; - ftree_sw_t *p_next_sw; - ftree_sw_t **all_switches_at_leaf_level; - unsigned i; - unsigned all_leaf_idx = 0; - unsigned first_leaf_idx; - unsigned last_leaf_idx; - int res = 0; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - /* create array of ALL the switches that have leaf rank */ - all_switches_at_leaf_level = (ftree_sw_t **) - malloc(cl_qmap_count(&p_ftree->sw_tbl) * sizeof(ftree_sw_t *)); - if (!all_switches_at_leaf_level) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_SYS, - "Fat-tree routing: Memory allocation failed\n"); - res = -1; - goto Exit; - } - memset(all_switches_at_leaf_level, 0, - cl_qmap_count(&p_ftree->sw_tbl) * sizeof(ftree_sw_t *)); - - p_next_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - while (p_next_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl)) { - p_sw = p_next_sw; - p_next_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item); - if (p_sw->rank == p_ftree->leaf_switch_rank) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Adding switch 0x%" PRIx64 - " to full leaf switch array\n", - sw_get_guid_ho(p_sw)); - all_switches_at_leaf_level[all_leaf_idx++] = p_sw; - } - } - - /* quick-sort array of leaf switches by index */ - qsort(all_switches_at_leaf_level, /* array */ - all_leaf_idx, /* number of elements */ - sizeof(ftree_sw_t *), /* size of each element */ - compare_switches_by_index); /* comparator */ - - /* check the first and the last REAL leaf (the one - that has CNs) in the array of all the leafs */ - - first_leaf_idx = all_leaf_idx; - last_leaf_idx = 0; - for (i = 0; i < all_leaf_idx; i++) { - if (all_switches_at_leaf_level[i]->is_leaf) { - if (i < first_leaf_idx) - first_leaf_idx = i; - last_leaf_idx = i; - } - } - CL_ASSERT(first_leaf_idx < last_leaf_idx); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Full leaf array info: first_leaf_idx = %u, last_leaf_idx = %u\n", - first_leaf_idx, last_leaf_idx); - - /* Create array of REAL leaf switches, sorted by index. - This array may contain switches at the same rank w/o CNs, - in case this is the order of indexing. */ - p_ftree->leaf_switches_num = last_leaf_idx - first_leaf_idx + 1; - p_ftree->leaf_switches = (ftree_sw_t **) - malloc(p_ftree->leaf_switches_num * sizeof(ftree_sw_t *)); - if (!p_ftree->leaf_switches) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_SYS, - "Fat-tree routing: Memory allocation failed\n"); - res = -1; - goto Exit; - } - - memcpy(p_ftree->leaf_switches, - &(all_switches_at_leaf_level[first_leaf_idx]), - p_ftree->leaf_switches_num * sizeof(ftree_sw_t *)); - - free(all_switches_at_leaf_level); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Created array of %u leaf switches\n", - p_ftree->leaf_switches_num); - -Exit: - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return res; -} /* fabric_create_leaf_switch_array() */ - -/***************************************************/ - -static void fabric_set_max_cn_per_leaf(IN ftree_fabric_t * p_ftree) -{ - unsigned i; - unsigned j; - unsigned cns_on_this_leaf; - ftree_sw_t *p_sw; - ftree_port_group_t *p_group; - - for (i = 0; i < p_ftree->leaf_switches_num; i++) { - p_sw = p_ftree->leaf_switches[i]; - cns_on_this_leaf = 0; - for (j = 0; j < p_sw->down_port_groups_num; j++) { - p_group = p_sw->down_port_groups[j]; - if (p_group->remote_node_type != IB_NODE_TYPE_CA) - continue; - cns_on_this_leaf += - p_group->remote_hca_or_sw.p_hca->cn_num; - } - if (cns_on_this_leaf > p_ftree->max_cn_per_leaf) - p_ftree->max_cn_per_leaf = cns_on_this_leaf; - } -} /* fabric_set_max_cn_per_leaf() */ - -/***************************************************/ - -static boolean_t fabric_validate_topology(IN ftree_fabric_t * p_ftree) -{ - ftree_port_group_t *p_group; - ftree_port_group_t *p_ref_group; - ftree_sw_t *p_sw; - ftree_sw_t *p_next_sw; - ftree_sw_t **reference_sw_arr; - uint16_t tree_rank = fabric_get_rank(p_ftree); - boolean_t res = TRUE; - uint8_t i; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Validating fabric topology\n"); - - reference_sw_arr = - (ftree_sw_t **) malloc(tree_rank * sizeof(ftree_sw_t *)); - if (reference_sw_arr == NULL) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_SYS, - "Fat-tree routing: Memory allocation failed\n"); - return FALSE; - } - memset(reference_sw_arr, 0, tree_rank * sizeof(ftree_sw_t *)); - - p_next_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - while (res && p_next_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl)) { - p_sw = p_next_sw; - p_next_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item); - - if (!reference_sw_arr[p_sw->rank]) { - /* This is the first switch in the current level that - we're checking - use it as a reference */ - reference_sw_arr[p_sw->rank] = p_sw; - } else { - /* compare this switch properties to the reference switch */ - - if (reference_sw_arr[p_sw->rank]->up_port_groups_num != - p_sw->up_port_groups_num) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB09: Different number of upward port groups on switches:\n" - " GUID 0x%016" PRIx64 - ", LID %u, Index %s - %u groups\n" - " GUID 0x%016" PRIx64 - ", LID %u, Index %s - %u groups\n", - sw_get_guid_ho - (reference_sw_arr[p_sw->rank]), - reference_sw_arr[p_sw->rank]->base_lid, - tuple_to_str - (reference_sw_arr[p_sw->rank]->tuple), - reference_sw_arr[p_sw-> - rank]-> - up_port_groups_num, - sw_get_guid_ho(p_sw), p_sw->base_lid, - tuple_to_str(p_sw->tuple), - p_sw->up_port_groups_num); - res = FALSE; - break; - } - - if (p_sw->rank != (tree_rank - 1) && - reference_sw_arr[p_sw-> - rank]->down_port_groups_num != - p_sw->down_port_groups_num) { - /* we're allowing some hca's to be missing */ - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB0A: Different number of downward port groups on switches:\n" - " GUID 0x%016" PRIx64 - ", LID %u, Index %s - %u port groups\n" - " GUID 0x%016" PRIx64 - ", LID %u, Index %s - %u port groups\n", - sw_get_guid_ho - (reference_sw_arr[p_sw->rank]), - reference_sw_arr[p_sw->rank]->base_lid, - tuple_to_str - (reference_sw_arr[p_sw->rank]->tuple), - reference_sw_arr[p_sw-> - rank]-> - down_port_groups_num, - sw_get_guid_ho(p_sw), p_sw->base_lid, - tuple_to_str(p_sw->tuple), - p_sw->down_port_groups_num); - res = FALSE; - break; - } - - if (reference_sw_arr[p_sw->rank]->up_port_groups_num != - 0) { - p_ref_group = - reference_sw_arr[p_sw-> - rank]->up_port_groups[0]; - for (i = 0; i < p_sw->up_port_groups_num; i++) { - p_group = p_sw->up_port_groups[i]; - if (cl_ptr_vector_get_size - (&p_ref_group->ports) != - cl_ptr_vector_get_size - (&p_group->ports)) { - OSM_LOG(&p_ftree->p_osm->log, - OSM_LOG_ERROR, - "ERR AB0B: Different number of ports in an upward port group on switches:\n" - " GUID 0x%016" - PRIx64 - ", LID %u, Index %s - %u ports\n" - " GUID 0x%016" - PRIx64 - ", LID %u, Index %s - %u ports\n", - sw_get_guid_ho - (reference_sw_arr - [p_sw->rank]), - reference_sw_arr[p_sw-> - rank]-> - base_lid, - tuple_to_str - (reference_sw_arr - [p_sw->rank]->tuple), - cl_ptr_vector_get_size - (&p_ref_group->ports), - sw_get_guid_ho(p_sw), - p_sw->base_lid, - tuple_to_str(p_sw-> - tuple), - cl_ptr_vector_get_size - (&p_group->ports)); - res = FALSE; - break; - } - } - } - if (reference_sw_arr[p_sw->rank]->down_port_groups_num - != 0 && p_sw->rank != (tree_rank - 1)) { - /* we're allowing some hca's to be missing */ - p_ref_group = - reference_sw_arr[p_sw-> - rank]->down_port_groups[0]; - for (i = 0; i < p_sw->down_port_groups_num; i++) { - p_group = p_sw->down_port_groups[0]; - if (cl_ptr_vector_get_size - (&p_ref_group->ports) != - cl_ptr_vector_get_size - (&p_group->ports)) { - OSM_LOG(&p_ftree->p_osm->log, - OSM_LOG_ERROR, - "ERR AB0C: Different number of ports in an downward port group on switches:\n" - " GUID 0x%016" - PRIx64 - ", LID %u, Index %s - %u ports\n" - " GUID 0x%016" - PRIx64 - ", LID %u, Index %s - %u ports\n", - sw_get_guid_ho - (reference_sw_arr - [p_sw->rank]), - reference_sw_arr[p_sw-> - rank]-> - base_lid, - tuple_to_str - (reference_sw_arr - [p_sw->rank]->tuple), - cl_ptr_vector_get_size - (&p_ref_group->ports), - sw_get_guid_ho(p_sw), - p_sw->base_lid, - tuple_to_str(p_sw-> - tuple), - cl_ptr_vector_get_size - (&p_group->ports)); - res = FALSE; - break; - } - } - } - } /* end of else */ - } /* end of while */ - - if (res == TRUE) - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Fabric topology has been identified as FatTree\n"); - else - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB0D: Fabric topology hasn't been identified as FatTree\n"); - - free(reference_sw_arr); - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return res; -} /* fabric_validate_topology() */ - -/*************************************************** - ***************************************************/ - -static void set_sw_fwd_table(IN cl_map_item_t * const p_map_item, - IN void *context) -{ - ftree_sw_t *p_sw = (ftree_sw_t * const)p_map_item; - ftree_fabric_t *p_ftree = (ftree_fabric_t *) context; - - p_sw->p_osm_sw->max_lid_ho = p_ftree->lft_max_lid; -} - -/*************************************************** - ***************************************************/ - -/* - * Function: Finds the least loaded port group and stores its counter - * Given : A switch - */ -static inline void recalculate_min_counter_down(ftree_sw_t * p_sw) -{ - uint32_t min = (1 << 30); - uint32_t i; - for (i = 0; i < p_sw->down_port_groups_num; i++) { - if (p_sw->down_port_groups[i]->counter_down < min) { - min = p_sw->down_port_groups[i]->counter_down; - } - } - p_sw->min_counter_down = min; - return; -} - -/* - * Function: Return the counter value of the least loaded down port group - * Given : A switch - */ -static inline uint32_t find_lowest_loaded_group_on_sw(ftree_sw_t * p_sw) -{ - return p_sw->min_counter_down; -} - -/* - * Function: Compare the load of two port groups and return which is the least loaded - * Given : Two port groups with remote switch - * When both port groups are equally loaded, it picks the one whom - * remote switch down ports are least loaded. - * This way, it prefers the switch from where it will be easier to go down (creating upward routes). - * If both are equal, it picks the bigger GUID to be deterministic. - */ -static inline int port_group_compare_load_down(const ftree_port_group_t * p1, - const ftree_port_group_t * p2) -{ - int temp = p1->counter_down - p2->counter_down; - if (temp > 0) - return 1; - if (temp < 0) - return -1; - - /* Find the less loaded remote sw and choose this one */ - do { - uint32_t load1 = - find_lowest_loaded_group_on_sw(p1->remote_hca_or_sw.p_sw); - uint32_t load2 = - find_lowest_loaded_group_on_sw(p2->remote_hca_or_sw.p_sw); - temp = load1 - load2; - if (temp > 0) - return 1; - } while (0); - /* If they are both equal, choose the biggest GUID */ - if (p1->remote_port_guid > p2->remote_port_guid) - return 1; - - return -1; - -} - -/* - * Function: Sorts an array of port group by up load order - * Given : A port group array and its length - * As the list is mostly sorted, we used a bubble sort instead of qsort - * as it is much faster. - * - * Important note: - * This function and bubble_sort_down must NOT be factorized. - * Although most of the code is the same and a function pointer could be used - * for the compareason function, it would prevent the compareason function to be inlined - * and cost a great deal to performances. - */ -static inline void -bubble_sort_up(ftree_port_group_t ** p_group_array, uint32_t nmemb) -{ - uint32_t i = 0; - uint32_t j = 0; - ftree_port_group_t *tmp = p_group_array[0]; - - /* As this function is a great number of times, we only go into the loop - * if one of the port counters has changed, thus saving some tests */ - if (tmp->hca_or_sw.p_sw->counter_up_changed == FALSE) { - return; - } - /* While we did modifications on the array order */ - /* i may grew above array length but next loop will fail and tmp will be null for the next time - * this way we save a test i < nmemb for each pass through the loop */ - for (i = 0; tmp; i++) { - /* Assume the array is orderd */ - tmp = NULL; - /* Comparing elements j and j-1 */ - for (j = 1; j < (nmemb - i); j++) { - /* If they are the wrong way around */ - if (p_group_array[j]->counter_up < - p_group_array[j - 1]->counter_up) { - /* We invert them */ - tmp = p_group_array[j - 1]; - p_group_array[j - 1] = p_group_array[j]; - p_group_array[j] = tmp; - /* This sets tmp != NULL so the main loop will make another pass */ - } - } - } - - /* We have reordered the array so as long noone changes the counter - * it's not necessary to do it again */ - p_group_array[0]->hca_or_sw.p_sw->counter_up_changed = FALSE; -} - -static inline void -bubble_sort_siblings(ftree_port_group_t ** p_group_array, uint32_t nmemb) -{ - uint32_t i = 0; - uint32_t j = 0; - ftree_port_group_t *tmp = p_group_array[0]; - - /* While we did modifications on the array order */ - /* i may grew above array length but next loop will fail and tmp will be null for the next time - * this way we save a test i < nmemb for each pass through the loop */ - for (i = 0; tmp != NULL; i++) { - /* Assume the array is orderd */ - tmp = NULL; - /* Comparing elements j and j-1 */ - for (j = 1; j < (nmemb - i); j++) { - /* If they are the wrong way around */ - if (p_group_array[j]->counter_up < - p_group_array[j - 1]->counter_up) { - /* We invert them */ - tmp = p_group_array[j - 1]; - p_group_array[j - 1] = p_group_array[j]; - p_group_array[j] = tmp; - - } - } - } -} - -/* - * Function: Sorts an array of port group. Order is decide through - * port_group_compare_load_down ( up counters, least load remote switch, biggest GUID) - * Given : A port group array and its length. Each port group points to a remote switch (not a HCA) - * As the list is mostly sorted, we used a bubble sort instead of qsort - * as it is much faster. - * - * Important note: - * This function and bubble_sort_up must NOT be factorized. - * Although most of the code is the same and a function pointer could be used - * for the compareason function, it would prevent the compareason function to be inlined - * and cost a great deal to performances. - */ -static inline void -bubble_sort_down(ftree_port_group_t ** p_group_array, uint32_t nmemb) -{ - uint32_t i = 0; - uint32_t j = 0; - ftree_port_group_t *tmp = p_group_array[0]; - - /* While we did modifications on the array order */ - /* i may grew above array length but next loop will fail and tmp will be null for the next time - * this way we save a test i < nmemb for each pass through the loop */ - for (i = 0; tmp; i++) { - /* Assume the array is orderd */ - tmp = NULL; - /* Comparing elements j and j-1 */ - for (j = 1; j < (nmemb - i); j++) { - /* If they are the wrong way around */ - if (port_group_compare_load_down - (p_group_array[j], p_group_array[j - 1]) < 0) { - /* We invert them */ - tmp = p_group_array[j - 1]; - p_group_array[j - 1] = p_group_array[j]; - p_group_array[j] = tmp; - - } - } - } -} - -/*************************************************** - ***************************************************/ - -/* - * Function: assign-up-going-port-by-descending-down - * Given : a switch and a LID - * Pseudo code: - * foreach down-going-port-group (in indexing order) - * skip this group if the LFT(LID) port is part of this group - * find the least loaded port of the group (scan in indexing order) - * r-port is the remote port connected to it - * assign the remote switch node LFT(LID) to r-port - * increase r-port usage counter - * assign-up-going-port-by-descending-down to r-port node (recursion) - */ - -static boolean_t -fabric_route_upgoing_by_going_down(IN ftree_fabric_t * p_ftree, - IN ftree_sw_t * p_sw, - IN ftree_sw_t * p_prev_sw, - IN uint16_t target_lid, - IN boolean_t is_real_lid, - IN boolean_t is_main_path, - IN boolean_t is_target_a_sw, - IN uint8_t current_hops) -{ - ftree_sw_t *p_remote_sw; - uint16_t ports_num; - ftree_port_group_t *p_group; - ftree_port_t *p_port; - ftree_port_t *p_min_port; - uint16_t j; - uint16_t k; - boolean_t created_route = FALSE; - boolean_t routed = 0; - uint8_t least_hops; - - /* we shouldn't enter here if both real_lid and main_path are false */ - CL_ASSERT(is_real_lid || is_main_path); - - /* if there is no down-going ports */ - if (p_sw->down_port_groups_num == 0) - return FALSE; - - /* foreach down-going port group (in load order) */ - bubble_sort_up(p_sw->down_port_groups, p_sw->down_port_groups_num); - - if (p_sw->sibling_port_groups_num > 0) - bubble_sort_siblings(p_sw->sibling_port_groups, - p_sw->sibling_port_groups_num); - - for (k = 0; - k < - (p_sw->down_port_groups_num + - (is_real_lid ? p_sw->sibling_port_groups_num : 0)); k++) { - - if (k < p_sw->down_port_groups_num) { - p_group = p_sw->down_port_groups[k]; - } else { - p_group = - p_sw->sibling_port_groups[k - - p_sw-> - down_port_groups_num]; - } - - /* If this port group doesn't point to a switch, mark - that the route was created and skip to the next group */ - if (p_group->remote_node_type != IB_NODE_TYPE_SWITCH) { - created_route = TRUE; - continue; - } - - if (p_prev_sw - && p_group->remote_base_lid == p_prev_sw->base_lid) { - /* This port group has a port that was used when we entered this switch, - which means that the current group points to the switch where we were - at the previous step of the algorithm (before going up). - Skipping this group. */ - continue; - } - - /* find the least loaded port of the group (in indexing order) */ - p_min_port = NULL; - ports_num = (uint16_t) cl_ptr_vector_get_size(&p_group->ports); - - for (j = 0; j < ports_num; j++) { - cl_ptr_vector_at(&p_group->ports, j, (void *)&p_port); - /* first port that we're checking - set as port with the lowest load */ - /* or this port is less loaded - use it as min */ - if (!p_min_port || - p_port->counter_up < p_min_port->counter_up) - p_min_port = p_port; - } - /* At this point we have selected a port in this group with the - lowest load of upgoing routes. - Set on the remote switch how to get to the target_lid - - set LFT(target_lid) on the remote switch to the remote port */ - p_remote_sw = p_group->remote_hca_or_sw.p_sw; - least_hops = sw_get_least_hops(p_remote_sw, target_lid); - - if (least_hops != OSM_NO_PATH) { - /* Loop in the fabric - we already routed the remote switch - on our way UP, and now we see it again on our way DOWN */ - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Loop of lenght %d in the fabric:\n " - "Switch %s (LID %u) closes loop through switch %s (LID %u)\n", - current_hops, - tuple_to_str(p_remote_sw->tuple), - p_group->base_lid, - tuple_to_str(p_sw->tuple), - p_group->remote_base_lid); - /* We skip only if we have come through a longer path */ - if (current_hops + 1 >= least_hops) - continue; - } - - /* Four possible cases: - * - * 1. is_real_lid == TRUE && is_main_path == TRUE: - * - going DOWN(TRUE,TRUE) through ALL the groups - * + promoting port counter - * + setting path in remote switch fwd tbl - * + setting hops in remote switch on all the ports of each group - * - * 2. is_real_lid == TRUE && is_main_path == FALSE: - * - going DOWN(TRUE,FALSE) through ALL the groups but only if - * the remote (lower) switch hasn't been already configured - * for this target LID (or with a longer path) - * + promoting port counter - * + setting path in remote switch fwd tbl if it hasn't been set yet - * + setting hops in remote switch on all the ports of each group - * if it hasn't been set yet - * - * 3. is_real_lid == FALSE && is_main_path == TRUE: - * - going DOWN(FALSE,TRUE) through ALL the groups - * + promoting port counter - * + NOT setting path in remote switch fwd tbl - * + NOT setting hops in remote switch - * - * 4. is_real_lid == FALSE && is_main_path == FALSE: - * - illegal state - we shouldn't get here - */ - - /* setting fwd tbl port only if this is real LID */ - if (is_real_lid) { - p_remote_sw->p_osm_sw->new_lft[target_lid] = - p_min_port->remote_port_num; - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Switch %s: set path to CA LID %u through port %u\n", - tuple_to_str(p_remote_sw->tuple), - target_lid, p_min_port->remote_port_num); - - /* On the remote switch that is pointed by the p_group, - set hops for ALL the ports in the remote group. */ - - set_hops_on_remote_sw(p_group, target_lid, - current_hops + 1, is_target_a_sw); - } - - /* Recursion step: - Assign upgoing ports by stepping down, starting on REMOTE switch */ - routed = fabric_route_upgoing_by_going_down(p_ftree, p_remote_sw, /* remote switch - used as a route-upgoing alg. start point */ - NULL, /* prev. position - NULL to mark that we went down and not up */ - target_lid, /* LID that we're routing to */ - is_real_lid, /* whether the target LID is real or dummy */ - is_main_path, /* whether this is path to HCA that should by tracked by counters */ - is_target_a_sw, /* Wheter target lid is a switch or not */ - current_hops + 1); /* Number of hops done to this point */ - created_route |= routed; - /* Counters are promoted only if a route toward a node is created */ - if (routed) { - p_min_port->counter_up++; - p_group->counter_up++; - p_group->hca_or_sw.p_sw->counter_up_changed = TRUE; - } - } - /* done scanning all the down-going port groups */ - - /* if the route was created, promote the index that - indicates which group should we start with when - going through all the downgoing groups */ - if (created_route) - p_sw->down_port_groups_idx = (p_sw->down_port_groups_idx + 1) - % p_sw->down_port_groups_num; - - return created_route; -} /* fabric_route_upgoing_by_going_down() */ - -/***************************************************/ - -/* - * Function: assign-down-going-port-by-ascending-up - * Given : a switch and a LID - * Pseudo code: - * find the least loaded port of all the upgoing groups (scan in indexing order) - * assign the LFT(LID) of remote switch to that port - * track that port usage - * assign-up-going-port-by-descending-down on CURRENT switch - * assign-down-going-port-by-ascending-up on REMOTE switch (recursion) - */ - -static boolean_t -fabric_route_downgoing_by_going_up(IN ftree_fabric_t * p_ftree, - IN ftree_sw_t * p_sw, - IN ftree_sw_t * p_prev_sw, - IN uint16_t target_lid, - IN boolean_t is_real_lid, - IN boolean_t is_main_path, - IN boolean_t is_target_a_sw, - IN uint16_t reverse_hop_credit, - IN uint16_t reverse_hops, - IN uint8_t current_hops) -{ - ftree_sw_t *p_remote_sw; - uint16_t ports_num; - ftree_port_group_t *p_group; - ftree_port_t *p_port; - ftree_port_group_t *p_min_group; - ftree_port_t *p_min_port; - uint16_t i; - uint16_t j; - boolean_t created_route = FALSE; - boolean_t routed = FALSE; - - /* we shouldn't enter here if both real_lid and main_path are false */ - CL_ASSERT(is_real_lid || is_main_path); - - /* Assign upgoing ports by stepping down, starting on THIS switch */ - created_route = fabric_route_upgoing_by_going_down(p_ftree, p_sw, /* local switch - used as a route-upgoing alg. start point */ - p_prev_sw, /* switch that we went up from (NULL means that we went down) */ - target_lid, /* LID that we're routing to */ - is_real_lid, /* whether this target LID is real or dummy */ - is_main_path, /* whether this path to HCA should by tracked by counters */ - is_target_a_sw, /* Wheter target lid is a switch or not */ - current_hops); /* Number of hops done up to this point */ - - /* recursion stop condition - if it's a root switch, */ - if (p_sw->rank == 0) { - if (reverse_hop_credit > 0) { - /* We go up by going down as we have some reverse_hop_credit left */ - /* We use the index to scatter a bit the reverse up routes */ - p_sw->down_port_groups_idx = - (p_sw->down_port_groups_idx + - 1) % p_sw->down_port_groups_num; - i = p_sw->down_port_groups_idx; - for (j = 0; j < p_sw->down_port_groups_num; j++) { - - p_group = p_sw->down_port_groups[i]; - i = (i + 1) % p_sw->down_port_groups_num; - - /* Skip this port group unless it points to a switch */ - if (p_group->remote_node_type != - IB_NODE_TYPE_SWITCH) - continue; - p_remote_sw = p_group->remote_hca_or_sw.p_sw; - - created_route |= fabric_route_downgoing_by_going_up(p_ftree, p_remote_sw, /* remote switch - used as a route-downgoing alg. next step point */ - p_sw, /* this switch - prev. position switch for the function */ - target_lid, /* LID that we're routing to */ - is_real_lid, /* whether this target LID is real or dummy */ - is_main_path, /* whether this is path to HCA that should by tracked by counters */ - is_target_a_sw, /* Wheter target lid is a switch or not */ - reverse_hop_credit - 1, /* Remaining reverse_hops allowed */ - reverse_hops + 1, /* Number of reverse_hops done up to this point */ - current_hops - + - 1); - } - - } - return created_route; - } - - /* We should generate a list of port sorted by load so we can find easily the least - * going port and explore the other pots on secondary routes more easily (and quickly) */ - bubble_sort_down(p_sw->up_port_groups, p_sw->up_port_groups_num); - - p_min_group = p_sw->up_port_groups[0]; - /* Find the least loaded upgoing port in the selected group */ - p_min_port = NULL; - ports_num = (uint16_t) cl_ptr_vector_get_size(&p_min_group->ports); - for (j = 0; j < ports_num; j++) { - cl_ptr_vector_at(&p_min_group->ports, j, (void *)&p_port); - if (!p_min_port) { - /* first port that we're checking - use - it as a port with the lowest load */ - p_min_port = p_port; - } else if (p_port->counter_down < p_min_port->counter_down) { - /* this port is less loaded - use it as min */ - p_min_port = p_port; - } - } - - /* At this point we have selected a group and port with the - lowest load of downgoing routes. - Set on the remote switch how to get to the target_lid - - set LFT(target_lid) on the remote switch to the remote port */ - p_remote_sw = p_min_group->remote_hca_or_sw.p_sw; - - /* Four possible cases: - * - * 1. is_real_lid == TRUE && is_main_path == TRUE: - * - going UP(TRUE,TRUE) on selected min_group and min_port - * + promoting port counter - * + setting path in remote switch fwd tbl - * + setting hops in remote switch on all the ports of selected group - * - going UP(TRUE,FALSE) on rest of the groups, each time on port 0 - * + NOT promoting port counter - * + setting path in remote switch fwd tbl if it hasn't been set yet - * + setting hops in remote switch on all the ports of each group - * if it hasn't been set yet - * - * 2. is_real_lid == TRUE && is_main_path == FALSE: - * - going UP(TRUE,FALSE) on ALL the groups, each time on port 0, - * but only if the remote (upper) switch hasn't been already - * configured for this target LID - * + NOT promoting port counter - * + setting path in remote switch fwd tbl if it hasn't been set yet - * + setting hops in remote switch on all the ports of each group - * if it hasn't been set yet - * - * 3. is_real_lid == FALSE && is_main_path == TRUE: - * - going UP(FALSE,TRUE) ONLY on selected min_group and min_port - * + promoting port counter - * + NOT setting path in remote switch fwd tbl - * + NOT setting hops in remote switch - * - * 4. is_real_lid == FALSE && is_main_path == FALSE: - * - illegal state - we shouldn't get here - */ - - /* covering first half of case 1, and case 3 */ - if (is_main_path) { - if (p_sw->is_leaf) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - " - Routing MAIN path for %s CA LID %u: %s --> %s\n", - (is_real_lid) ? "real" : "DUMMY", - target_lid, - tuple_to_str(p_sw->tuple), - tuple_to_str(p_remote_sw->tuple)); - } - /* The number of downgoing routes is tracked in the - p_group->counter_down p_port->counter_down counters of the - group and port that belong to the lower side of the link - (on switch with higher rank) */ - p_min_group->counter_down++; - p_min_port->counter_down++; - if (p_min_group->counter_down == - (p_min_group->remote_hca_or_sw.p_sw->min_counter_down + - 1)) { - recalculate_min_counter_down - (p_min_group->remote_hca_or_sw.p_sw); - } - - if (is_real_lid) { - /* This LID may already be in the LFT in the reverse_hop feature is used */ - /* We update the LFT only if this LID isn't already present. */ - - /* skip if target lid has been already set on remote switch fwd tbl (with a bigger hop count) */ - if ((p_remote_sw->p_osm_sw->new_lft[target_lid] == - OSM_NO_PATH) - || - ((p_remote_sw->p_osm_sw->new_lft[target_lid] != - OSM_NO_PATH) - && - (current_hops + 1 < - sw_get_least_hops(p_remote_sw, target_lid)))) { - - p_remote_sw->p_osm_sw->new_lft[target_lid] = - p_min_port->remote_port_num; - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Switch %s: set path to CA LID %u through port %u\n", - tuple_to_str(p_remote_sw->tuple), - target_lid, - p_min_port->remote_port_num); - - /* On the remote switch that is pointed by the min_group, - set hops for ALL the ports in the remote group. */ - - set_hops_on_remote_sw(p_min_group, target_lid, - current_hops + 1, - is_target_a_sw); - - /* Recursion step: - Assign downgoing ports by stepping up, starting on REMOTE switch. */ - created_route |= fabric_route_downgoing_by_going_up(p_ftree, p_remote_sw, /* remote switch - used as a route-downgoing alg. next step point */ - p_sw, /* this switch - prev. position switch for the function */ - target_lid, /* LID that we're routing to */ - is_real_lid, /* whether this target LID is real or dummy */ - is_main_path, /* whether this is path to HCA that should by tracked by counters */ - is_target_a_sw, /* Wheter target lid is a switch or not */ - reverse_hop_credit, /* Remaining reverse_hops allowed */ - reverse_hops, /* Number of reverse_hops done up to this point */ - current_hops - + - 1); - } - } - } - /* we're done for the third case */ - if (!is_real_lid) - return created_route; - - /* What's left to do at this point: - * - * 1. is_real_lid == TRUE && is_main_path == TRUE: - * - going UP(TRUE,FALSE) on rest of the groups, each time on port 0, - * but only if the remote (upper) switch hasn't been already - * configured for this target LID - * + NOT promoting port counter - * + setting path in remote switch fwd tbl if it hasn't been set yet - * + setting hops in remote switch on all the ports of each group - * if it hasn't been set yet - * - * 2. is_real_lid == TRUE && is_main_path == FALSE: - * - going UP(TRUE,FALSE) on ALL the groups, each time on port 0, - * but only if the remote (upper) switch hasn't been already - * configured for this target LID - * + NOT promoting port counter - * + setting path in remote switch fwd tbl if it hasn't been set yet - * + setting hops in remote switch on all the ports of each group - * if it hasn't been set yet - * - * These two rules can be rephrased this way: - * - foreach UP port group - * + if remote switch has been set with the target LID - * - skip this port group - * + else - * - select port 0 - * - do NOT promote port counter - * - set path in remote switch fwd tbl - * - set hops in remote switch on all the ports of this group - * - go UP(TRUE,FALSE) to the remote switch - */ - - for (i = is_main_path ? 1 : 0; i < p_sw->up_port_groups_num; i++) { - p_group = p_sw->up_port_groups[i]; - p_remote_sw = p_group->remote_hca_or_sw.p_sw; - - /* skip if target lid has been already set on remote switch fwd tbl (with a bigger hop count) */ - if (p_remote_sw->p_osm_sw->new_lft[target_lid] != OSM_NO_PATH) - if (current_hops + 1 >= - sw_get_least_hops(p_remote_sw, target_lid)) - continue; - - if (p_sw->is_leaf) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - " - Routing SECONDARY path for LID %u: %s --> %s\n", - target_lid, - tuple_to_str(p_sw->tuple), - tuple_to_str(p_remote_sw->tuple)); - } - - /* Routing REAL lids on SECONDARY path means routing - switch-to-switch or switch-to-CA paths. - We can safely assume that switch will initiate very - few traffic, so there's no point waisting runtime on - trying to balance these routes - always pick port 0. */ - p_min_port = NULL; - ports_num = (uint16_t) cl_ptr_vector_get_size(&p_group->ports); - for (j = 0; j < ports_num; j++) { - cl_ptr_vector_at(&p_group->ports, j, (void *)&p_port); - if (!p_min_port) { - /* first port that we're checking - use - it as a port with the lowest load */ - p_min_port = p_port; - } else if (p_port->counter_down < - p_min_port->counter_down) { - /* this port is less loaded - use it as min */ - p_min_port = p_port; - } - } - - p_port = p_min_port; - p_remote_sw->p_osm_sw->new_lft[target_lid] = - p_port->remote_port_num; - - /* On the remote switch that is pointed by the p_group, - set hops for ALL the ports in the remote group. */ - - set_hops_on_remote_sw(p_group, target_lid, - current_hops + 1, is_target_a_sw); - - /* Recursion step: - Assign downgoing ports by stepping up, starting on REMOTE switch. */ - routed = fabric_route_downgoing_by_going_up(p_ftree, p_remote_sw, /* remote switch - used as a route-downgoing alg. next step point */ - p_sw, /* this switch - prev. position switch for the function */ - target_lid, /* LID that we're routing to */ - TRUE, /* whether the target LID is real or dummy */ - FALSE, /* whether this is path to HCA that should by tracked by counters */ - is_target_a_sw, /* Wheter target lid is a switch or not */ - reverse_hop_credit, /* Remaining reverse_hops allowed */ - reverse_hops, /* Number of reverse_hops done up to this point */ - current_hops + 1); - created_route |= routed; - } - - /* Now doing the same thing with horizontal links */ - if (p_sw->sibling_port_groups_num > 0) - bubble_sort_down(p_sw->sibling_port_groups, - p_sw->sibling_port_groups_num); - - for (i = 0; i < p_sw->sibling_port_groups_num; i++) { - p_group = p_sw->sibling_port_groups[i]; - p_remote_sw = p_group->remote_hca_or_sw.p_sw; - - /* skip if target lid has been already set on remote switch fwd tbl (with a bigger hop count) */ - if (p_remote_sw->p_osm_sw->new_lft[target_lid] != OSM_NO_PATH) - if (current_hops + 1 >= - sw_get_least_hops(p_remote_sw, target_lid)) - continue; - - if (p_sw->is_leaf) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - " - Routing SECONDARY path for LID %u: %s --> %s\n", - target_lid, - tuple_to_str(p_sw->tuple), - tuple_to_str(p_remote_sw->tuple)); - } - - /* Routing REAL lids on SECONDARY path means routing - switch-to-switch or switch-to-CA paths. - We can safely assume that switch will initiate very - few traffic, so there's no point waisting runtime on - trying to balance these routes - always pick port 0. */ - - p_min_port = NULL; - ports_num = (uint16_t) cl_ptr_vector_get_size(&p_group->ports); - for (j = 0; j < ports_num; j++) { - cl_ptr_vector_at(&p_group->ports, j, (void *)&p_port); - if (!p_min_port) { - /* first port that we're checking - use - it as a port with the lowest load */ - p_min_port = p_port; - } else if (p_port->counter_down < - p_min_port->counter_down) { - /* this port is less loaded - use it as min */ - p_min_port = p_port; - } - } - - p_port = p_min_port; - p_remote_sw->p_osm_sw->new_lft[target_lid] = - p_port->remote_port_num; - - /* On the remote switch that is pointed by the p_group, - set hops for ALL the ports in the remote group. */ - - set_hops_on_remote_sw(p_group, target_lid, - current_hops + 1, is_target_a_sw); - - /* Recursion step: - Assign downgoing ports by stepping up, starting on REMOTE switch. */ - routed = fabric_route_downgoing_by_going_up(p_ftree, p_remote_sw, /* remote switch - used as a route-downgoing alg. next step point */ - p_sw, /* this switch - prev. position switch for the function */ - target_lid, /* LID that we're routing to */ - TRUE, /* whether the target LID is real or dummy */ - FALSE, /* whether this is path to HCA that should by tracked by counters */ - is_target_a_sw, /* Wheter target lid is a switch or not */ - reverse_hop_credit, /* Remaining reverse_hops allowed */ - reverse_hops, /* Number of reverse_hops done up to this point */ - current_hops + 1); - created_route |= routed; - if (routed) { - p_min_group->counter_down++; - p_min_port->counter_down++; - } - } - - /* If we don't have any reverse hop credits, we are done */ - if (reverse_hop_credit == 0) - return created_route; - - if (p_sw->is_leaf) - return created_route; - - /* We explore all the down group ports */ - /* We try to reverse jump for each of them */ - /* They already have a route to us from the upgoing_by_going_down started earlier */ - /* This is only so it'll continue exploring up, after this step backwards */ - for (i = 0; i < p_sw->down_port_groups_num; i++) { - p_group = p_sw->down_port_groups[i]; - p_remote_sw = p_group->remote_hca_or_sw.p_sw; - - /* Skip this port group unless it points to a switch */ - if (p_group->remote_node_type != IB_NODE_TYPE_SWITCH) - continue; - - /* Recursion step: - Assign downgoing ports by stepping up, fter doing one step down starting on REMOTE switch. */ - created_route |= fabric_route_downgoing_by_going_up(p_ftree, p_remote_sw, /* remote switch - used as a route-downgoing alg. next step point */ - p_sw, /* this switch - prev. position switch for the function */ - target_lid, /* LID that we're routing to */ - TRUE, /* whether the target LID is real or dummy */ - TRUE, /* whether this is path to HCA that should by tracked by counters */ - is_target_a_sw, /* Wheter target lid is a switch or not */ - reverse_hop_credit - 1, /* Remaining reverse_hops allowed */ - reverse_hops + 1, /* Number of reverse_hops done up to this point */ - current_hops - + 1); - } - return created_route; - -} /* ftree_fabric_route_downgoing_by_going_up() */ - -/***************************************************/ - -/* - * Pseudo code: - * foreach leaf switch (in indexing order) - * for each compute node (in indexing order) - * obtain the LID of the compute node - * set local LFT(LID) of the port connecting to compute node - * call assign-down-going-port-by-ascending-up(TRUE,TRUE) on CURRENT switch - * for each MISSING compute node - * call assign-down-going-port-by-ascending-up(FALSE,TRUE) on CURRENT switch - */ - -static void fabric_route_to_cns(IN ftree_fabric_t * p_ftree) -{ - ftree_sw_t *p_sw; - ftree_hca_t *p_hca; - ftree_port_group_t *p_leaf_port_group; - ftree_port_group_t *p_hca_port_group; - ftree_port_t *p_port; - unsigned int i, j; - uint16_t hca_lid; - unsigned routed_targets_on_leaf; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - /* for each leaf switch (in indexing order) */ - for (i = 0; i < p_ftree->leaf_switches_num; i++) { - p_sw = p_ftree->leaf_switches[i]; - routed_targets_on_leaf = 0; - - /* for each HCA connected to this switch */ - for (j = 0; j < p_sw->down_port_groups_num; j++) { - p_leaf_port_group = p_sw->down_port_groups[j]; - - /* work with this port group only if the remote node is CA */ - if (p_leaf_port_group->remote_node_type != - IB_NODE_TYPE_CA) - continue; - - p_hca = p_leaf_port_group->remote_hca_or_sw.p_hca; - - /* work with this port group only if remote HCA has CNs */ - if (!p_hca->cn_num) - continue; - - p_hca_port_group = - hca_get_port_group_by_remote_lid(p_hca, - p_leaf_port_group-> - base_lid); - CL_ASSERT(p_hca_port_group); - - /* work with this port group only if remote port is CN */ - if (!p_hca_port_group->is_cn) - continue; - - /* obtain the LID of HCA port */ - hca_lid = p_leaf_port_group->remote_base_lid; - - /* set local LFT(LID) to the port that is connected to HCA */ - cl_ptr_vector_at(&p_leaf_port_group->ports, 0, - (void *)&p_port); - p_sw->p_osm_sw->new_lft[hca_lid] = p_port->port_num; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Switch %s: set path to CN LID %u through port %u\n", - tuple_to_str(p_sw->tuple), - hca_lid, p_port->port_num); - - /* set local min hop table(LID) to route to the CA */ - sw_set_hops(p_sw, hca_lid, p_port->port_num, 1, FALSE); - - /* Assign downgoing ports by stepping up. - Since we're routing here only CNs, we're routing it as REAL - LID and updating fat-tree balancing counters. */ - fabric_route_downgoing_by_going_up(p_ftree, p_sw, /* local switch - used as a route-downgoing alg. start point */ - NULL, /* prev. position switch */ - hca_lid, /* LID that we're routing to */ - TRUE, /* whether this HCA LID is real or dummy */ - TRUE, /* whether this path to HCA should by tracked by counters */ - FALSE, /* wheter target lid is a switch or not */ - 0, /* Number of reverse hops allowed */ - 0, /* Number of reverse hops done yet */ - 1); /* Number of hops done yet */ - - /* count how many real targets have been routed from this leaf switch */ - routed_targets_on_leaf++; - } - - /* We're done with the real targets (all CNs) of this leaf switch. - Now route the dummy HCAs that are missing or that are non-CNs. - When routing to dummy HCAs we don't fill lid matrices. */ - if (p_ftree->max_cn_per_leaf > routed_targets_on_leaf) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Routing %u dummy CAs\n", - p_ftree->max_cn_per_leaf - - p_sw->down_port_groups_num); - for (j = 0; j < - p_ftree->max_cn_per_leaf - routed_targets_on_leaf; - j++) { - /* assign downgoing ports by stepping up */ - fabric_route_downgoing_by_going_up(p_ftree, p_sw, /* local switch - used as a route-downgoing alg. start point */ - NULL, /* prev. position switch */ - 0, /* LID that we're routing to - ignored for dummy HCA */ - FALSE, /* whether this HCA LID is real or dummy */ - TRUE, /* whether this path to HCA should by tracked by counters */ - FALSE, /* Wheter the target LID is a switch or not */ - 0, /* Number of reverse hops allowed */ - 0, /* Number of reverse hops done yet */ - 1); /* Number of hops done yet */ - } - } - } - /* done going through all the leaf switches */ - OSM_LOG_EXIT(&p_ftree->p_osm->log); -} /* fabric_route_to_cns() */ - -/***************************************************/ - -/* - * Pseudo code: - * foreach HCA non-CN port in fabric - * obtain the LID of the HCA port - * get switch that is connected to this HCA port - * set switch LFT(LID) to the port connected to the HCA port - * call assign-down-going-port-by-ascending-up(TRUE,TRUE) on the switch - * - * Routing to these HCAs is routing a REAL hca lid on MAIN path. - * We want to allow load-leveling of the traffic to the non-CNs, - * because such nodes may include IO nodes with heavy usage - * - we should set fwd tables - * - we should update port counters - * Routing to non-CNs is done after routing to CNs, so updated port - * counters will not affect CN-to-CN routing. - */ - -static void fabric_route_to_non_cns(IN ftree_fabric_t * p_ftree) -{ - ftree_sw_t *p_sw; - ftree_hca_t *p_hca; - ftree_hca_t *p_next_hca; - ftree_port_t *p_hca_port; - ftree_port_group_t *p_hca_port_group; - uint16_t hca_lid; - unsigned port_num_on_switch; - unsigned i; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - p_next_hca = (ftree_hca_t *) cl_qmap_head(&p_ftree->hca_tbl); - while (p_next_hca != (ftree_hca_t *) cl_qmap_end(&p_ftree->hca_tbl)) { - p_hca = p_next_hca; - p_next_hca = (ftree_hca_t *) cl_qmap_next(&p_hca->map_item); - - for (i = 0; i < p_hca->up_port_groups_num; i++) { - p_hca_port_group = p_hca->up_port_groups[i]; - - /* skip this port if it's CN, in which case it has been already routed */ - if (p_hca_port_group->is_cn) - continue; - - /* skip this port if it is not connected to switch */ - if (p_hca_port_group->remote_node_type != - IB_NODE_TYPE_SWITCH) - continue; - - p_sw = p_hca_port_group->remote_hca_or_sw.p_sw; - hca_lid = p_hca_port_group->base_lid; - - /* set switches LFT(LID) to the port that is connected to HCA */ - cl_ptr_vector_at(&p_hca_port_group->ports, 0, - (void *)&p_hca_port); - port_num_on_switch = p_hca_port->remote_port_num; - p_sw->p_osm_sw->new_lft[hca_lid] = port_num_on_switch; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Switch %s: set path to non-CN HCA LID %u through port %u\n", - tuple_to_str(p_sw->tuple), - hca_lid, port_num_on_switch); - - /* set local min hop table(LID) to route to the CA */ - sw_set_hops(p_sw, hca_lid, port_num_on_switch, /* port num */ - 1, FALSE); /* hops */ - - /* Assign downgoing ports by stepping up. - We're routing REAL targets. They are not CNs and not included - in the leafs array, but we treat them as MAIN path to allow load - leveling, which means that the counters will be updated. */ - fabric_route_downgoing_by_going_up(p_ftree, p_sw, /* local switch - used as a route-downgoing alg. start point */ - NULL, /* prev. position switch */ - hca_lid, /* LID that we're routing to */ - TRUE, /* whether this HCA LID is real or dummy */ - TRUE, /* whether this path to HCA should by tracked by counters */ - FALSE, /* Wheter the target LID is a switch or not */ - p_hca_port_group->is_io ? p_ftree->p_osm->subn.opt.max_reverse_hops : 0, /* Number or reverse hops allowed */ - 0, /* Number or reverse hops done yet */ - 1); /* Number of hops done yet */ - } - /* done with all the port groups of this HCA - go to next HCA */ - } - - OSM_LOG_EXIT(&p_ftree->p_osm->log); -} /* fabric_route_to_non_cns() */ - -/***************************************************/ - -/* - * Pseudo code: - * foreach switch in fabric - * obtain its LID - * set local LFT(LID) to port 0 - * call assign-down-going-port-by-ascending-up(TRUE,FALSE) on CURRENT switch - * - * Routing to switch is similar to routing a REAL hca lid on SECONDARY path: - * - we should set fwd tables - * - we should NOT update port counters - */ - -static void fabric_route_to_switches(IN ftree_fabric_t * p_ftree) -{ - ftree_sw_t *p_sw; - ftree_sw_t *p_next_sw; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - p_next_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - while (p_next_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl)) { - p_sw = p_next_sw; - p_next_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item); - - /* set local LFT(LID) to 0 (route to itself) */ - p_sw->p_osm_sw->new_lft[p_sw->base_lid] = 0; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Switch %s (LID %u): routing switch-to-switch paths\n", - tuple_to_str(p_sw->tuple), p_sw->base_lid); - - /* set min hop table of the switch to itself */ - sw_set_hops(p_sw, p_sw->base_lid, 0, /* port_num */ - 0, TRUE); /* hops */ - - fabric_route_downgoing_by_going_up(p_ftree, p_sw, /* local switch - used as a route-downgoing alg. start point */ - NULL, /* prev. position switch */ - p_sw->base_lid, /* LID that we're routing to */ - TRUE, /* whether the target LID is a real or dummy */ - FALSE, /* whether this path to HCA should by tracked by counters */ - TRUE, /* Wheter the target LID is a switch or not */ - 0, /* Number of reverse hops allowed */ - 0, /* Number of reverse hops done yet */ - 0); /* Number of hops done yet */ - } - - OSM_LOG_EXIT(&p_ftree->p_osm->log); -} /* fabric_route_to_switches() */ - -/*************************************************** - ***************************************************/ - -static void fabric_route_roots(IN ftree_fabric_t * p_ftree) -{ - uint16_t lid; - uint8_t port_num; - osm_port_t *p_port; - ftree_sw_t *p_sw; - ftree_sw_t *p_leaf_sw; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - /* - * We need a switch that will accomodate all the down/up turns in - * the fabric. Having these turn in a single place in the fabric - * will not create credit loops. - * So we need to select this switch. - * The idea here is to chose leaf with the highest index. I don't - * have any theory to back me up on this. It's just a general thought - * that this way the switch that might be a bottleneck for many mcast - * groups will be far away from the OpenSM, so it will draw the - * multicast traffic away from the SM. - */ - - p_leaf_sw = p_ftree->leaf_switches[p_ftree->leaf_switches_num-1]; - - /* - * Now go over all the switches in the fabric that - * have lower rank, and route the missing LIDs to - * the selected leaf switch. - * In short, this leaf switch now poses a target - * for all those missing LIDs. - */ - - for (p_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - p_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl); - p_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item)) { - - if (p_sw->rank >= p_ftree->leaf_switch_rank) - continue; - - for (lid = 1; lid <= p_leaf_sw->p_osm_sw->max_lid_ho; lid ++) { - - if (p_sw->p_osm_sw->new_lft[lid] != OSM_NO_PATH || - p_leaf_sw->hops[lid] == OSM_NO_PATH) - continue; - - p_port = osm_get_port_by_lid_ho(&p_ftree->p_osm->subn, - lid); - - /* we're interested only in switches */ - if (!p_port || !p_port->p_node->sw) - continue; - - /* - * the missing LID will be routed through the same - * port that routes to the selected leaf switch - */ - port_num = p_sw->p_osm_sw->new_lft[p_leaf_sw->base_lid]; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Switch %s: setting path to LID %u " - "through port %u\n", - tuple_to_str(p_sw->tuple), lid, port_num); - - /* set local lft */ - p_sw->p_osm_sw->new_lft[lid] = port_num; - - /* - * Set local min hop table. - * The distance to the target LID is a distance - * to the selected leaf switch plus the distance - * from the leaf to the target LID. - */ - sw_set_hops(p_sw, lid, port_num, - p_sw->hops[p_leaf_sw->base_lid] + - p_leaf_sw->hops[lid], TRUE); - } - } - - OSM_LOG_EXIT(&p_ftree->p_osm->log); -} /* fabric_route_roots() */ - -/***************************************************/ - -static int fabric_populate_nodes(IN ftree_fabric_t * p_ftree) -{ - osm_node_t *p_osm_node; - osm_node_t *p_next_osm_node; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - p_next_osm_node = - (osm_node_t *) cl_qmap_head(&p_ftree->p_osm->subn.node_guid_tbl); - while (p_next_osm_node != - (osm_node_t *) cl_qmap_end(&p_ftree->p_osm-> - subn.node_guid_tbl)) { - p_osm_node = p_next_osm_node; - p_next_osm_node = - (osm_node_t *) cl_qmap_next(&p_osm_node->map_item); - switch (osm_node_get_type(p_osm_node)) { - case IB_NODE_TYPE_CA: - fabric_add_hca(p_ftree, p_osm_node); - break; - case IB_NODE_TYPE_ROUTER: - break; - case IB_NODE_TYPE_SWITCH: - fabric_add_sw(p_ftree, p_osm_node->sw); - break; - default: - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB0E: " "Node GUID 0x%016" PRIx64 - " - Unknown node type: %s\n", - cl_ntoh64(osm_node_get_node_guid(p_osm_node)), - ib_get_node_type_str(osm_node_get_type - (p_osm_node))); - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return -1; - } - } - - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return 0; -} /* fabric_populate_nodes() */ - -/*************************************************** - ***************************************************/ - -static boolean_t sw_update_rank(IN ftree_sw_t * p_sw, IN uint32_t new_rank) -{ - if (sw_ranked(p_sw) && p_sw->rank <= new_rank) - return FALSE; - p_sw->rank = new_rank; - return TRUE; - -} - -/***************************************************/ - -static void rank_switches_from_leafs(IN ftree_fabric_t * p_ftree, - IN cl_list_t * p_ranking_bfs_list) -{ - ftree_sw_t *p_sw; - ftree_sw_t *p_remote_sw; - osm_node_t *p_node; - osm_node_t *p_remote_node; - osm_physp_t *p_osm_port; - uint8_t i; - unsigned max_rank = 0; - - while (!cl_is_list_empty(p_ranking_bfs_list)) { - p_sw = (ftree_sw_t *) cl_list_remove_head(p_ranking_bfs_list); - p_node = p_sw->p_osm_sw->p_node; - - /* note: skipping port 0 on switches */ - for (i = 1; i < osm_node_get_num_physp(p_node); i++) { - p_osm_port = osm_node_get_physp_ptr(p_node, i); - if (!p_osm_port || !osm_link_is_healthy(p_osm_port)) - continue; - - p_remote_node = - osm_node_get_remote_node(p_node, i, NULL); - if (!p_remote_node) - continue; - if (osm_node_get_type(p_remote_node) != - IB_NODE_TYPE_SWITCH) - continue; - - p_remote_sw = fabric_get_sw_by_guid(p_ftree, - osm_node_get_node_guid - (p_remote_node)); - if (!p_remote_sw) { - /* remote node is not a switch */ - continue; - } - - /* if needed, rank the remote switch and add it to the BFS list */ - if (sw_update_rank(p_remote_sw, p_sw->rank + 1)) { - max_rank = p_remote_sw->rank; - cl_list_insert_tail(p_ranking_bfs_list, - p_remote_sw); - } - } - } - - /* set FatTree maximal switch rank */ - p_ftree->max_switch_rank = max_rank; - -} /* rank_switches_from_leafs() */ - -/***************************************************/ - -static int rank_leaf_switches(IN ftree_fabric_t * p_ftree, - IN ftree_hca_t * p_hca, - IN cl_list_t * p_ranking_bfs_list) -{ - ftree_sw_t *p_sw; - osm_node_t *p_osm_node = p_hca->p_osm_node; - osm_node_t *p_remote_osm_node; - osm_physp_t *p_osm_port; - static uint8_t i = 0; - int res = 0; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - for (i = 0; i < osm_node_get_num_physp(p_osm_node); i++) { - p_osm_port = osm_node_get_physp_ptr(p_osm_node, i); - if (!p_osm_port || !osm_link_is_healthy(p_osm_port)) - continue; - - p_remote_osm_node = - osm_node_get_remote_node(p_osm_node, i, NULL); - if (!p_remote_osm_node) - continue; - - switch (osm_node_get_type(p_remote_osm_node)) { - case IB_NODE_TYPE_CA: - /* HCA connected directly to another HCA - not FatTree */ - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB0F: " - "CA conected directly to another CA: " "0x%016" - PRIx64 " <---> 0x%016" PRIx64 "\n", - hca_get_guid_ho(p_hca), - cl_ntoh64(osm_node_get_node_guid - (p_remote_osm_node))); - res = -1; - goto Exit; - - case IB_NODE_TYPE_ROUTER: - /* leaving this port - proceeding to the next one */ - continue; - - case IB_NODE_TYPE_SWITCH: - /* continue with this port */ - break; - - default: - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB10: Node GUID 0x%016" PRIx64 - " - Unknown node type: %s\n", - cl_ntoh64(osm_node_get_node_guid - (p_remote_osm_node)), - ib_get_node_type_str(osm_node_get_type - (p_remote_osm_node))); - res = -1; - goto Exit; - } - - /* remote node is switch */ - - p_sw = fabric_get_sw_by_guid(p_ftree, - osm_node_get_node_guid - (p_osm_port->p_remote_physp-> - p_node)); - CL_ASSERT(p_sw); - - /* if needed, rank the remote switch and add it to the BFS list */ - - if (!sw_update_rank(p_sw, 0)) - continue; - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Marking rank of switch that is directly connected to CA:\n" - " - CA guid : 0x%016" - PRIx64 "\n" - " - Switch guid: 0x%016" - PRIx64 "\n" - " - Switch LID : %u\n", - hca_get_guid_ho(p_hca), - sw_get_guid_ho(p_sw), p_sw->base_lid); - cl_list_insert_tail(p_ranking_bfs_list, p_sw); - } - -Exit: - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return res; -} /* rank_leaf_switches() */ - -/***************************************************/ - -static void sw_reverse_rank(IN cl_map_item_t * const p_map_item, - IN void *context) -{ - ftree_fabric_t *p_ftree = (ftree_fabric_t *) context; - ftree_sw_t *p_sw = (ftree_sw_t * const)p_map_item; - p_sw->rank = p_ftree->max_switch_rank - p_sw->rank; -} - -/*************************************************** - ***************************************************/ - -static int -fabric_construct_hca_ports(IN ftree_fabric_t * p_ftree, IN ftree_hca_t * p_hca) -{ - ftree_sw_t *p_remote_sw; - osm_node_t *p_node = p_hca->p_osm_node; - osm_node_t *p_remote_node; - uint8_t remote_node_type; - ib_net64_t remote_node_guid; - osm_physp_t *p_remote_osm_port; - uint8_t i; - uint8_t remote_port_num; - boolean_t is_cn = FALSE; - boolean_t is_io = FALSE; - int res = 0; - - for (i = 0; i < osm_node_get_num_physp(p_node); i++) { - osm_physp_t *p_osm_port = osm_node_get_physp_ptr(p_node, i); - if (!p_osm_port || !osm_link_is_healthy(p_osm_port)) - continue; - - p_remote_osm_port = osm_physp_get_remote(p_osm_port); - p_remote_node = - osm_node_get_remote_node(p_node, i, &remote_port_num); - - if (!p_remote_osm_port) - continue; - - remote_node_type = osm_node_get_type(p_remote_node); - remote_node_guid = osm_node_get_node_guid(p_remote_node); - - switch (remote_node_type) { - case IB_NODE_TYPE_ROUTER: - /* leaving this port - proceeding to the next one */ - continue; - - case IB_NODE_TYPE_CA: - /* HCA connected directly to another HCA - not FatTree */ - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB11: " - "CA conected directly to another CA: " "0x%016" - PRIx64 " <---> 0x%016" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node)), - cl_ntoh64(remote_node_guid)); - res = -1; - goto Exit; - - case IB_NODE_TYPE_SWITCH: - /* continue with this port */ - break; - - default: - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB12: Node GUID 0x%016" PRIx64 - " - Unknown node type: %s\n", - cl_ntoh64(remote_node_guid), - ib_get_node_type_str(remote_node_type)); - res = -1; - goto Exit; - } - - /* remote node is switch */ - - p_remote_sw = fabric_get_sw_by_guid(p_ftree, remote_node_guid); - CL_ASSERT(p_remote_sw); - - /* If CN file is not supplied, then all the CAs considered as Compute Nodes. - Otherwise all the CAs are not CNs, and only guids that are present in the - CN file will be marked as compute nodes. */ - if (!fabric_cns_provided(p_ftree)) { - is_cn = TRUE; - } else { - name_map_item_t *p_elem = (name_map_item_t *) - cl_qmap_get(&p_ftree->cn_guid_tbl, - cl_ntoh64(osm_physp_get_port_guid - (p_osm_port))); - if (p_elem != (name_map_item_t *) - cl_qmap_end(&p_ftree->cn_guid_tbl)) - is_cn = TRUE; - } - - if (is_cn) { - p_ftree->cn_num++; - p_hca->cn_num++; - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Marking CN port GUID 0x%016" PRIx64 "\n", - cl_ntoh64(osm_physp_get_port_guid(p_osm_port))); - } else { - if (fabric_ios_provided(p_ftree)) { - name_map_item_t *p_elem = (name_map_item_t *) - cl_qmap_get(&p_ftree->io_guid_tbl, - cl_ntoh64 - (osm_physp_get_port_guid - (p_osm_port))); - if (p_elem != (name_map_item_t *) - cl_qmap_end(&p_ftree->io_guid_tbl)) - is_io = TRUE; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Marking I/O port GUID 0x%016" PRIx64 - "\n", - cl_ntoh64(osm_physp_get_port_guid - (p_osm_port))); - - } else { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Marking non-CN port GUID 0x%016" PRIx64 - "\n", - cl_ntoh64(osm_physp_get_port_guid - (p_osm_port))); - } - } - p_ftree->ca_ports++; - - hca_add_port(p_hca, /* local ftree_hca object */ - i, /* local port number */ - remote_port_num, /* remote port number */ - cl_ntoh16(osm_node_get_base_lid(p_node, i)), /* local lid */ - cl_ntoh16(osm_node_get_base_lid(p_remote_node, 0)), /* remote lid */ - osm_physp_get_port_guid(p_osm_port), /* local port guid */ - osm_physp_get_port_guid(p_remote_osm_port), /* remote port guid */ - remote_node_guid, /* remote node guid */ - remote_node_type, /* remote node type */ - (void *)p_remote_sw, /* remote ftree_hca/sw object */ - is_cn, is_io); /* whether this port is compute node */ - } - -Exit: - return res; -} /* fabric_construct_hca_ports() */ - -/*************************************************** - ***************************************************/ - -static int fabric_construct_sw_ports(IN ftree_fabric_t * p_ftree, - IN ftree_sw_t * p_sw) -{ - ftree_hca_t *p_remote_hca; - ftree_sw_t *p_remote_sw; - osm_node_t *p_node = p_sw->p_osm_sw->p_node; - osm_node_t *p_remote_node; - uint16_t remote_base_lid; - uint8_t remote_node_type; - ib_net64_t remote_node_guid; - osm_physp_t *p_remote_osm_port; - ftree_direction_t direction; - void *p_remote_hca_or_sw; - uint8_t i; - uint8_t remote_port_num; - int res = 0; - - CL_ASSERT(osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH); - - for (i = 1; i < osm_node_get_num_physp(p_node); i++) { - osm_physp_t *p_osm_port = osm_node_get_physp_ptr(p_node, i); - if (!p_osm_port || !osm_link_is_healthy(p_osm_port)) - continue; - - p_remote_osm_port = osm_physp_get_remote(p_osm_port); - if (!p_remote_osm_port) - continue; - - p_remote_node = - osm_node_get_remote_node(p_node, i, &remote_port_num); - - /* ignore any loopback connection on switch */ - if (p_node == p_remote_node) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Ignoring loopback on switch GUID 0x%016" PRIx64 - ", LID %u, rank %u\n", - sw_get_guid_ho(p_sw), - p_sw->base_lid, p_sw->rank); - continue; - } - - remote_node_type = osm_node_get_type(p_remote_node); - remote_node_guid = osm_node_get_node_guid(p_remote_node); - - switch (remote_node_type) { - case IB_NODE_TYPE_ROUTER: - /* leaving this port - proceeding to the next one */ - continue; - - case IB_NODE_TYPE_CA: - /* switch connected to hca */ - - p_remote_hca = - fabric_get_hca_by_guid(p_ftree, remote_node_guid); - CL_ASSERT(p_remote_hca); - - p_remote_hca_or_sw = (void *)p_remote_hca; - direction = FTREE_DIRECTION_DOWN; - - remote_base_lid = - cl_ntoh16(osm_physp_get_base_lid - (p_remote_osm_port)); - break; - - case IB_NODE_TYPE_SWITCH: - /* switch connected to another switch */ - - p_remote_sw = - fabric_get_sw_by_guid(p_ftree, remote_node_guid); - CL_ASSERT(p_remote_sw); - - p_remote_hca_or_sw = (void *)p_remote_sw; - - if (p_sw->rank > p_remote_sw->rank) { - direction = FTREE_DIRECTION_UP; - } else if (p_sw->rank == p_remote_sw->rank) { - direction = FTREE_DIRECTION_SAME; - } else - direction = FTREE_DIRECTION_DOWN; - - /* switch LID is only in port 0 port_info structure */ - remote_base_lid = - cl_ntoh16(osm_node_get_base_lid(p_remote_node, 0)); - - break; - - default: - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB13: Node GUID 0x%016" PRIx64 - " - Unknown node type: %s\n", - cl_ntoh64(remote_node_guid), - ib_get_node_type_str(remote_node_type)); - res = -1; - goto Exit; - } - sw_add_port(p_sw, /* local ftree_sw object */ - i, /* local port number */ - remote_port_num, /* remote port number */ - p_sw->base_lid, /* local lid */ - remote_base_lid, /* remote lid */ - osm_physp_get_port_guid(p_osm_port), /* local port guid */ - osm_physp_get_port_guid(p_remote_osm_port), /* remote port guid */ - remote_node_guid, /* remote node guid */ - remote_node_type, /* remote node type */ - p_remote_hca_or_sw, /* remote ftree_hca/sw object */ - direction); /* port direction (up or down) */ - - /* Track the max lid (in host order) that exists in the fabric */ - if (remote_base_lid > p_ftree->lft_max_lid) - p_ftree->lft_max_lid = remote_base_lid; - } - -Exit: - return res; -} /* fabric_construct_sw_ports() */ - -/*************************************************** - ***************************************************/ -struct rank_root_cxt { - ftree_fabric_t *fabric; - cl_list_t *list; -}; - -static int rank_root_sw_by_guid(void *cxt, uint64_t guid, char *p) -{ - struct rank_root_cxt *c = cxt; - ftree_sw_t *sw; - - sw = fabric_get_sw_by_guid(c->fabric, cl_hton64(guid)); - if (!sw) { - /* the specified root guid wasn't found in the fabric */ - OSM_LOG(&c->fabric->p_osm->log, OSM_LOG_ERROR, "ERR AB24: " - "Root switch GUID 0x%" PRIx64 " not found\n", guid); - return 0; - } - - OSM_LOG(&c->fabric->p_osm->log, OSM_LOG_DEBUG, - "Ranking root switch with GUID 0x%" PRIx64 "\n", guid); - sw->rank = 0; - cl_list_insert_tail(c->list, sw); - - return 0; -} - -static int fabric_rank_from_roots(IN ftree_fabric_t * p_ftree) -{ - struct rank_root_cxt context; - osm_node_t *p_osm_node; - osm_node_t *p_remote_osm_node; - osm_physp_t *p_osm_physp; - ftree_sw_t *p_sw; - ftree_sw_t *p_remote_sw; - cl_list_t ranking_bfs_list; - int res = 0; - unsigned num_roots; - unsigned max_rank = 0; - unsigned i; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - cl_list_init(&ranking_bfs_list, 10); - - /* Rank all the roots and add them to list */ - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Fetching root nodes from file %s\n", - p_ftree->p_osm->subn.opt.root_guid_file); - - context.fabric = p_ftree; - context.list = &ranking_bfs_list; - if (parse_node_map(p_ftree->p_osm->subn.opt.root_guid_file, - rank_root_sw_by_guid, &context)) { - res = -1; - goto Exit; - } - - num_roots = cl_list_count(&ranking_bfs_list); - if (!num_roots) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, "ERR AB25: " - "No valid roots supplied\n"); - res = -1; - goto Exit; - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Ranked %u valid root switches\n", num_roots); - - /* Now the list has all the roots. - BFS the subnet and update rank on all the switches. */ - - while (!cl_is_list_empty(&ranking_bfs_list)) { - p_sw = (ftree_sw_t *) cl_list_remove_head(&ranking_bfs_list); - p_osm_node = p_sw->p_osm_sw->p_node; - - /* note: skipping port 0 on switches */ - for (i = 1; i < osm_node_get_num_physp(p_osm_node); i++) { - p_osm_physp = osm_node_get_physp_ptr(p_osm_node, i); - if (!p_osm_physp || !osm_link_is_healthy(p_osm_physp)) - continue; - - p_remote_osm_node = - osm_node_get_remote_node(p_osm_node, i, NULL); - if (!p_remote_osm_node) - continue; - - if (osm_node_get_type(p_remote_osm_node) != - IB_NODE_TYPE_SWITCH) - continue; - - p_remote_sw = fabric_get_sw_by_guid(p_ftree, - osm_node_get_node_guid - (p_remote_osm_node)); - CL_ASSERT(p_remote_sw); - - /* if needed, rank the remote switch and add it to the BFS list */ - if (sw_update_rank(p_remote_sw, p_sw->rank + 1)) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Ranking switch 0x%" PRIx64 - " with rank %u\n", - sw_get_guid_ho(p_remote_sw), - p_remote_sw->rank); - max_rank = p_remote_sw->rank; - cl_list_insert_tail(&ranking_bfs_list, - p_remote_sw); - } - } - /* done with ports of this switch - go to the next switch in the list */ - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Subnet ranking completed. Max Node Rank = %u\n", max_rank); - - /* set FatTree maximal switch rank */ - p_ftree->max_switch_rank = max_rank; - -Exit: - cl_list_destroy(&ranking_bfs_list); - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return res; -} /* fabric_rank_from_roots() */ - -/*************************************************** - ***************************************************/ - -static int fabric_rank_from_hcas(IN ftree_fabric_t * p_ftree) -{ - ftree_hca_t *p_hca; - ftree_hca_t *p_next_hca; - cl_list_t ranking_bfs_list; - int res = 0; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - cl_list_init(&ranking_bfs_list, 10); - - /* Mark REVERSED rank of all the switches in the subnet. - Start from switches that are connected to hca's, and - scan all the switches in the subnet. */ - p_next_hca = (ftree_hca_t *) cl_qmap_head(&p_ftree->hca_tbl); - while (p_next_hca != (ftree_hca_t *) cl_qmap_end(&p_ftree->hca_tbl)) { - p_hca = p_next_hca; - p_next_hca = (ftree_hca_t *) cl_qmap_next(&p_hca->map_item); - if (rank_leaf_switches(p_ftree, p_hca, &ranking_bfs_list) != 0) { - res = -1; - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB14: " - "Subnet ranking failed - subnet is not FatTree"); - goto Exit; - } - } - - /* Now rank rest of the switches in the fabric, while the - list already contains all the ranked leaf switches */ - rank_switches_from_leafs(p_ftree, &ranking_bfs_list); - - /* fix ranking of the switches by reversing the ranking direction */ - cl_qmap_apply_func(&p_ftree->sw_tbl, sw_reverse_rank, (void *)p_ftree); - -Exit: - cl_list_destroy(&ranking_bfs_list); - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return res; -} /* fabric_rank_from_hcas() */ - -/*************************************************** - ***************************************************/ - -static int fabric_rank(IN ftree_fabric_t * p_ftree) -{ - int res = 0; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - if (fabric_roots_provided(p_ftree)) - res = fabric_rank_from_roots(p_ftree); - else - res = fabric_rank_from_hcas(p_ftree); - - if (res) - goto Exit; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "FatTree max switch rank is %u\n", p_ftree->max_switch_rank); - -Exit: - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return res; -} /* fabric_rank() */ - -/*************************************************** - ***************************************************/ - -static void fabric_set_leaf_rank(IN ftree_fabric_t * p_ftree) -{ - unsigned i; - ftree_sw_t *p_sw; - ftree_hca_t *p_hca = NULL; - ftree_hca_t *p_next_hca; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - if (!fabric_roots_provided(p_ftree)) { - /* If root file is not provided, the fabric has to be pure fat-tree - in terms of ranking. Thus, leaf switches rank is the max rank. */ - p_ftree->leaf_switch_rank = p_ftree->max_switch_rank; - } else { - /* Find the first CN and set the leaf_switch_rank to the rank - of the switch that is connected to this CN. Later we will - ensure that all the leaf switches have the same rank. */ - p_next_hca = (ftree_hca_t *) cl_qmap_head(&p_ftree->hca_tbl); - while (p_next_hca != - (ftree_hca_t *) cl_qmap_end(&p_ftree->hca_tbl)) { - p_hca = p_next_hca; - if (p_hca->cn_num) - break; - p_next_hca = - (ftree_hca_t *) cl_qmap_next(&p_hca->map_item); - } - /* we know that there are CNs in the fabric, so just to be sure... */ - CL_ASSERT(p_next_hca != - (ftree_hca_t *) cl_qmap_end(&p_ftree->hca_tbl)); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Selected CN port GUID 0x%" PRIx64 "\n", - hca_get_guid_ho(p_hca)); - - for (i = 0; (i < p_hca->up_port_groups_num) - && (!p_hca->up_port_groups[i]->is_cn); i++) ; - CL_ASSERT(i < p_hca->up_port_groups_num); - CL_ASSERT(p_hca->up_port_groups[i]->remote_node_type == - IB_NODE_TYPE_SWITCH); - - p_sw = p_hca->up_port_groups[i]->remote_hca_or_sw.p_sw; - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Selected leaf switch GUID 0x%" PRIx64 ", rank %u\n", - sw_get_guid_ho(p_sw), p_sw->rank); - p_ftree->leaf_switch_rank = p_sw->rank; - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "FatTree leaf switch rank is %u\n", p_ftree->leaf_switch_rank); - OSM_LOG_EXIT(&p_ftree->p_osm->log); -} /* fabric_set_leaf_rank() */ - -/*************************************************** - ***************************************************/ - -static int fabric_populate_ports(IN ftree_fabric_t * p_ftree) -{ - ftree_hca_t *p_hca; - ftree_hca_t *p_next_hca; - ftree_sw_t *p_sw; - ftree_sw_t *p_next_sw; - int res = 0; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - p_next_hca = (ftree_hca_t *) cl_qmap_head(&p_ftree->hca_tbl); - while (p_next_hca != (ftree_hca_t *) cl_qmap_end(&p_ftree->hca_tbl)) { - p_hca = p_next_hca; - p_next_hca = (ftree_hca_t *) cl_qmap_next(&p_hca->map_item); - if (fabric_construct_hca_ports(p_ftree, p_hca) != 0) { - res = -1; - goto Exit; - } - } - - p_next_sw = (ftree_sw_t *) cl_qmap_head(&p_ftree->sw_tbl); - while (p_next_sw != (ftree_sw_t *) cl_qmap_end(&p_ftree->sw_tbl)) { - p_sw = p_next_sw; - p_next_sw = (ftree_sw_t *) cl_qmap_next(&p_sw->map_item); - if (fabric_construct_sw_ports(p_ftree, p_sw) != 0) { - res = -1; - goto Exit; - } - } -Exit: - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return res; -} /* fabric_populate_ports() */ - -/*************************************************** - ***************************************************/ -static int add_guid_item_to_map(void *cxt, uint64_t guid, char *p) -{ - cl_qmap_t *map = cxt; - name_map_item_t *item; - - item = malloc(sizeof(*item)); - if (!item) - return -1; - - item->guid = guid; - cl_qmap_insert(map, guid, &item->item); - - return 0; -} - -static int fabric_read_guid_files(IN ftree_fabric_t * p_ftree) -{ - int status = 0; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - if (fabric_cns_provided(p_ftree)) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Fetching compute nodes from file %s\n", - p_ftree->p_osm->subn.opt.cn_guid_file); - - if (parse_node_map(p_ftree->p_osm->subn.opt.cn_guid_file, - add_guid_item_to_map, - &p_ftree->cn_guid_tbl)) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB23: " "Problem parsing CN guid file\n"); - status = -1; - goto Exit; - } - - if (!cl_qmap_count(&p_ftree->cn_guid_tbl)) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB27: " - "Compute node guids file has no valid guids\n"); - status = -1; - goto Exit; - } - } - - if (fabric_ios_provided(p_ftree)) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_DEBUG, - "Fetching I/O nodes from file %s\n", - p_ftree->p_osm->subn.opt.io_guid_file); - - if (parse_node_map(p_ftree->p_osm->subn.opt.io_guid_file, - add_guid_item_to_map, - &p_ftree->io_guid_tbl)) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB28: Problem parsing I/O guid file\n"); - status = -1; - goto Exit; - } - - if (!cl_qmap_count(&p_ftree->io_guid_tbl)) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_ERROR, - "ERR AB29: " - "I/O node guids file has no valid guids\n"); - status = -1; - goto Exit; - } - } -Exit: - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return status; -} /*fabric_read_guid_files() */ - -/*************************************************** - ***************************************************/ - -static int construct_fabric(IN void *context) -{ - ftree_fabric_t *p_ftree = context; - int status = 0; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - fabric_clear(p_ftree); - - if (p_ftree->p_osm->subn.opt.lmc > 0) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "LMC > 0 is not supported by fat-tree routing.\n" - "Falling back to default routing\n"); - status = -1; - goto Exit; - } - - if (cl_qmap_count(&p_ftree->p_osm->subn.sw_guid_tbl) < 2) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric has %u switches - topology is not fat-tree.\n" - "Falling back to default routing\n", - cl_qmap_count(&p_ftree->p_osm->subn.sw_guid_tbl)); - status = -1; - goto Exit; - } - - if ((cl_qmap_count(&p_ftree->p_osm->subn.node_guid_tbl) - - cl_qmap_count(&p_ftree->p_osm->subn.sw_guid_tbl)) < 2) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric has %u nodes (%u switches) - topology is not fat-tree.\n" - "Falling back to default routing\n", - cl_qmap_count(&p_ftree->p_osm->subn.node_guid_tbl), - cl_qmap_count(&p_ftree->p_osm->subn.sw_guid_tbl)); - status = -1; - goto Exit; - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, "\n" - " |----------------------------------------|\n" - " |- Starting FatTree fabric construction -|\n" - " |----------------------------------------|\n\n"); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Populating FatTree Switch and CA tables\n"); - if (fabric_populate_nodes(p_ftree) != 0) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric topology is not fat-tree - " - "falling back to default routing\n"); - status = -1; - goto Exit; - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Reading guid files provided by user\n"); - if (fabric_read_guid_files(p_ftree) != 0) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Failed reading guid files - " - "falling back to default routing\n"); - status = -1; - goto Exit; - } - - if (cl_qmap_count(&p_ftree->hca_tbl) < 2) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric has %u CAs - topology is not fat-tree.\n" - "Falling back to default routing\n", - cl_qmap_count(&p_ftree->hca_tbl)); - status = -1; - goto Exit; - } - - /* Rank all the switches in the fabric. - After that we will know only fabric max switch rank. - We will be able to check leaf switches rank and the - whole tree rank after filling ports and marking CNs. */ - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, "Ranking FatTree\n"); - if (fabric_rank(p_ftree) != 0) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Failed ranking the tree\n"); - status = -1; - goto Exit; - } - - /* For each hca and switch, construct array of ports. - This is done after the whole FatTree data structure is ready, - because we want the ports to have pointers to ftree_{sw,hca}_t - objects, and we need the switches to be already ranked because - that's how the port direction is determined. */ - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Populating CA & switch ports\n"); - if (fabric_populate_ports(p_ftree) != 0) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric topology is not a fat-tree\n"); - status = -1; - goto Exit; - } else if (p_ftree->cn_num == 0) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric has no valid compute nodes\n"); - status = -1; - goto Exit; - } - - /* Now that the CA ports have been created and CNs were marked, - we can complete the fabric ranking - set leaf switches rank. */ - fabric_set_leaf_rank(p_ftree); - - if (fabric_get_rank(p_ftree) > FAT_TREE_MAX_RANK || - fabric_get_rank(p_ftree) < FAT_TREE_MIN_RANK) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric rank is %u (should be between %u and %u)\n", - fabric_get_rank(p_ftree), FAT_TREE_MIN_RANK, - FAT_TREE_MAX_RANK); - status = -1; - goto Exit; - } - - /* Mark all the switches in the fabric with rank equal to - p_ftree->leaf_switch_rank and that are also connected to CNs. - As a by-product, this function also runs basic topology - validation - it checks that all the CNs are at the same rank. */ - if (fabric_mark_leaf_switches(p_ftree)) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric topology is not a fat-tree\n"); - status = -1; - goto Exit; - } - - /* Assign index to all the switches in the fabric. - This function also sorts leaf switch array by the switch index, - sorts all the port arrays of the indexed switches by remote - switch index, and creates switch-by-tuple table (sw_by_tuple_tbl) */ - fabric_make_indexing(p_ftree); - - /* Create leaf switch array sorted by index. - This array contains switches with rank equal to p_ftree->leaf_switch_rank - and that are also connected to CNs (REAL leafs), and it may contain - switches at the same leaf rank w/o CNs, if this is the order of indexing. - In any case, the first and the last switches in the array are REAL leafs. */ - if (fabric_create_leaf_switch_array(p_ftree)) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric topology is not a fat-tree\n"); - status = -1; - goto Exit; - } - - /* calculate and set ftree.max_cn_per_leaf field */ - fabric_set_max_cn_per_leaf(p_ftree); - - /* print general info about fabric topology */ - fabric_dump_general_info(p_ftree); - - /* dump full tree topology */ - if (osm_log_is_active(&p_ftree->p_osm->log, OSM_LOG_DEBUG)) - fabric_dump(p_ftree); - - /* the fabric is required to be PURE fat-tree only if the root - guid file hasn't been provided by user */ - if (!fabric_roots_provided(p_ftree) && - !fabric_validate_topology(p_ftree)) { - osm_log(&p_ftree->p_osm->log, OSM_LOG_INFO, - "Fabric topology is not a fat-tree\n"); - status = -1; - goto Exit; - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Max LID in switch LFTs: %u\n", p_ftree->lft_max_lid); - -Exit: - if (status != 0) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Clearing FatTree Fabric data structures\n"); - fabric_clear(p_ftree); - } else - p_ftree->fabric_built = TRUE; - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, "\n" - " |--------------------------------------------------|\n" - " |- Done constructing FatTree fabric (status = %d) -|\n" - " |--------------------------------------------------|\n\n", - status); - - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return status; -} /* construct_fabric() */ - -/*************************************************** - ***************************************************/ - -static int do_routing(IN void *context) -{ - ftree_fabric_t *p_ftree = context; - int status = 0; - - OSM_LOG_ENTER(&p_ftree->p_osm->log); - - if (!p_ftree->fabric_built) { - status = -1; - goto Exit; - } - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Starting FatTree routing\n"); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Filling switch forwarding tables for Compute Nodes\n"); - fabric_route_to_cns(p_ftree); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Filling switch forwarding tables for non-CN targets\n"); - fabric_route_to_non_cns(p_ftree); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Filling switch forwarding tables for switch-to-switch paths\n"); - fabric_route_to_switches(p_ftree); - - if (p_ftree->p_osm->subn.opt.connect_roots) { - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "Connecting switches that are unreachable within " - "Up/Down rules\n"); - fabric_route_roots(p_ftree); - } - - /* for each switch, set its fwd table */ - cl_qmap_apply_func(&p_ftree->sw_tbl, set_sw_fwd_table, (void *)p_ftree); - - /* write out hca ordering file */ - fabric_dump_hca_ordering(p_ftree); - - OSM_LOG(&p_ftree->p_osm->log, OSM_LOG_VERBOSE, - "FatTree routing is done\n"); - -Exit: - OSM_LOG_EXIT(&p_ftree->p_osm->log); - return status; -} - -/*************************************************** - ***************************************************/ - -static void delete(IN void *context) -{ - if (!context) - return; - fabric_destroy((ftree_fabric_t *) context); -} - -/*************************************************** - ***************************************************/ - -int osm_ucast_ftree_setup(struct osm_routing_engine *r, osm_opensm_t * p_osm) -{ - ftree_fabric_t *p_ftree = fabric_create(); - if (!p_ftree) - return -1; - - p_ftree->p_osm = p_osm; - - r->context = (void *)p_ftree; - r->build_lid_matrices = construct_fabric; - r->ucast_build_fwd_tables = do_routing; - r->delete = delete; - - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_ucast_lash.c b/branches/opensm_3/user/opensm/osm_ucast_lash.c deleted file mode 100644 index f635cfc7..00000000 --- a/branches/opensm_3/user/opensm/osm_ucast_lash.c +++ /dev/null @@ -1,1317 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2007 Simula Research Laboratory. All rights reserved. - * Copyright (c) 2007 Silicon Graphics Inc. All rights reserved. - * Copyright (c) 2008,2009 System Fabric Works, Inc. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of LASH algorithm Calculation functions - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct _reachable_dest { - int switch_id; - struct _reachable_dest *next; -} reachable_dest_t; - -static void connect_switches(lash_t * p_lash, int sw1, int sw2, int phy_port_1) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - unsigned num = p_lash->switches[sw1]->node->num_links; - switch_t *s1 = p_lash->switches[sw1]; - mesh_node_t *node = s1->node; - switch_t *s2; - link_t *l; - unsigned int i; - - /* - * if doing mesh analysis: - * - do not consider connections to self - * - collapse multiple connections between - * pair of switches to a single locical link - */ - if (p_lash->p_osm->subn.opt.do_mesh_analysis) { - if (sw1 == sw2) - return; - - /* see if we are already linked to sw2 */ - for (i = 0; i < num; i++) { - l = node->links[i]; - - if (node->links[i]->switch_id == sw2) { - l->ports[l->num_ports++] = phy_port_1; - return; - } - } - } - - l = node->links[num]; - l->switch_id = sw2; - l->link_id = -1; - l->ports[l->num_ports++] = phy_port_1; - - s2 = p_lash->switches[sw2]; - for (i = 0; i < s2->node->num_links; i++) { - if (s2->node->links[i]->switch_id == sw1) { - s2->node->links[i]->link_id = num; - l->link_id = i; - break; - } - } - - node->num_links++; - - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "LASH connect: %d, %d, %d\n", sw1, sw2, phy_port_1); -} - -static osm_switch_t *get_osm_switch_from_port(const osm_port_t * port) -{ - osm_physp_t *p = port->p_physp; - if (p->p_node->sw) - return p->p_node->sw; - else if (p->p_remote_physp->p_node->sw) - return p->p_remote_physp->p_node->sw; - return NULL; -} - -static int cycle_exists(cdg_vertex_t * start, cdg_vertex_t * current, - cdg_vertex_t * prev, int visit_num) -{ - cdg_vertex_t *h; - int i, new_visit_num; - int cycle_found = 0; - - if (current != NULL && current->visiting_number > 0) { - if (visit_num > current->visiting_number && current->seen == 0) { - h = start; - cycle_found = 1; - } - } else { - if (current == NULL) { - current = start; - CL_ASSERT(prev == NULL); - } - - current->visiting_number = visit_num; - - if (prev != NULL) { - prev->next = current; - CL_ASSERT(prev->to == current->from); - CL_ASSERT(prev->visiting_number > 0); - } - - new_visit_num = visit_num + 1; - - for (i = 0; i < current->num_deps; i++) { - cycle_found = - cycle_exists(start, current->deps[i].v, current, - new_visit_num); - if (cycle_found == 1) - i = current->num_deps; - } - - current->seen = 1; - if (prev != NULL) - prev->next = NULL; - } - - return cycle_found; -} - -static inline int get_next_switch(lash_t *p_lash, int sw, int link) -{ - return p_lash->switches[sw]->node->links[link]->switch_id; -} - -static void remove_semipermanent_depend_for_sp(lash_t * p_lash, int sw, - int dest_switch, int lane) -{ - switch_t **switches = p_lash->switches; - cdg_vertex_t ****cdg_vertex_matrix = p_lash->cdg_vertex_matrix; - int i_next_switch, output_link, i, next_link, i_next_next_switch, - depend = 0; - cdg_vertex_t *v; - int found; - - output_link = switches[sw]->routing_table[dest_switch].out_link; - i_next_switch = get_next_switch(p_lash, sw, output_link); - - while (sw != dest_switch) { - v = cdg_vertex_matrix[lane][sw][i_next_switch]; - CL_ASSERT(v != NULL); - - if (v->num_using_vertex == 1) { - - cdg_vertex_matrix[lane][sw][i_next_switch] = NULL; - - free(v); - } else { - v->num_using_vertex--; - if (i_next_switch != dest_switch) { - next_link = - switches[i_next_switch]->routing_table[dest_switch].out_link; - i_next_next_switch = get_next_switch(p_lash, i_next_switch, next_link); - found = 0; - - for (i = 0; i < v->num_deps; i++) - if (v->deps[i].v == - cdg_vertex_matrix[lane][i_next_switch] - [i_next_next_switch]) { - found = 1; - depend = i; - } - - CL_ASSERT(found); - - if (v->deps[depend].num_used == 1) { - for (i = depend; - i < v->num_deps - 1; i++) { - v->deps[i].v = v->deps[i + 1].v; - v->deps[i].num_used = - v->deps[i + 1].num_used; - } - - v->num_deps--; - } else - v->deps[depend].num_used--; - } - } - - sw = i_next_switch; - output_link = switches[sw]->routing_table[dest_switch].out_link; - - if (sw != dest_switch) - i_next_switch = get_next_switch(p_lash, sw, output_link); - } -} - -inline static void enqueue(cl_list_t * bfsq, switch_t * sw) -{ - CL_ASSERT(sw->q_state == UNQUEUED); - sw->q_state = Q_MEMBER; - cl_list_insert_tail(bfsq, sw); -} - -inline static void dequeue(cl_list_t * bfsq, switch_t ** sw) -{ - *sw = (switch_t *) cl_list_remove_head(bfsq); - CL_ASSERT((*sw)->q_state == Q_MEMBER); - (*sw)->q_state = MST_MEMBER; -} - -static int get_phys_connection(switch_t *sw, int switch_to) -{ - unsigned int i; - - for (i = 0; i < sw->node->num_links; i++) - if (sw->node->links[i]->switch_id == switch_to) - return i; - return i; -} - -static void shortest_path(lash_t * p_lash, int ir) -{ - switch_t **switches = p_lash->switches, *sw, *swi; - unsigned int i; - cl_list_t bfsq; - - cl_list_construct(&bfsq); - cl_list_init(&bfsq, 20); - - enqueue(&bfsq, switches[ir]); - - while (!cl_is_list_empty(&bfsq)) { - dequeue(&bfsq, &sw); - for (i = 0; i < sw->node->num_links; i++) { - swi = switches[sw->node->links[i]->switch_id]; - if (swi->q_state == UNQUEUED) { - enqueue(&bfsq, swi); - sw->dij_channels[sw->used_channels++] = swi->id; - } - } - } - - cl_list_destroy(&bfsq); -} - -static int generate_routing_func_for_mst(lash_t * p_lash, int sw_id, - reachable_dest_t ** destinations) -{ - int i, next_switch; - switch_t *sw = p_lash->switches[sw_id]; - int num_channels = sw->used_channels; - reachable_dest_t *dest, *i_dest, *concat_dest = NULL, *prev; - - for (i = 0; i < num_channels; i++) { - next_switch = sw->dij_channels[i]; - if (generate_routing_func_for_mst(p_lash, next_switch, &dest)) - return -1; - - i_dest = dest; - prev = i_dest; - - while (i_dest != NULL) { - if (sw->routing_table[i_dest->switch_id].out_link == - NONE) - sw->routing_table[i_dest->switch_id].out_link = - get_phys_connection(sw, next_switch); - - prev = i_dest; - i_dest = i_dest->next; - } - - CL_ASSERT(prev->next == NULL); - prev->next = concat_dest; - concat_dest = dest; - } - - i_dest = (reachable_dest_t *) malloc(sizeof(reachable_dest_t)); - if (!i_dest) - return -1; - i_dest->switch_id = sw->id; - i_dest->next = concat_dest; - *destinations = i_dest; - return 0; -} - -static int generate_cdg_for_sp(lash_t * p_lash, int sw, int dest_switch, - int lane) -{ - unsigned num_switches = p_lash->num_switches; - switch_t **switches = p_lash->switches; - cdg_vertex_t ****cdg_vertex_matrix = p_lash->cdg_vertex_matrix; - int next_switch, output_link, j, exists; - cdg_vertex_t *v, *prev = NULL; - - output_link = switches[sw]->routing_table[dest_switch].out_link; - next_switch = get_next_switch(p_lash, sw, output_link); - - while (sw != dest_switch) { - - if (cdg_vertex_matrix[lane][sw][next_switch] == NULL) { - v = calloc(1, sizeof(*v) + (num_switches - 1) * sizeof(v->deps[0])); - if (!v) - return -1; - v->from = sw; - v->to = next_switch; - v->temp = 1; - cdg_vertex_matrix[lane][sw][next_switch] = v; - } else - v = cdg_vertex_matrix[lane][sw][next_switch]; - - v->num_using_vertex++; - - if (prev != NULL) { - exists = 0; - - for (j = 0; j < prev->num_deps; j++) - if (prev->deps[j].v == v) { - exists = 1; - prev->deps[j].num_used++; - } - - if (exists == 0) { - prev->deps[prev->num_deps].v = v; - prev->deps[prev->num_deps].num_used++; - prev->num_deps++; - - CL_ASSERT(prev->num_deps < (int)num_switches); - - if (prev->temp == 0) - prev->num_temp_depend++; - - } - } - - sw = next_switch; - output_link = switches[sw]->routing_table[dest_switch].out_link; - - if (sw != dest_switch) { - CL_ASSERT(output_link != NONE); - next_switch = get_next_switch(p_lash, sw, output_link); - } - - prev = v; - } - return 0; -} - -static void set_temp_depend_to_permanent_for_sp(lash_t * p_lash, int sw, - int dest_switch, int lane) -{ - switch_t **switches = p_lash->switches; - cdg_vertex_t ****cdg_vertex_matrix = p_lash->cdg_vertex_matrix; - int next_switch, output_link; - cdg_vertex_t *v; - - output_link = switches[sw]->routing_table[dest_switch].out_link; - next_switch = get_next_switch(p_lash, sw, output_link); - - while (sw != dest_switch) { - v = cdg_vertex_matrix[lane][sw][next_switch]; - CL_ASSERT(v != NULL); - - if (v->temp == 1) - v->temp = 0; - else - v->num_temp_depend = 0; - - sw = next_switch; - output_link = switches[sw]->routing_table[dest_switch].out_link; - - if (sw != dest_switch) - next_switch = get_next_switch(p_lash, sw, output_link); - } - -} - -static void remove_temp_depend_for_sp(lash_t * p_lash, int sw, int dest_switch, - int lane) -{ - switch_t **switches = p_lash->switches; - cdg_vertex_t ****cdg_vertex_matrix = p_lash->cdg_vertex_matrix; - int next_switch, output_link, i; - cdg_vertex_t *v; - - output_link = switches[sw]->routing_table[dest_switch].out_link; - next_switch = get_next_switch(p_lash, sw, output_link); - - while (sw != dest_switch) { - v = cdg_vertex_matrix[lane][sw][next_switch]; - CL_ASSERT(v != NULL); - - if (v->temp == 1) { - cdg_vertex_matrix[lane][sw][next_switch] = NULL; - free(v); - } else { - CL_ASSERT(v->num_temp_depend <= v->num_deps); - v->num_deps = v->num_deps - v->num_temp_depend; - v->num_temp_depend = 0; - v->num_using_vertex--; - - for (i = v->num_deps; i < p_lash->num_switches - 1; i++) - v->deps[i].num_used = 0; - } - - sw = next_switch; - output_link = switches[sw]->routing_table[dest_switch].out_link; - - if (sw != dest_switch) - next_switch = get_next_switch(p_lash, sw, output_link); - - } -} - -static int balance_virtual_lanes(lash_t * p_lash, unsigned lanes_needed) -{ - unsigned num_switches = p_lash->num_switches; - cdg_vertex_t ****cdg_vertex_matrix = p_lash->cdg_vertex_matrix; - int *num_mst_in_lane = p_lash->num_mst_in_lane; - int ***virtual_location = p_lash->virtual_location; - int min_filled_lane, max_filled_lane, trials; - int old_min_filled_lane, old_max_filled_lane, new_num_min_lane, - new_num_max_lane; - unsigned int i, j; - int src, dest, start, next_switch, output_link; - int next_switch2, output_link2; - int stop = 0, cycle_found; - int cycle_found2; - unsigned start_vl = p_lash->p_osm->subn.opt.lash_start_vl; - - max_filled_lane = 0; - min_filled_lane = lanes_needed - 1; - - trials = num_mst_in_lane[max_filled_lane]; - if (lanes_needed == 1) - stop = 1; - - while (stop == 0) { - src = abs(rand()) % (num_switches); - dest = abs(rand()) % (num_switches); - - while (virtual_location[src][dest][max_filled_lane] != 1) { - start = dest; - if (dest == num_switches - 1) - dest = 0; - else - dest++; - - while (dest != start - && virtual_location[src][dest][max_filled_lane] - != 1) { - if (dest == num_switches - 1) - dest = 0; - else - dest++; - } - - if (virtual_location[src][dest][max_filled_lane] != 1) { - if (src == num_switches - 1) - src = 0; - else - src++; - } - } - - if (generate_cdg_for_sp(p_lash, src, dest, min_filled_lane) || - generate_cdg_for_sp(p_lash, dest, src, min_filled_lane)) - return -1; - - output_link = p_lash->switches[src]->routing_table[dest].out_link; - next_switch = get_next_switch(p_lash, src, output_link); - - output_link2 = p_lash->switches[dest]->routing_table[src].out_link; - next_switch2 = get_next_switch(p_lash, dest, output_link2); - - CL_ASSERT(cdg_vertex_matrix[min_filled_lane][src][next_switch] != NULL); - CL_ASSERT(cdg_vertex_matrix[min_filled_lane][dest][next_switch2] != NULL); - - cycle_found = - cycle_exists(cdg_vertex_matrix[min_filled_lane][src][next_switch], NULL, NULL, - 1); - cycle_found2 = - cycle_exists(cdg_vertex_matrix[min_filled_lane][dest][next_switch2], NULL, NULL, - 1); - - for (i = 0; i < num_switches; i++) - for (j = 0; j < num_switches; j++) - if (cdg_vertex_matrix[min_filled_lane][i][j] != NULL) { - cdg_vertex_matrix[min_filled_lane][i][j]->visiting_number = - 0; - cdg_vertex_matrix[min_filled_lane][i][j]->seen = 0; - } - - if (cycle_found == 1 || cycle_found2 == 1) { - remove_temp_depend_for_sp(p_lash, src, dest, min_filled_lane); - remove_temp_depend_for_sp(p_lash, dest, src, min_filled_lane); - - virtual_location[src][dest][max_filled_lane] = 2; - virtual_location[dest][src][max_filled_lane] = 2; - trials--; - trials--; - } else { - set_temp_depend_to_permanent_for_sp(p_lash, src, dest, min_filled_lane); - set_temp_depend_to_permanent_for_sp(p_lash, dest, src, min_filled_lane); - - num_mst_in_lane[max_filled_lane]--; - num_mst_in_lane[max_filled_lane]--; - num_mst_in_lane[min_filled_lane]++; - num_mst_in_lane[min_filled_lane]++; - - remove_semipermanent_depend_for_sp(p_lash, src, dest, max_filled_lane); - remove_semipermanent_depend_for_sp(p_lash, dest, src, max_filled_lane); - virtual_location[src][dest][max_filled_lane] = 0; - virtual_location[dest][src][max_filled_lane] = 0; - virtual_location[src][dest][min_filled_lane] = 1; - virtual_location[dest][src][min_filled_lane] = 1; - p_lash->switches[src]->routing_table[dest].lane = min_filled_lane + start_vl; - p_lash->switches[dest]->routing_table[src].lane = min_filled_lane + start_vl; - } - - if (trials == 0) - stop = 1; - else { - if (num_mst_in_lane[max_filled_lane] - num_mst_in_lane[min_filled_lane] < - p_lash->balance_limit) - stop = 1; - } - - old_min_filled_lane = min_filled_lane; - old_max_filled_lane = max_filled_lane; - - new_num_min_lane = MAX_INT; - new_num_max_lane = 0; - - for (i = 0; i < lanes_needed; i++) { - - if (num_mst_in_lane[i] < new_num_min_lane) { - new_num_min_lane = num_mst_in_lane[i]; - min_filled_lane = i; - } - - if (num_mst_in_lane[i] > new_num_max_lane) { - new_num_max_lane = num_mst_in_lane[i]; - max_filled_lane = i; - } - } - - if (old_min_filled_lane != min_filled_lane) { - trials = num_mst_in_lane[max_filled_lane]; - for (i = 0; i < num_switches; i++) - for (j = 0; j < num_switches; j++) - if (virtual_location[i][j][max_filled_lane] == 2) - virtual_location[i][j][max_filled_lane] = 1; - } - - if (old_max_filled_lane != max_filled_lane) { - trials = num_mst_in_lane[max_filled_lane]; - for (i = 0; i < num_switches; i++) - for (j = 0; j < num_switches; j++) - if (virtual_location[i][j][old_max_filled_lane] == 2) - virtual_location[i][j][old_max_filled_lane] = 1; - } - } - return 0; -} - -static switch_t *switch_create(lash_t * p_lash, unsigned id, osm_switch_t * p_sw) -{ - unsigned num_switches = p_lash->num_switches; - unsigned num_ports = p_sw->num_ports; - switch_t *sw; - unsigned int i; - - sw = malloc(sizeof(*sw) + num_switches * sizeof(sw->routing_table[0])); - if (!sw) - return NULL; - - memset(sw, 0, sizeof(*sw)); - for (i = 0; i < num_switches; i++) { - sw->routing_table[i].out_link = NONE; - sw->routing_table[i].lane = NONE; - } - - sw->id = id; - sw->dij_channels = malloc(num_ports * sizeof(int)); - if (!sw->dij_channels) { - free(sw); - return NULL; - } - - sw->p_sw = p_sw; - p_sw->priv = sw; - - if (osm_mesh_node_create(p_lash, sw)) { - free(sw->dij_channels); - free(sw); - return NULL; - } - - return sw; -} - -static void switch_delete(lash_t *p_lash, switch_t * sw) -{ - if (sw->dij_channels) - free(sw->dij_channels); - free(sw); -} - -static void delete_mesh_switches(lash_t *p_lash) -{ - if (p_lash->switches) { - unsigned id; - for (id = 0; ((int)id) < p_lash->num_switches; id++) - if (p_lash->switches[id]) - osm_mesh_node_delete(p_lash, - p_lash->switches[id]); - } -} - -static void free_lash_structures(lash_t * p_lash) -{ - unsigned int i, j, k; - unsigned num_switches = p_lash->num_switches; - osm_log_t *p_log = &p_lash->p_osm->log; - - OSM_LOG_ENTER(p_log); - - delete_mesh_switches(p_lash); - - /* free cdg_vertex_matrix */ - for (i = 0; i < p_lash->vl_min; i++) { - for (j = 0; j < num_switches; j++) { - for (k = 0; k < num_switches; k++) - if (p_lash->cdg_vertex_matrix[i][j][k]) - free(p_lash->cdg_vertex_matrix[i][j][k]); - if (p_lash->cdg_vertex_matrix[i][j]) - free(p_lash->cdg_vertex_matrix[i][j]); - } - if (p_lash->cdg_vertex_matrix[i]) - free(p_lash->cdg_vertex_matrix[i]); - } - - if (p_lash->cdg_vertex_matrix) - free(p_lash->cdg_vertex_matrix); - - /* free virtual_location */ - for (i = 0; i < num_switches; i++) { - for (j = 0; j < num_switches; j++) { - if (p_lash->virtual_location[i][j]) - free(p_lash->virtual_location[i][j]); - } - if (p_lash->virtual_location[i]) - free(p_lash->virtual_location[i]); - } - if (p_lash->virtual_location) - free(p_lash->virtual_location); - - OSM_LOG_EXIT(p_log); -} - -static int init_lash_structures(lash_t * p_lash) -{ - unsigned vl_min = p_lash->vl_min; - unsigned num_switches = p_lash->num_switches; - osm_log_t *p_log = &p_lash->p_osm->log; - int status = 0; - unsigned int i, j, k; - - OSM_LOG_ENTER(p_log); - - /* initialise cdg_vertex_matrix[num_switches][num_switches][num_switches] */ - p_lash->cdg_vertex_matrix = - (cdg_vertex_t ****) malloc(vl_min * sizeof(cdg_vertex_t ****)); - if (p_lash->cdg_vertex_matrix == NULL) - goto Exit_Mem_Error; - for (i = 0; i < vl_min; i++) { - p_lash->cdg_vertex_matrix[i] = - (cdg_vertex_t ***) malloc(num_switches * - sizeof(cdg_vertex_t ***)); - - if (p_lash->cdg_vertex_matrix[i] == NULL) - goto Exit_Mem_Error; - } - - for (i = 0; i < vl_min; i++) { - for (j = 0; j < num_switches; j++) { - p_lash->cdg_vertex_matrix[i][j] = - (cdg_vertex_t **) malloc(num_switches * - sizeof(cdg_vertex_t **)); - if (p_lash->cdg_vertex_matrix[i][j] == NULL) - goto Exit_Mem_Error; - - for (k = 0; k < num_switches; k++) - p_lash->cdg_vertex_matrix[i][j][k] = NULL; - } - } - - /* - * initialise virtual_location[num_switches][num_switches][num_layers], - * default value = 0 - */ - p_lash->virtual_location = - (int ***)malloc(num_switches * sizeof(int ***)); - if (p_lash->virtual_location == NULL) - goto Exit_Mem_Error; - - for (i = 0; i < num_switches; i++) { - p_lash->virtual_location[i] = - (int **)malloc(num_switches * sizeof(int **)); - if (p_lash->virtual_location[i] == NULL) - goto Exit_Mem_Error; - } - - for (i = 0; i < num_switches; i++) { - for (j = 0; j < num_switches; j++) { - p_lash->virtual_location[i][j] = - (int *)malloc(vl_min * sizeof(int *)); - if (p_lash->virtual_location[i][j] == NULL) - goto Exit_Mem_Error; - for (k = 0; k < vl_min; k++) - p_lash->virtual_location[i][j][k] = 0; - } - } - - /* initialise num_mst_in_lane[num_switches], default 0 */ - memset(p_lash->num_mst_in_lane, 0, - IB_MAX_NUM_VLS * sizeof(p_lash->num_mst_in_lane[0])); - - goto Exit; - -Exit_Mem_Error: - status = -1; - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4D01: " - "Could not allocate required memory for LASH errno %d, errno %d for lack of memory\n", - errno, ENOMEM); - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -static int lash_core(lash_t * p_lash) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - unsigned num_switches = p_lash->num_switches; - switch_t **switches = p_lash->switches; - unsigned lanes_needed = 1; - unsigned int i, j, k, dest_switch = 0; - reachable_dest_t *dests, *idest; - int cycle_found = 0; - unsigned v_lane; - int stop = 0, output_link, i_next_switch; - int output_link2, i_next_switch2; - int cycle_found2 = 0; - int status = -1; - int *switch_bitmap = NULL; /* Bitmap to check if we have processed this pair */ - unsigned start_vl = p_lash->p_osm->subn.opt.lash_start_vl; - - OSM_LOG_ENTER(p_log); - - if (p_lash->p_osm->subn.opt.do_mesh_analysis && osm_do_mesh_analysis(p_lash)) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4D05: Mesh analysis failed\n"); - goto Exit; - } - - for (i = 0; i < num_switches; i++) { - - shortest_path(p_lash, i); - if (generate_routing_func_for_mst(p_lash, i, &dests)) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4D06: " - "generate_routing_func_for_mst failed\n"); - goto Exit; - } - - idest = dests; - while (idest != NULL) { - dests = dests->next; - free(idest); - idest = dests; - } - - for (j = 0; j < num_switches; j++) { - switches[j]->used_channels = 0; - switches[j]->q_state = UNQUEUED; - } - } - - switch_bitmap = calloc(num_switches * num_switches, sizeof(int)); - if (!switch_bitmap) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4D04: " - "Failed allocating switch_bitmap - out of memory\n"); - goto Exit; - } - - for (i = 0; i < num_switches; i++) { - for (dest_switch = 0; dest_switch < num_switches; dest_switch++) - if (dest_switch != i && switch_bitmap[i * num_switches + dest_switch] == 0) { - v_lane = 0; - stop = 0; - while (v_lane < lanes_needed && stop == 0) { - if (generate_cdg_for_sp(p_lash, i, dest_switch, v_lane) || - generate_cdg_for_sp(p_lash, dest_switch, i, v_lane)) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "ERR 4D07: generate_cdg_for_sp failed\n"); - goto Exit; - } - - output_link = - switches[i]->routing_table[dest_switch].out_link; - output_link2 = - switches[dest_switch]->routing_table[i].out_link; - - i_next_switch = get_next_switch(p_lash, i, output_link); - i_next_switch2 = get_next_switch(p_lash, dest_switch, output_link2); - - CL_ASSERT(p_lash-> - cdg_vertex_matrix[v_lane][i][i_next_switch] != - NULL); - CL_ASSERT(p_lash-> - cdg_vertex_matrix[v_lane][dest_switch] - [i_next_switch2] != NULL); - - cycle_found = - cycle_exists(p_lash-> - cdg_vertex_matrix[v_lane][i] - [i_next_switch], NULL, NULL, 1); - cycle_found2 = - cycle_exists(p_lash-> - cdg_vertex_matrix[v_lane][dest_switch] - [i_next_switch2], NULL, NULL, 1); - - for (j = 0; j < num_switches; j++) - for (k = 0; k < num_switches; k++) - if (p_lash-> - cdg_vertex_matrix[v_lane][j][k] != - NULL) { - p_lash-> - cdg_vertex_matrix[v_lane][j] - [k]->visiting_number = 0; - p_lash-> - cdg_vertex_matrix[v_lane][j] - [k]->seen = 0; - } - - if (cycle_found == 1 || cycle_found2 == 1) { - remove_temp_depend_for_sp(p_lash, i, dest_switch, - v_lane); - remove_temp_depend_for_sp(p_lash, dest_switch, i, - v_lane); - v_lane++; - } else { - set_temp_depend_to_permanent_for_sp(p_lash, i, - dest_switch, - v_lane); - set_temp_depend_to_permanent_for_sp(p_lash, - dest_switch, i, - v_lane); - stop = 1; - p_lash->num_mst_in_lane[v_lane]++; - p_lash->num_mst_in_lane[v_lane]++; - } - } - - switches[i]->routing_table[dest_switch].lane = v_lane + start_vl; - switches[dest_switch]->routing_table[i].lane = v_lane + start_vl; - - if (cycle_found == 1 || cycle_found2 == 1) { - if (++lanes_needed > p_lash->vl_min) - goto Error_Not_Enough_Lanes; - - if (generate_cdg_for_sp(p_lash, i, dest_switch, v_lane) || - generate_cdg_for_sp(p_lash, dest_switch, i, v_lane)) { - OSM_LOG(p_log, OSM_LOG_ERROR, - "ERR 4D08: generate_cdg_for_sp failed\n"); - goto Exit; - } - - set_temp_depend_to_permanent_for_sp(p_lash, i, dest_switch, - v_lane); - set_temp_depend_to_permanent_for_sp(p_lash, dest_switch, i, - v_lane); - - p_lash->num_mst_in_lane[v_lane]++; - p_lash->num_mst_in_lane[v_lane]++; - } - p_lash->virtual_location[i][dest_switch][v_lane] = 1; - p_lash->virtual_location[dest_switch][i][v_lane] = 1; - - switch_bitmap[i * num_switches + dest_switch] = 1; - switch_bitmap[dest_switch * num_switches + i] = 1; - } - } - - for (i = 0; i < lanes_needed; i++) - OSM_LOG(p_log, OSM_LOG_INFO, "Lanes in layer %d: %d\n", - i, p_lash->num_mst_in_lane[i]); - - OSM_LOG(p_log, OSM_LOG_INFO, - "Lanes needed: %d, Balancing\n", lanes_needed); - - if (balance_virtual_lanes(p_lash, lanes_needed)) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4D09: Balancing failed\n"); - goto Exit; - } - - for (i = 0; i < lanes_needed; i++) - OSM_LOG(p_log, OSM_LOG_INFO, "Lanes in layer %d: %d\n", - i, p_lash->num_mst_in_lane[i]); - - status = 0; - goto Exit; - -Error_Not_Enough_Lanes: - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4D02: " - "Lane requirements (%d) exceed available lanes (%d)" - " with starting lane (%d)\n", - lanes_needed, p_lash->vl_min, start_vl); -Exit: - if (switch_bitmap) - free(switch_bitmap); - OSM_LOG_EXIT(p_log); - return status; -} - -static unsigned get_lash_id(osm_switch_t * p_sw) -{ - return ((switch_t *) p_sw->priv)->id; -} - -static int get_next_port(switch_t *sw, int link) -{ - link_t *l = sw->node->links[link]; - int port = l->next_port++; - - /* - * note if not doing mesh analysis - * then num_ports is always 1 - */ - if (l->next_port >= l->num_ports) - l->next_port = 0; - - return l->ports[port]; -} - -static void populate_fwd_tbls(lash_t * p_lash) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - osm_subn_t *p_subn = &p_lash->p_osm->subn; - osm_switch_t *p_sw, *p_next_sw, *p_dst_sw; - osm_port_t *port; - uint16_t max_lid_ho, lid; - - OSM_LOG_ENTER(p_log); - - p_next_sw = (osm_switch_t *) cl_qmap_head(&p_subn->sw_guid_tbl); - - /* Go through each switch individually */ - while (p_next_sw != (osm_switch_t *) cl_qmap_end(&p_subn->sw_guid_tbl)) { - uint64_t current_guid; - switch_t *sw; - p_sw = p_next_sw; - p_next_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item); - - max_lid_ho = p_sw->max_lid_ho; - current_guid = p_sw->p_node->node_info.port_guid; - sw = p_sw->priv; - - memset(p_sw->new_lft, OSM_NO_PATH, p_sw->lft_size); - - for (lid = 1; lid <= max_lid_ho; lid++) { - port = osm_get_port_by_lid_ho(p_subn, lid); - if (!port) - continue; - - p_dst_sw = get_osm_switch_from_port(port); - if (p_dst_sw == p_sw) { - uint8_t egress_port = port->p_node->sw ? 0 : - port->p_physp->p_remote_physp->port_num; - p_sw->new_lft[lid] = egress_port; - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "LASH fwd MY SRC SRC GUID 0x%016" PRIx64 - " src lash id (%d), src lid no (%u) src lash port (%d) " - "DST GUID 0x%016" PRIx64 - " src lash id (%d), src lash port (%d)\n", - cl_ntoh64(current_guid), -1, lid, - egress_port, cl_ntoh64(current_guid), - -1, egress_port); - } else if (p_dst_sw) { - unsigned dst_lash_switch_id = - get_lash_id(p_dst_sw); - uint8_t lash_egress_port = - (uint8_t) sw-> - routing_table[dst_lash_switch_id].out_link; - uint8_t physical_egress_port = - get_next_port(sw, lash_egress_port); - - p_sw->new_lft[lid] = physical_egress_port; - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "LASH fwd SRC GUID 0x%016" PRIx64 - " src lash id (%d), " - "src lid no (%u) src lash port (%d) " - "DST GUID 0x%016" PRIx64 - " src lash id (%d), src lash port (%d)\n", - cl_ntoh64(current_guid), sw->id, lid, - lash_egress_port, - cl_ntoh64(p_dst_sw->p_node->node_info. - port_guid), - dst_lash_switch_id, - physical_egress_port); - } - } /* for */ - } - OSM_LOG_EXIT(p_log); -} - -static void osm_lash_process_switch(lash_t * p_lash, osm_switch_t * p_sw) -{ - osm_log_t *p_log = &p_lash->p_osm->log; - int i, port_count; - osm_physp_t *p_current_physp, *p_remote_physp; - unsigned switch_a_lash_id, switch_b_lash_id; - - OSM_LOG_ENTER(p_log); - - switch_a_lash_id = get_lash_id(p_sw); - port_count = osm_node_get_num_physp(p_sw->p_node); - - /* starting at port 1, ignoring management port on switch */ - for (i = 1; i < port_count; i++) { - - p_current_physp = osm_node_get_physp_ptr(p_sw->p_node, i); - if (p_current_physp) { - p_remote_physp = p_current_physp->p_remote_physp; - if (p_remote_physp && p_remote_physp->p_node->sw) { - int physical_port_a_num = - osm_physp_get_port_num(p_current_physp); - int physical_port_b_num = - osm_physp_get_port_num(p_remote_physp); - switch_b_lash_id = - get_lash_id(p_remote_physp->p_node->sw); - - connect_switches(p_lash, switch_a_lash_id, - switch_b_lash_id, - physical_port_a_num); - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "LASH SUCCESS connected G 0x%016" PRIx64 - " , lash_id(%u), P(%u) " " to G 0x%016" - PRIx64 " , lash_id(%u) , P(%u)\n", - cl_ntoh64(osm_physp_get_port_guid - (p_current_physp)), - switch_a_lash_id, physical_port_a_num, - cl_ntoh64(osm_physp_get_port_guid - (p_remote_physp)), - switch_b_lash_id, physical_port_b_num); - } - } - } - - OSM_LOG_EXIT(p_log); -} - -static void lash_cleanup(lash_t * p_lash) -{ - osm_subn_t *p_subn = &p_lash->p_osm->subn; - osm_switch_t *p_next_sw, *p_sw; - - /* drop any existing references to old lash switches */ - p_next_sw = (osm_switch_t *) cl_qmap_head(&p_subn->sw_guid_tbl); - while (p_next_sw != (osm_switch_t *) cl_qmap_end(&p_subn->sw_guid_tbl)) { - p_sw = p_next_sw; - p_next_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item); - p_sw->priv = NULL; - } - - if (p_lash->switches) { - unsigned id; - for (id = 0; ((int)id) < p_lash->num_switches; id++) - if (p_lash->switches[id]) - switch_delete(p_lash, p_lash->switches[id]); - free(p_lash->switches); - } - p_lash->switches = NULL; -} - -/* - static int discover_network_properties() - Traverse the topology of the network in order to determine - - the maximum number of switches, - - the minimum number of virtual layers -*/ - -static int discover_network_properties(lash_t * p_lash) -{ - int i, id = 0; - uint8_t vl_min; - osm_subn_t *p_subn = &p_lash->p_osm->subn; - osm_switch_t *p_next_sw, *p_sw; - osm_log_t *p_log = &p_lash->p_osm->log; - - p_lash->num_switches = cl_qmap_count(&p_subn->sw_guid_tbl); - - p_lash->switches = calloc(p_lash->num_switches, sizeof(switch_t *)); - if (!p_lash->switches) - return -1; - - vl_min = 5; /* set to a high value */ - - p_next_sw = (osm_switch_t *) cl_qmap_head(&p_subn->sw_guid_tbl); - while (p_next_sw != (osm_switch_t *) cl_qmap_end(&p_subn->sw_guid_tbl)) { - uint16_t port_count; - p_sw = p_next_sw; - p_next_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item); - - p_lash->switches[id] = switch_create(p_lash, id, p_sw); - if (!p_lash->switches[id]) - return -1; - id++; - - port_count = osm_node_get_num_physp(p_sw->p_node); - - /* Note, ignoring port 0. management port */ - for (i = 1; i < port_count; i++) { - osm_physp_t *p_current_physp = - osm_node_get_physp_ptr(p_sw->p_node, i); - - if (p_current_physp - && p_current_physp->p_remote_physp) { - - ib_port_info_t *p_port_info = - &p_current_physp->port_info; - uint8_t port_vl_min = - ib_port_info_get_op_vls(p_port_info); - if (port_vl_min && port_vl_min < vl_min) - vl_min = port_vl_min; - } - } /* for */ - } /* while */ - - vl_min = 1 << (vl_min - 1); - if (vl_min > 15) - vl_min = 15; - - if (p_lash->p_osm->subn.opt.lash_start_vl >= vl_min) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 4D03: " - "Start VL(%d) too high for min operational vl(%d)\n", - p_lash->p_osm->subn.opt.lash_start_vl, vl_min); - return -1; - } - - p_lash->vl_min = vl_min - p_lash->p_osm->subn.opt.lash_start_vl; - - OSM_LOG(p_log, OSM_LOG_INFO, - "min operational vl(%d) start vl(%d) max_switches(%d)\n", - p_lash->vl_min, p_lash->p_osm->subn.opt.lash_start_vl, - p_lash->num_switches); - return 0; -} - -static void process_switches(lash_t * p_lash) -{ - osm_switch_t *p_sw, *p_next_sw; - osm_subn_t *p_subn = &p_lash->p_osm->subn; - - /* Go through each switch and process it. i.e build the connection - structure required by LASH */ - p_next_sw = (osm_switch_t *) cl_qmap_head(&p_subn->sw_guid_tbl); - while (p_next_sw != (osm_switch_t *) cl_qmap_end(&p_subn->sw_guid_tbl)) { - p_sw = p_next_sw; - p_next_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item); - - osm_lash_process_switch(p_lash, p_sw); - } -} - -static int lash_process(void *context) -{ - lash_t *p_lash = context; - osm_log_t *p_log = &p_lash->p_osm->log; - int status = 0; - - OSM_LOG_ENTER(p_log); - - p_lash->balance_limit = 6; - - /* everything starts here */ - lash_cleanup(p_lash); - - status = discover_network_properties(p_lash); - if (status) - goto Exit; - - status = init_lash_structures(p_lash); - if (status) - goto Exit; - - process_switches(p_lash); - - status = lash_core(p_lash); - if (status) - goto Exit; - - populate_fwd_tbls(p_lash); - -Exit: - if (p_lash->vl_min) - free_lash_structures(p_lash); - OSM_LOG_EXIT(p_log); - - return status; -} - -static lash_t *lash_create(osm_opensm_t * p_osm) -{ - lash_t *p_lash; - - p_lash = calloc(1, sizeof(lash_t)); - if (!p_lash) - return NULL; - - p_lash->p_osm = p_osm; - - return p_lash; -} - -static void lash_delete(void *context) -{ - lash_t *p_lash = context; - - if (p_lash->switches) { - unsigned id; - for (id = 0; ((int)id) < p_lash->num_switches; id++) - if (p_lash->switches[id]) - switch_delete(p_lash, p_lash->switches[id]); - free(p_lash->switches); - } - - free(p_lash); -} - -uint8_t osm_get_lash_sl(osm_opensm_t * p_osm, const osm_port_t * p_src_port, - const osm_port_t * p_dst_port) -{ - unsigned dst_id; - unsigned src_id; - osm_switch_t *p_sw; - - if (p_osm->routing_engine_used != OSM_ROUTING_ENGINE_TYPE_LASH) - return OSM_DEFAULT_SL; - - p_sw = get_osm_switch_from_port(p_dst_port); - if (!p_sw || !p_sw->priv) - return OSM_DEFAULT_SL; - dst_id = get_lash_id(p_sw); - - p_sw = get_osm_switch_from_port(p_src_port); - if (!p_sw || !p_sw->priv) - return OSM_DEFAULT_SL; - - src_id = get_lash_id(p_sw); - if (src_id == dst_id) - return p_osm->subn.opt.lash_start_vl; - - return (uint8_t) ((switch_t *) p_sw->priv)->routing_table[dst_id].lane; -} - -int osm_ucast_lash_setup(struct osm_routing_engine *r, osm_opensm_t *p_osm) -{ - lash_t *p_lash = lash_create(p_osm); - if (!p_lash) - return -1; - - r->context = p_lash; - r->ucast_build_fwd_tables = lash_process; - r->delete = lash_delete; - - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_ucast_mgr.c b/branches/opensm_3/user/opensm/osm_ucast_mgr.c deleted file mode 100644 index 9ccd5832..00000000 --- a/branches/opensm_3/user/opensm/osm_ucast_mgr.c +++ /dev/null @@ -1,1156 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_ucast_mgr_t. - * This file implements the Unicast Manager object. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void osm_ucast_mgr_construct(IN osm_ucast_mgr_t * p_mgr) -{ - memset(p_mgr, 0, sizeof(*p_mgr)); -} - -void osm_ucast_mgr_destroy(IN osm_ucast_mgr_t * p_mgr) -{ - CL_ASSERT(p_mgr); - - OSM_LOG_ENTER(p_mgr->p_log); - - if (p_mgr->cache_valid) - osm_ucast_cache_invalidate(p_mgr); - - OSM_LOG_EXIT(p_mgr->p_log); -} - -ib_api_status_t osm_ucast_mgr_init(IN osm_ucast_mgr_t * p_mgr, IN osm_sm_t * sm) -{ - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(sm->p_log); - - osm_ucast_mgr_construct(p_mgr); - - p_mgr->sm = sm; - p_mgr->p_log = sm->p_log; - p_mgr->p_subn = sm->p_subn; - p_mgr->p_lock = sm->p_lock; - - if (sm->p_subn->opt.use_ucast_cache) - cl_qmap_init(&p_mgr->cache_sw_tbl); - - OSM_LOG_EXIT(p_mgr->p_log); - return status; -} - -/********************************************************************** - Add each switch's own and neighbor LIDs to its LID matrix -**********************************************************************/ -static void ucast_mgr_process_hop_0_1(IN cl_map_item_t * p_map_item, - IN void *context) -{ - osm_switch_t * p_sw = (osm_switch_t *) p_map_item; - osm_node_t *p_remote_node; - uint16_t lid, remote_lid; - uint8_t i; - - lid = cl_ntoh16(osm_node_get_base_lid(p_sw->p_node, 0)); - osm_switch_set_hops(p_sw, lid, 0, 0); - - for (i = 1; i < p_sw->num_ports; i++) { - osm_physp_t *p = osm_node_get_physp_ptr(p_sw->p_node, i); - p_remote_node = (p && p->p_remote_physp) ? - p->p_remote_physp->p_node : NULL; - - if (p_remote_node && p_remote_node->sw && - p_remote_node != p_sw->p_node) { - remote_lid = osm_node_get_base_lid(p_remote_node, 0); - remote_lid = cl_ntoh16(remote_lid); - osm_switch_set_hops(p_sw, remote_lid, i, p->hop_wf); - } - } -} - -static void ucast_mgr_process_neighbor(IN osm_ucast_mgr_t * p_mgr, - IN osm_switch_t * p_this_sw, - IN osm_switch_t * p_remote_sw, - IN uint8_t port_num, - IN uint8_t remote_port_num) -{ - osm_switch_t *p_sw; - cl_map_item_t *item; - uint16_t lid_ho; - uint8_t hops; - osm_physp_t *p; - - OSM_LOG_ENTER(p_mgr->p_log); - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Node 0x%" PRIx64 ", remote node 0x%" PRIx64 - ", port %u, remote port %u\n", - cl_ntoh64(osm_node_get_node_guid(p_this_sw->p_node)), - cl_ntoh64(osm_node_get_node_guid(p_remote_sw->p_node)), - port_num, remote_port_num); - - p = osm_node_get_physp_ptr(p_this_sw->p_node, port_num); - - for (item = cl_qmap_head(&p_mgr->p_subn->sw_guid_tbl); - item != cl_qmap_end(&p_mgr->p_subn->sw_guid_tbl); - item = cl_qmap_next(item)) { - p_sw = (osm_switch_t *) item; - lid_ho = cl_ntoh16(osm_node_get_base_lid(p_sw->p_node, 0)); - hops = osm_switch_get_least_hops(p_remote_sw, lid_ho); - if (hops == OSM_NO_PATH) - continue; - hops += p->hop_wf; - if (hops < - osm_switch_get_hop_count(p_this_sw, lid_ho, port_num)) { - if (osm_switch_set_hops - (p_this_sw, lid_ho, port_num, hops) != 0) - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 3A03: " - "cannot set hops for lid %u at switch 0x%" - PRIx64 "\n", lid_ho, - cl_ntoh64(osm_node_get_node_guid - (p_this_sw->p_node))); - p_mgr->some_hop_count_set = TRUE; - } - } - - OSM_LOG_EXIT(p_mgr->p_log); -} - -static struct osm_remote_node *find_and_add_remote_sys(osm_switch_t * sw, - uint8_t port, - boolean_t dor, struct - osm_remote_guids_count - *r) -{ - unsigned i; - osm_physp_t *p = osm_node_get_physp_ptr(sw->p_node, port); - osm_node_t *node = p->p_remote_physp->p_node; - uint8_t rem_port = osm_physp_get_port_num(p->p_remote_physp); - - for (i = 0; i < r->count; i++) - if (r->guids[i].node == node) - if (!dor || (r->guids[i].port == rem_port)) - return &r->guids[i]; - - r->guids[i].node = node; - r->guids[i].forwarded_to = 0; - r->guids[i].port = rem_port; - r->count++; - return &r->guids[i]; -} - -static void ucast_mgr_process_port(IN osm_ucast_mgr_t * p_mgr, - IN osm_switch_t * p_sw, - IN osm_port_t * p_port, - IN unsigned lid_offset) -{ - uint16_t min_lid_ho; - uint16_t max_lid_ho; - uint16_t lid_ho; - uint8_t port; - boolean_t is_ignored_by_port_prof; - ib_net64_t node_guid; - unsigned start_from = 1; - - OSM_LOG_ENTER(p_mgr->p_log); - - osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho); - - /* If the lids are zero - then there was some problem with - * the initialization. Don't handle this port. */ - if (min_lid_ho == 0 || max_lid_ho == 0) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 3A04: " - "Port 0x%" PRIx64 " has LID 0. An initialization " - "error occurred. Ignoring port\n", - cl_ntoh64(osm_port_get_guid(p_port))); - goto Exit; - } - - lid_ho = min_lid_ho + lid_offset; - - if (lid_ho > max_lid_ho) - goto Exit; - - if (lid_offset && !p_mgr->is_dor) - /* ignore potential overflow - it is handled in osm_switch.c */ - start_from = osm_switch_get_port_by_lid(p_sw, lid_ho - 1) + 1; - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Processing port 0x%" PRIx64 - " (\'%s\' port %u), LID %u [%u,%u]\n", - cl_ntoh64(osm_port_get_guid(p_port)), - p_port->p_node->print_desc, p_port->p_physp->port_num, lid_ho, - min_lid_ho, max_lid_ho); - - /* TODO - This should be runtime error, not a CL_ASSERT() */ - CL_ASSERT(max_lid_ho <= IB_LID_UCAST_END_HO); - - node_guid = osm_node_get_node_guid(p_sw->p_node); - - /* - The lid matrix contains the number of hops to each - lid from each port. From this information we determine - how best to distribute the LID range across the ports - that can reach those LIDs. - */ - port = osm_switch_recommend_path(p_sw, p_port, lid_ho, start_from, - p_mgr->p_subn->ignore_existing_lfts, - p_mgr->is_dor); - - if (port == OSM_NO_PATH) { - /* do not try to overwrite the ppro of non existing port ... */ - is_ignored_by_port_prof = TRUE; - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "No path to get to LID %u from switch 0x%" PRIx64 "\n", - lid_ho, cl_ntoh64(node_guid)); - } else { - osm_physp_t *p = osm_node_get_physp_ptr(p_sw->p_node, port); - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Routing LID %u to port %u for switch 0x%" PRIx64 "\n", - lid_ho, port, cl_ntoh64(node_guid)); - - /* - we would like to optionally ignore this port in equalization - as in the case of the Mellanox Anafa Internal PCI TCA port - */ - is_ignored_by_port_prof = p->is_prof_ignored; - - /* - We also would ignore this route if the target lid is of - a switch and the port_profile_switch_node is not TRUE - */ - if (!p_mgr->p_subn->opt.port_profile_switch_nodes) - is_ignored_by_port_prof |= - (osm_node_get_type(p_port->p_node) == - IB_NODE_TYPE_SWITCH); - } - - /* - We have selected the port for this LID. - Write it to the forwarding tables. - */ - p_sw->new_lft[lid_ho] = port; - if (!is_ignored_by_port_prof) { - struct osm_remote_node *rem_node_used; - osm_switch_count_path(p_sw, port); - if (port > 0 && p_port->priv && - (rem_node_used = find_and_add_remote_sys(p_sw, port, - p_mgr->is_dor, - p_port->priv))) - rem_node_used->forwarded_to++; - } - -Exit: - OSM_LOG_EXIT(p_mgr->p_log); -} - -static void alloc_ports_priv(osm_ucast_mgr_t * mgr) -{ - cl_qmap_t *port_tbl = &mgr->p_subn->port_guid_tbl; - struct osm_remote_guids_count *r; - osm_port_t *port; - cl_map_item_t *item; - unsigned lmc; - - for (item = cl_qmap_head(port_tbl); item != cl_qmap_end(port_tbl); - item = cl_qmap_next(item)) { - port = (osm_port_t *) item; - lmc = ib_port_info_get_lmc(&port->p_physp->port_info); - if (!lmc) - continue; - r = malloc(sizeof(*r) + sizeof(r->guids[0]) * (1 << lmc)); - if (!r) { - OSM_LOG(mgr->p_log, OSM_LOG_ERROR, "ERR 3A09: " - "cannot allocate memory to track remote" - " systems for lmc > 0\n"); - port->priv = NULL; - continue; - } - memset(r, 0, sizeof(*r) + sizeof(r->guids[0]) * (1 << lmc)); - port->priv = r; - } -} - -static void free_ports_priv(osm_ucast_mgr_t * mgr) -{ - cl_qmap_t *port_tbl = &mgr->p_subn->port_guid_tbl; - osm_port_t *port; - cl_map_item_t *item; - for (item = cl_qmap_head(port_tbl); item != cl_qmap_end(port_tbl); - item = cl_qmap_next(item)) { - port = (osm_port_t *) item; - if (port->priv) { - free(port->priv); - port->priv = NULL; - } - } -} - -static void ucast_mgr_process_tbl(IN cl_map_item_t * p_map_item, - IN void *context) -{ - osm_ucast_mgr_t *p_mgr = context; - osm_switch_t * p_sw = (osm_switch_t *) p_map_item; - unsigned i, lids_per_port; - - OSM_LOG_ENTER(p_mgr->p_log); - - CL_ASSERT(p_sw && p_sw->p_node); - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Processing switch 0x%" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node))); - - /* Initialize LIDs in buffer to invalid port number. */ - memset(p_sw->new_lft, OSM_NO_PATH, p_sw->max_lid_ho + 1); - - if (p_mgr->p_subn->opt.lmc) - alloc_ports_priv(p_mgr); - - /* - Iterate through every port setting LID routes for each - port based on base LID and LMC value. - */ - lids_per_port = 1 << p_mgr->p_subn->opt.lmc; - for (i = 0; i < lids_per_port; i++) { - cl_qlist_t *list = &p_mgr->port_order_list; - cl_list_item_t *item; - for (item = cl_qlist_head(list); item != cl_qlist_end(list); - item = cl_qlist_next(item)) { -#ifndef __WIN__ - osm_port_t *port=cl_item_obj(item, port, list_item); -#else - osm_port_t *port=NULL; // skip uninitialized var err - port = cl_item_obj(item, port, list_item); -#endif - ucast_mgr_process_port(p_mgr, p_sw, port, i); - } - } - - if (p_mgr->p_subn->opt.lmc) - free_ports_priv(p_mgr); - - OSM_LOG_EXIT(p_mgr->p_log); -} - -static void ucast_mgr_process_neighbors(IN cl_map_item_t * p_map_item, - IN void *context) -{ - osm_switch_t * p_sw = (osm_switch_t *) p_map_item; - osm_ucast_mgr_t * p_mgr = context; - osm_node_t *p_node; - osm_node_t *p_remote_node; - uint32_t port_num; - uint8_t remote_port_num; - uint32_t num_ports; - osm_physp_t *p_physp; - - OSM_LOG_ENTER(p_mgr->p_log); - - p_node = p_sw->p_node; - - CL_ASSERT(p_node); - CL_ASSERT(osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH); - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Processing switch with GUID 0x%" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_node))); - - num_ports = osm_node_get_num_physp(p_node); - - /* - Start with port 1 to skip the switch's management port. - */ - for (port_num = 1; port_num < num_ports; port_num++) { - p_remote_node = osm_node_get_remote_node(p_node, - (uint8_t) port_num, - &remote_port_num); - if (p_remote_node && p_remote_node->sw - && (p_remote_node != p_node)) { - /* make sure the link is healthy. If it is not - don't - propagate through it. */ - p_physp = osm_node_get_physp_ptr(p_node, port_num); - if (!p_physp || !osm_link_is_healthy(p_physp)) - continue; - - ucast_mgr_process_neighbor(p_mgr, p_sw, - p_remote_node->sw, - (uint8_t) port_num, - remote_port_num); - } - } - - OSM_LOG_EXIT(p_mgr->p_log); -} - -static int set_hop_wf(void *ctx, uint64_t guid, char *p) -{ - osm_ucast_mgr_t *m = ctx; - osm_node_t *node = osm_get_node_by_guid(m->p_subn, cl_hton64(guid)); - osm_physp_t *physp; - unsigned port, hop_wf; - char *e; - - if (!node || !node->sw) { - OSM_LOG(m->p_log, OSM_LOG_DEBUG, - "switch with guid 0x%016" PRIx64 " is not found\n", - guid); - return 0; - } - - if (!p || !*p || !(port = strtoul(p, &e, 0)) || (p == e) || - port >= node->sw->num_ports) { - OSM_LOG(m->p_log, OSM_LOG_DEBUG, - "bad port specified for guid 0x%016" PRIx64 "\n", guid); - return 0; - } - - p = e + 1; - - if (!*p || !(hop_wf = strtoul(p, &e, 0)) || p == e || hop_wf >= 0x100) { - OSM_LOG(m->p_log, OSM_LOG_DEBUG, - "bad hop weight factor specified for guid 0x%016" PRIx64 - "port %u\n", guid, port); - return 0; - } - - physp = osm_node_get_physp_ptr(node, port); - if (!physp) - return 0; - - physp->hop_wf = hop_wf; - - return 0; -} - -static void set_default_hop_wf(cl_map_item_t * p_map_item, void *ctx) -{ - osm_switch_t *sw = (osm_switch_t *) p_map_item; - int i; - - for (i = 1; i < sw->num_ports; i++) { - osm_physp_t *p = osm_node_get_physp_ptr(sw->p_node, i); - if (p) - p->hop_wf = 1; - } -} - -static int set_dimn_ports(void *ctx, uint64_t guid, char *p) -{ - osm_subn_t *p_subn = ctx; - osm_node_t *node = osm_get_node_by_guid(p_subn, cl_hton64(guid)); - osm_switch_t *sw; - uint8_t *dimn_ports = NULL; - uint8_t port; - unsigned int *ports = NULL; - const int bpw = sizeof(*ports)*8; - int words; - int i = 1; /* port 0 maps to port 0 */ - - if (!node || !(sw = node->sw)) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_VERBOSE, - "switch with guid 0x%016" PRIx64 " is not found\n", - guid); - return 0; - } - - if (sw->dimn_ports) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_VERBOSE, - "switch with guid 0x%016" PRIx64 " already listed\n", - guid); - return 0; - } - - dimn_ports = malloc(sizeof(*dimn_ports)*sw->num_ports); - if (!dimn_ports) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_ERROR, - "ERR 3A07: cannot allocate memory for dimn_ports\n"); - return -1; - } - memset(dimn_ports, 0, sizeof(*dimn_ports)*sw->num_ports); - - /* the ports array is for record keeping of which ports have - * been seen */ - words = (sw->num_ports + bpw - 1)/bpw; - ports = malloc(words*sizeof(*ports)); - if (!ports) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_ERROR, - "ERR 3A08: cannot allocate memory for ports\n"); - return -1; - } - memset(ports, 0, words*sizeof(*ports)); - - while ((*p != '\0') && (*p != '#')) { - char *e; - - port = strtoul(p, &e, 0); - if ((p == e) || (port == 0) || (port >= sw->num_ports) || - !osm_node_get_physp_ptr(node, port)) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_VERBOSE, - "bad port %d specified for guid 0x%016" PRIx64 "\n", - port, guid); - free(dimn_ports); - free(ports); - return 0; - } - - if (ports[port/bpw] & (1u << (port%bpw))) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_VERBOSE, - "port %d already specified for guid 0x%016" PRIx64 "\n", - port, guid); - free(dimn_ports); - free(ports); - return 0; - } - - ports[port/bpw] |= (1u << (port%bpw)); - dimn_ports[i++] = port; - - p = e; - while (isspace(*p)) { - p++; - } - } - - if (i > 1) { - for (port = 1; port < sw->num_ports; port++) { - /* fill out the rest of the dimn_ports array - * in sequence using the remaining unspecified - * ports. - */ - if (!(ports[port/bpw] & (1u << (port%bpw)))) { - dimn_ports[i++] = port; - } - } - sw->dimn_ports = dimn_ports; - } else { - free(dimn_ports); - } - - free(ports); - return 0; -} - -int osm_ucast_mgr_build_lid_matrices(IN osm_ucast_mgr_t * p_mgr) -{ - uint32_t i; - uint32_t iteration_max; - cl_qmap_t *p_sw_guid_tbl; - - p_sw_guid_tbl = &p_mgr->p_subn->sw_guid_tbl; - - OSM_LOG(p_mgr->p_log, OSM_LOG_VERBOSE, - "Starting switches' Min Hop Table Assignment\n"); - - /* - Set up the weighting factors for the routing. - */ - cl_qmap_apply_func(p_sw_guid_tbl, set_default_hop_wf, NULL); - if (p_mgr->p_subn->opt.hop_weights_file) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Fetching hop weight factor file \'%s\'\n", - p_mgr->p_subn->opt.hop_weights_file); - if (parse_node_map(p_mgr->p_subn->opt.hop_weights_file, - set_hop_wf, p_mgr)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 3A05: " - "cannot parse hop_weights_file \'%s\'\n", - p_mgr->p_subn->opt.hop_weights_file); - } - } - - /* - Set the switch matrices for each switch's own port 0 LID(s) - then set the lid matrices for the each switch's leaf nodes. - */ - cl_qmap_apply_func(p_sw_guid_tbl, ucast_mgr_process_hop_0_1, p_mgr); - - /* - Get the switch matrices for each switch's neighbors. - This process requires a number of iterations equal to - the number of switches in the subnet minus 1. - - In each iteration, a switch learns the lid/port/hop - information (as contained by a switch's lid matrix) from - its immediate neighbors. After each iteration, a switch - (and it's neighbors) know more routing information than - it did on the previous iteration. - Thus, by repeatedly absorbing the routing information of - neighbor switches, every switch eventually learns how to - route all LIDs on the subnet. - - Note that there may not be any switches in the subnet if - we are in simple p2p configuration. - */ - iteration_max = cl_qmap_count(p_sw_guid_tbl); - - /* - If there are switches in the subnet, iterate until the lid - matrix has been constructed. Otherwise, just immediately - indicate we're done if no switches exist. - */ - if (iteration_max) { - iteration_max--; - - /* - we need to find out when the propagation of - hop counts has relaxed. So this global variable - is preset to 0 on each iteration and if - if non of the switches was set will exit the - while loop - */ - p_mgr->some_hop_count_set = TRUE; - for (i = 0; (i < iteration_max) && p_mgr->some_hop_count_set; - i++) { - p_mgr->some_hop_count_set = FALSE; - cl_qmap_apply_func(p_sw_guid_tbl, - ucast_mgr_process_neighbors, p_mgr); - } - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Min-hop propagated in %d steps\n", i); - } - - return 0; -} - -static int ucast_mgr_setup_all_switches(osm_subn_t * p_subn) -{ - osm_switch_t *p_sw; - uint16_t lids; - - lids = (uint16_t) cl_ptr_vector_get_size(&p_subn->port_lid_tbl); - lids = lids ? lids - 1 : 0; - - for (p_sw = (osm_switch_t *) cl_qmap_head(&p_subn->sw_guid_tbl); - p_sw != (osm_switch_t *) cl_qmap_end(&p_subn->sw_guid_tbl); - p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item)) { - if (osm_switch_prepare_path_rebuild(p_sw, lids)) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_ERROR, "ERR 3A0B: " - "cannot setup switch 0x%016" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid - (p_sw->p_node))); - return -1; - } - if (p_sw->dimn_ports) { - free(p_sw->dimn_ports); - p_sw->dimn_ports = NULL; - } - } - - if (p_subn->opt.dimn_ports_file) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_DEBUG, - "Fetching dimension ports file \'%s\'\n", - p_subn->opt.dimn_ports_file); - if (parse_node_map(p_subn->opt.dimn_ports_file, - set_dimn_ports, p_subn)) { - OSM_LOG(&p_subn->p_osm->log, OSM_LOG_ERROR, "ERR 3A05: " - "cannot parse dimn_ports_file \'%s\'\n", - p_subn->opt.dimn_ports_file); - } - } - - return 0; -} - -static int add_guid_to_order_list(void *ctx, uint64_t guid, char *p) -{ - osm_ucast_mgr_t *m = ctx; - osm_port_t *port = osm_get_port_by_guid(m->p_subn, cl_hton64(guid)); - - if (!port) { - OSM_LOG(m->p_log, OSM_LOG_DEBUG, - "port guid not found: 0x%016" PRIx64 "\n", guid); - return 0; - } - - if (port->flag) { - OSM_LOG(m->p_log, OSM_LOG_DEBUG, - "port guid specified multiple times 0x%016" PRIx64 "\n", - guid); - return 0; - } - - cl_qlist_insert_tail(&m->port_order_list, &port->list_item); - port->flag = 1; - - return 0; -} - -static void add_port_to_order_list(cl_map_item_t * p_map_item, void *ctx) -{ - osm_port_t *port = (osm_port_t *) p_map_item; - osm_ucast_mgr_t *m = ctx; - - if (!port->flag) - cl_qlist_insert_tail(&m->port_order_list, &port->list_item); - else - port->flag = 0; -} - -static int mark_ignored_port(void *ctx, uint64_t guid, char *p) -{ - osm_ucast_mgr_t *m = ctx; - osm_node_t *node = osm_get_node_by_guid(m->p_subn, cl_hton64(guid)); - osm_physp_t *physp; - unsigned port; - - if (!node || !node->sw) { - OSM_LOG(m->p_log, OSM_LOG_DEBUG, - "switch with guid 0x%016" PRIx64 " is not found\n", - guid); - return 0; - } - - if (!p || !*p || !(port = strtoul(p, NULL, 0)) || - port >= node->sw->num_ports) { - OSM_LOG(m->p_log, OSM_LOG_DEBUG, - "bad port specified for guid 0x%016" PRIx64 "\n", guid); - return 0; - } - - physp = osm_node_get_physp_ptr(node, port); - if (!physp) - return 0; - - physp->is_prof_ignored = 1; - - return 0; -} - -static void clear_prof_ignore_flag(cl_map_item_t * p_map_item, void *ctx) -{ - osm_switch_t *sw = (osm_switch_t *) p_map_item; - int i; - - for (i = 1; i < sw->num_ports; i++) { - osm_physp_t *p = osm_node_get_physp_ptr(sw->p_node, i); - if (p) - p->is_prof_ignored = 0; - } -} - -static void add_sw_endports_to_order_list(osm_switch_t * sw, - osm_ucast_mgr_t * m) -{ - osm_port_t *port; - osm_physp_t *p; - int i; - - for (i = 1; i < sw->num_ports; i++) { - p = osm_node_get_physp_ptr(sw->p_node, i); - if (p && p->p_remote_physp && !p->p_remote_physp->p_node->sw) { - port = osm_get_port_by_guid(m->p_subn, - p->p_remote_physp-> - port_guid); - cl_qlist_insert_tail(&m->port_order_list, - &port->list_item); - port->flag = 1; - } - } -} - -static void sw_count_endport_links(osm_switch_t * sw) -{ - osm_physp_t *p; - int i; - - sw->endport_links = 0; - for (i = 1; i < sw->num_ports; i++) { - p = osm_node_get_physp_ptr(sw->p_node, i); - if (p && p->p_remote_physp && !p->p_remote_physp->p_node->sw) - sw->endport_links++; - } -} - -static int OSM_CDECL compar_sw_load(const void *s1, const void *s2) -{ -#define get_sw_endport_links(s) (*(osm_switch_t **)s)->endport_links - return get_sw_endport_links(s2) - get_sw_endport_links(s1); -} - -static void sort_ports_by_switch_load(osm_ucast_mgr_t * m) -{ - int i, num = cl_qmap_count(&m->p_subn->sw_guid_tbl); - void **s = malloc(num * sizeof(*s)); - if (!s) { - OSM_LOG(m->p_log, OSM_LOG_ERROR, "ERR 3A0C: " - "No memory, skip by switch load sorting.\n"); - return; - } - s[0] = cl_qmap_head(&m->p_subn->sw_guid_tbl); - for (i = 1; i < num; i++) - s[i] = cl_qmap_next(s[i - 1]); - - for (i = 0; i < num; i++) - sw_count_endport_links(s[i]); - - qsort(s, num, sizeof(*s), compar_sw_load); - - for (i = 0; i < num; i++) - add_sw_endports_to_order_list(s[i], m); - free(s); -} - -static int ucast_mgr_build_lfts(osm_ucast_mgr_t * p_mgr) -{ - cl_qlist_init(&p_mgr->port_order_list); - - if (p_mgr->p_subn->opt.guid_routing_order_file) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Fetching guid routing order file \'%s\'\n", - p_mgr->p_subn->opt.guid_routing_order_file); - - if (parse_node_map(p_mgr->p_subn->opt.guid_routing_order_file, - add_guid_to_order_list, p_mgr)) - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 3A0D: " - "cannot parse guid routing order file \'%s\'\n", - p_mgr->p_subn->opt.guid_routing_order_file); - } else - sort_ports_by_switch_load(p_mgr); - - if (p_mgr->p_subn->opt.port_prof_ignore_file) { - cl_qmap_apply_func(&p_mgr->p_subn->sw_guid_tbl, - clear_prof_ignore_flag, NULL); - if (parse_node_map(p_mgr->p_subn->opt.port_prof_ignore_file, - mark_ignored_port, p_mgr)) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 3A0E: " - "cannot parse port prof ignore file \'%s\'\n", - p_mgr->p_subn->opt.port_prof_ignore_file); - } - } - - cl_qmap_apply_func(&p_mgr->p_subn->port_guid_tbl, - add_port_to_order_list, p_mgr); - - cl_qmap_apply_func(&p_mgr->p_subn->sw_guid_tbl, ucast_mgr_process_tbl, - p_mgr); - - cl_qlist_remove_all(&p_mgr->port_order_list); - - return 0; -} - -static void ucast_mgr_set_fwd_top(IN cl_map_item_t * p_map_item, - IN void *cxt) -{ - osm_ucast_mgr_t *p_mgr = cxt; - osm_switch_t * p_sw = (osm_switch_t *) p_map_item; - osm_node_t *p_node; - osm_dr_path_t *p_path; - osm_madw_context_t context; - ib_api_status_t status; - ib_switch_info_t si; - boolean_t set_swinfo_require = FALSE; - uint16_t lin_top; - uint8_t life_state; - - CL_ASSERT(p_mgr); - - OSM_LOG_ENTER(p_mgr->p_log); - - CL_ASSERT(p_sw); - - p_node = p_sw->p_node; - - CL_ASSERT(p_node); - - if (p_mgr->max_lid < p_sw->max_lid_ho) - p_mgr->max_lid = p_sw->max_lid_ho; - - p_path = osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_node, 0)); - - /* - Set the top of the unicast forwarding table. - */ - si = p_sw->switch_info; - lin_top = cl_hton16(p_sw->max_lid_ho); - if (lin_top != si.lin_top) { - set_swinfo_require = TRUE; - si.lin_top = lin_top; - } - - /* check to see if the change state bit is on. If it is - then we - need to clear it. */ - if (ib_switch_info_get_state_change(&si)) - life_state = ((p_mgr->p_subn->opt.packet_life_time << 3) - | (si.life_state & IB_SWITCH_PSC)) & 0xfc; - else - life_state = (p_mgr->p_subn->opt.packet_life_time << 3) & 0xf8; - - if (life_state != si.life_state || ib_switch_info_get_state_change(&si)) { - set_swinfo_require = TRUE; - si.life_state = life_state; - } - - if (set_swinfo_require) { - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Setting switch FT top to LID %u\n", p_sw->max_lid_ho); - - context.si_context.light_sweep = FALSE; - context.si_context.node_guid = osm_node_get_node_guid(p_node); - context.si_context.set_method = TRUE; - - status = osm_req_set(p_mgr->sm, p_path, (uint8_t *) & si, - sizeof(si), IB_MAD_ATTR_SWITCH_INFO, - 0, CL_DISP_MSGID_NONE, &context); - - if (status != IB_SUCCESS) - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 3A06: " - "Sending SwitchInfo attribute failed (%s)\n", - ib_get_err_str(status)); - } - - OSM_LOG_EXIT(p_mgr->p_log); -} - -static int set_lft_block(IN osm_switch_t *p_sw, IN osm_ucast_mgr_t *p_mgr, - IN uint16_t block_id_ho) -{ - uint8_t block[IB_SMP_DATA_SIZE]; - osm_madw_context_t context; - osm_dr_path_t *p_path; - ib_api_status_t status; - - /* - Send linear forwarding table blocks to the switch - as long as the switch indicates it has blocks needing - configuration. - */ - if (!p_sw->new_lft) { - /* any routing should provide the new_lft */ - CL_ASSERT(p_mgr->p_subn->opt.use_ucast_cache && - p_mgr->cache_valid && !p_sw->need_update); - return -1; - } - - p_path = osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_sw->p_node, 0)); - - context.lft_context.node_guid = osm_node_get_node_guid(p_sw->p_node); - context.lft_context.set_method = TRUE; - - if (!osm_switch_get_lft_block(p_sw, block_id_ho, block) || - (!p_sw->need_update && !p_mgr->p_subn->need_update && - !memcmp(block, p_sw->new_lft + block_id_ho * IB_SMP_DATA_SIZE, - IB_SMP_DATA_SIZE))) - return 0; - - OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, - "Writing FT block %u to switch 0x%" PRIx64 "\n", block_id_ho, - cl_ntoh64(context.lft_context.node_guid)); - - status = osm_req_set(p_mgr->sm, p_path, - p_sw->new_lft + block_id_ho * IB_SMP_DATA_SIZE, - IB_SMP_DATA_SIZE, IB_MAD_ATTR_LIN_FWD_TBL, - cl_hton32(block_id_ho), - CL_DISP_MSGID_NONE, &context); - if (status != IB_SUCCESS) { - OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 3A05: " - "Sending linear fwd. tbl. block failed (%s)\n", - ib_get_err_str(status)); - return -1; - } - - return 0; -} - -static void ucast_mgr_pipeline_fwd_tbl(osm_ucast_mgr_t * p_mgr) -{ - cl_qmap_t *tbl; - cl_map_item_t *item; - unsigned i, max_block = p_mgr->max_lid / 64 + 1; - - tbl = &p_mgr->p_subn->sw_guid_tbl; - for (i = 0; i < max_block; i++) - for (item = cl_qmap_head(tbl); item != cl_qmap_end(tbl); - item = cl_qmap_next(item)) - set_lft_block((osm_switch_t *)item, p_mgr, i); -} - -void osm_ucast_mgr_set_fwd_tables(osm_ucast_mgr_t * p_mgr) -{ - p_mgr->max_lid = 0; - - cl_qmap_apply_func(&p_mgr->p_subn->sw_guid_tbl, ucast_mgr_set_fwd_top, - p_mgr); - - ucast_mgr_pipeline_fwd_tbl(p_mgr); -} - -static int ucast_mgr_route(struct osm_routing_engine *r, osm_opensm_t * osm) -{ - int ret; - - OSM_LOG(&osm->log, OSM_LOG_VERBOSE, - "building routing with \'%s\' routing algorithm...\n", r->name); - - if (!r->build_lid_matrices || - (ret = r->build_lid_matrices(r->context)) > 0) - ret = osm_ucast_mgr_build_lid_matrices(&osm->sm.ucast_mgr); - - if (ret < 0) { - OSM_LOG(&osm->log, OSM_LOG_ERROR, - "%s: cannot build lid matrices.\n", r->name); - return ret; - } - - if (!r->ucast_build_fwd_tables || - (ret = r->ucast_build_fwd_tables(r->context)) > 0) - ret = ucast_mgr_build_lfts(&osm->sm.ucast_mgr); - - if (ret < 0) { - OSM_LOG(&osm->log, OSM_LOG_ERROR, - "%s: cannot build fwd tables.\n", r->name); - return ret; - } - - osm->routing_engine_used = osm_routing_engine_type(r->name); - - osm_ucast_mgr_set_fwd_tables(&osm->sm.ucast_mgr); - - return 0; -} - -int osm_ucast_mgr_process(IN osm_ucast_mgr_t * p_mgr) -{ - osm_opensm_t *p_osm; - struct osm_routing_engine *p_routing_eng; - cl_qmap_t *p_sw_guid_tbl; - - OSM_LOG_ENTER(p_mgr->p_log); - - p_sw_guid_tbl = &p_mgr->p_subn->sw_guid_tbl; - p_osm = p_mgr->p_subn->p_osm; - p_routing_eng = p_osm->routing_engine_list; - - CL_PLOCK_EXCL_ACQUIRE(p_mgr->p_lock); - - /* - If there are no switches in the subnet, we are done. - */ - if (cl_qmap_count(p_sw_guid_tbl) == 0 || - ucast_mgr_setup_all_switches(p_mgr->p_subn) < 0) - goto Exit; - - p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_NONE; - while (p_routing_eng) { - if (!ucast_mgr_route(p_routing_eng, p_osm)) - break; - p_routing_eng = p_routing_eng->next; - } - - if (p_osm->routing_engine_used == OSM_ROUTING_ENGINE_TYPE_NONE) { - /* If configured routing algorithm failed, use default MinHop */ - osm_ucast_mgr_build_lid_matrices(p_mgr); - ucast_mgr_build_lfts(p_mgr); - osm_ucast_mgr_set_fwd_tables(p_mgr); - p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_MINHOP; - } - - OSM_LOG(p_mgr->p_log, OSM_LOG_INFO, - "%s tables configured on all switches\n", - osm_routing_engine_type_str(p_osm->routing_engine_used)); - - if (p_mgr->p_subn->opt.use_ucast_cache) - p_mgr->cache_valid = TRUE; - -Exit: - CL_PLOCK_RELEASE(p_mgr->p_lock); - OSM_LOG_EXIT(p_mgr->p_log); - return 0; -} - -static int ucast_build_lid_matrices(void *context) -{ - return osm_ucast_mgr_build_lid_matrices(context); -} - -static int ucast_build_lfts(void *context) -{ - return ucast_mgr_build_lfts(context); -} - -int osm_ucast_minhop_setup(struct osm_routing_engine *r, osm_opensm_t * osm) -{ - r->context = &osm->sm.ucast_mgr; - r->build_lid_matrices = ucast_build_lid_matrices; - r->ucast_build_fwd_tables = ucast_build_lfts; - return 0; -} - -static int ucast_dor_build_lfts(void *context) -{ - osm_ucast_mgr_t *mgr = context; - int ret; - - mgr->is_dor = 1; - ret = ucast_mgr_build_lfts(mgr); - mgr->is_dor = 0; - - return ret; -} - -int osm_ucast_dor_setup(struct osm_routing_engine *r, osm_opensm_t * osm) -{ - r->context = &osm->sm.ucast_mgr; - r->build_lid_matrices = ucast_build_lid_matrices; - r->ucast_build_fwd_tables = ucast_dor_build_lfts; - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_ucast_updn.c b/branches/opensm_3/user/opensm/osm_ucast_updn.c deleted file mode 100644 index e6674889..00000000 --- a/branches/opensm_3/user/opensm/osm_ucast_updn.c +++ /dev/null @@ -1,668 +0,0 @@ -/* - * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007,2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of Up Down Algorithm using ranking & Min Hop - * Calculation functions - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include - -/* //////////////////////////// */ -/* Local types */ -/* //////////////////////////// */ - -/* direction */ -typedef enum updn_switch_dir { - UP = 0, - DOWN -} updn_switch_dir_t; - -/* updn structure */ -typedef struct updn { - unsigned num_roots; - osm_opensm_t *p_osm; -} updn_t; - -struct updn_node { - cl_list_item_t list; - osm_switch_t *sw; - uint64_t id; - updn_switch_dir_t dir; - unsigned rank; - unsigned visited; -}; - -/* This function returns direction based on rank and guid info of current & - remote ports */ -static updn_switch_dir_t updn_get_dir(unsigned cur_rank, unsigned rem_rank, - uint64_t cur_id, uint64_t rem_id) -{ - /* HACK: comes to solve root nodes connection, in a classic subnet root nodes do not connect - directly, but in case they are we assign to root node an UP direction to allow UPDN to discover - the subnet correctly (and not from the point of view of the last root node). - */ - if (!cur_rank && !rem_rank) - return UP; - - if (cur_rank < rem_rank) - return DOWN; - else if (cur_rank > rem_rank) - return UP; - else { - /* Equal rank, decide by id number, bigger == UP direction */ - if (cur_id > rem_id) - return UP; - else - return DOWN; - } -} - -/********************************************************************** - * This function does the bfs of min hop table calculation by guid index - * as a starting point. - **********************************************************************/ -static int updn_bfs_by_node(IN osm_log_t * p_log, IN osm_subn_t * p_subn, - IN osm_switch_t * p_sw) -{ - uint8_t pn, pn_rem; - cl_qlist_t list; - uint16_t lid; - struct updn_node *u; - updn_switch_dir_t next_dir, current_dir; - - OSM_LOG_ENTER(p_log); - - lid = osm_node_get_base_lid(p_sw->p_node, 0); - lid = cl_ntoh16(lid); - osm_switch_set_hops(p_sw, lid, 0, 0); - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Starting from switch - port GUID 0x%" PRIx64 " lid %u\n", - cl_ntoh64(p_sw->p_node->node_info.port_guid), lid); - - u = p_sw->priv; - u->dir = UP; - - /* Update list with the new element */ - cl_qlist_init(&list); - cl_qlist_insert_tail(&list, &u->list); - - /* BFS the list till no next element */ - while (!cl_is_qlist_empty(&list)) { - u = (struct updn_node *)cl_qlist_remove_head(&list); - u->visited = 0; /* cleanup */ - current_dir = u->dir; - /* Go over all ports of the switch and find unvisited remote nodes */ - for (pn = 1; pn < u->sw->num_ports; pn++) { - osm_node_t *p_remote_node; - struct updn_node *rem_u; - uint8_t current_min_hop, remote_min_hop, - set_hop_return_value; - osm_switch_t *p_remote_sw; - - p_remote_node = - osm_node_get_remote_node(u->sw->p_node, pn, - &pn_rem); - /* If no remote node OR remote node is not a SWITCH - continue to next pn */ - if (!p_remote_node || !p_remote_node->sw) - continue; - /* Fetch remote guid only after validation of remote node */ - p_remote_sw = p_remote_node->sw; - rem_u = p_remote_sw->priv; - /* Decide which direction to mark it (UP/DOWN) */ - next_dir = updn_get_dir(u->rank, rem_u->rank, - u->id, rem_u->id); - - /* Check if this is a legal step : the only illegal step is going - from DOWN to UP */ - if ((current_dir == DOWN) && (next_dir == UP)) { - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Avoiding move from 0x%016" PRIx64 - " to 0x%016" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(u->sw->p_node)), - cl_ntoh64(osm_node_get_node_guid(p_remote_node))); - /* Illegal step */ - continue; - } - /* Set MinHop value for the current lid */ - current_min_hop = osm_switch_get_least_hops(u->sw, lid); - /* Check hop count if better insert into list && update - the remote node Min Hop Table */ - remote_min_hop = - osm_switch_get_hop_count(p_remote_sw, lid, pn_rem); - if (current_min_hop + 1 < remote_min_hop) { - set_hop_return_value = - osm_switch_set_hops(p_remote_sw, lid, - pn_rem, - current_min_hop + 1); - if (set_hop_return_value) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR AA01: " - "Invalid value returned from set min hop is: %d\n", - set_hop_return_value); - } - /* Check if remote port has already been visited */ - if (!rem_u->visited) { - /* Insert updn_switch item into the list */ - rem_u->dir = next_dir; - rem_u->visited = 1; - cl_qlist_insert_tail(&list, - &rem_u->list); - } - } - } - } - - OSM_LOG_EXIT(p_log); - return 0; -} - -/* NOTE : PLS check if we need to decide that the first */ -/* rank is a SWITCH for BFS purpose */ -static int updn_subn_rank(IN updn_t * p_updn) -{ - osm_switch_t *p_sw; - osm_physp_t *p_physp, *p_remote_physp; - cl_qlist_t list; - cl_map_item_t *item; - struct updn_node *u, *remote_u; - uint8_t num_ports, port_num; - osm_log_t *p_log = &p_updn->p_osm->log; - unsigned max_rank = 0; - - OSM_LOG_ENTER(p_log); - cl_qlist_init(&list); - - /* add all roots to the list */ - for (item = cl_qmap_head(&p_updn->p_osm->subn.sw_guid_tbl); - item != cl_qmap_end(&p_updn->p_osm->subn.sw_guid_tbl); - item = cl_qmap_next(item)) { - p_sw = (osm_switch_t *)item; - u = p_sw->priv; - if (!u->rank) - cl_qlist_insert_tail(&list, &u->list); - } - - /* BFS the list till it's empty */ - while (!cl_is_qlist_empty(&list)) { - u = (struct updn_node *)cl_qlist_remove_head(&list); - /* Go over all remote nodes and rank them (if not already visited) */ - p_sw = u->sw; - num_ports = p_sw->num_ports; - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Handling switch GUID 0x%" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node))); - for (port_num = 1; port_num < num_ports; port_num++) { - ib_net64_t port_guid; - - /* Current port fetched in order to get remote side */ - p_physp = - osm_node_get_physp_ptr(p_sw->p_node, port_num); - - if (!p_physp) - continue; - - p_remote_physp = p_physp->p_remote_physp; - - /* - make sure that all the following occur on p_remote_physp: - 1. The port isn't NULL - 2. It is a switch - */ - if (p_remote_physp && p_remote_physp->p_node->sw) { - remote_u = p_remote_physp->p_node->sw->priv; - port_guid = p_remote_physp->port_guid; - - if (remote_u->rank > u->rank + 1) { - remote_u->rank = u->rank + 1; - max_rank = remote_u->rank; - cl_qlist_insert_tail(&list, - &remote_u->list); - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Rank of port GUID 0x%" PRIx64 - " = %u\n", cl_ntoh64(port_guid), - remote_u->rank); - } - } - } - } - - /* Print Summary of ranking */ - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Subnet ranking completed. Max Node Rank = %d\n", max_rank); - OSM_LOG_EXIT(p_log); - return 0; -} - -/* hack: preserve min hops entries to any other root switches */ -static void updn_clear_non_root_hops(updn_t * updn, osm_switch_t * sw) -{ - osm_port_t *port; - unsigned i; - - for (i = 0; i < sw->num_hops; i++) - if (sw->hops[i]) { - port = osm_get_port_by_lid_ho(&updn->p_osm->subn, i); - if (!port || !port->p_node->sw - || ((struct updn_node *)port->p_node->sw->priv)-> - rank != 0) - memset(sw->hops[i], 0xff, sw->num_ports); - } -} - -static int updn_set_min_hop_table(IN updn_t * p_updn) -{ - osm_subn_t *p_subn = &p_updn->p_osm->subn; - osm_log_t *p_log = &p_updn->p_osm->log; - osm_switch_t *p_sw; - cl_map_item_t *item; - - OSM_LOG_ENTER(p_log); - - /* Go over all the switches in the subnet - for each init their Min Hop - Table */ - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Init Min Hop Table of all switches [\n"); - - for (item = cl_qmap_head(&p_updn->p_osm->subn.sw_guid_tbl); - item != cl_qmap_end(&p_updn->p_osm->subn.sw_guid_tbl); - item = cl_qmap_next(item)) { - p_sw = (osm_switch_t *)item; - /* Clear Min Hop Table */ - if (p_subn->opt.connect_roots) - updn_clear_non_root_hops(p_updn, p_sw); - else - osm_switch_clear_hops(p_sw); - } - - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "Init Min Hop Table of all switches ]\n"); - - /* Now do the BFS for each port in the subnet */ - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "BFS through all port guids in the subnet [\n"); - - for (item = cl_qmap_head(&p_updn->p_osm->subn.sw_guid_tbl); - item != cl_qmap_end(&p_updn->p_osm->subn.sw_guid_tbl); - item = cl_qmap_next(item)) { - p_sw = (osm_switch_t *)item; - updn_bfs_by_node(p_log, p_subn, p_sw); - } - - OSM_LOG(p_log, OSM_LOG_VERBOSE, - "BFS through all port guids in the subnet ]\n"); - /* Cleanup */ - OSM_LOG_EXIT(p_log); - return 0; -} - -static int updn_build_lid_matrices(IN updn_t * p_updn) -{ - int status; - - OSM_LOG_ENTER(&p_updn->p_osm->log); - - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_VERBOSE, - "Ranking all port guids in the list\n"); - if (!p_updn->num_roots) { - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_ERROR, "ERR AA0A: " - "No guids were provided or number of guids is 0\n"); - status = -1; - goto _exit; - } - - /* Check if it's not a switched subnet */ - if (cl_is_qmap_empty(&p_updn->p_osm->subn.sw_guid_tbl)) { - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_ERROR, "ERR AAOB: " - "This is not a switched subnet, cannot perform UPDN algorithm\n"); - status = -1; - goto _exit; - } - - /* Rank the subnet switches */ - updn_subn_rank(p_updn); - - /* After multiple ranking need to set Min Hop Table by UpDn algorithm */ - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_VERBOSE, - "Setting all switches' Min Hop Table\n"); - status = updn_set_min_hop_table(p_updn); - -_exit: - OSM_LOG_EXIT(&p_updn->p_osm->log); - return status; -} - -static struct updn_node *create_updn_node(osm_switch_t * sw) -{ - struct updn_node *u; - - u = malloc(sizeof(*u)); - if (!u) - return NULL; - memset(u, 0, sizeof(*u)); - u->sw = sw; - u->id = cl_ntoh64(osm_node_get_node_guid(sw->p_node)); - u->rank = 0xffffffff; - return u; -} - -static void delete_updn_node(struct updn_node *u) -{ - u->sw->priv = NULL; - free(u); -} - -/* Find Root nodes automatically by Min Hop Table info */ -static void updn_find_root_nodes_by_min_hop(OUT updn_t * p_updn) -{ - osm_opensm_t *p_osm = p_updn->p_osm; - osm_switch_t *p_sw; - osm_port_t *p_port; - osm_physp_t *p_physp; - cl_map_item_t *item; - double thd1, thd2; - unsigned i, cas_num = 0; - unsigned *cas_per_sw; - uint16_t lid_ho; - - OSM_LOG_ENTER(&p_osm->log); - - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, - "Current number of ports in the subnet is %d\n", - cl_qmap_count(&p_osm->subn.port_guid_tbl)); - - lid_ho = (uint16_t) cl_ptr_vector_get_size(&p_updn->p_osm->subn.port_lid_tbl) + 1; - cas_per_sw = malloc(lid_ho * sizeof(*cas_per_sw)); - if (!cas_per_sw) { - OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "ERR AA14: " - "cannot alloc mem for CAs per switch counter array\n"); - goto _exit; - } - memset(cas_per_sw, 0, lid_ho * sizeof(*cas_per_sw)); - - /* Find the Maximum number of CAs (and routers) for histogram normalization */ - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "Finding the number of CAs and storing them in cl_map\n"); - for (item = cl_qmap_head(&p_updn->p_osm->subn.port_guid_tbl); - item != cl_qmap_end(&p_updn->p_osm->subn.port_guid_tbl); - item = cl_qmap_next(item)) { - p_port = (osm_port_t *)item; - if (!p_port->p_node->sw) { - p_physp = p_port->p_physp->p_remote_physp; - if (!p_physp || !p_physp->p_node->sw) - continue; - lid_ho = osm_node_get_base_lid(p_physp->p_node, 0); - lid_ho = cl_ntoh16(lid_ho); - cas_per_sw[lid_ho]++; - cas_num++; - } - } - - thd1 = cas_num * 0.9; - thd2 = cas_num * 0.05; - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, - "Found %u CAs and RTRs, %u SWs in the subnet. " - "Thresholds are thd1 = %f && thd2 = %f\n", - cas_num, cl_qmap_count(&p_osm->subn.sw_guid_tbl), thd1, thd2); - - OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, - "Passing through all switches to collect Min Hop info\n"); - for (item = cl_qmap_head(&p_updn->p_osm->subn.sw_guid_tbl); - item != cl_qmap_end(&p_updn->p_osm->subn.sw_guid_tbl); - item = cl_qmap_next(item)) { - unsigned hop_hist[IB_SUBNET_PATH_HOPS_MAX]; - uint16_t max_lid_ho; - uint8_t hop_val; - uint16_t numHopBarsOverThd1 = 0; - uint16_t numHopBarsOverThd2 = 0; - - p_sw = (osm_switch_t *) item; - - memset(hop_hist, 0, sizeof(hop_hist)); - - max_lid_ho = p_sw->max_lid_ho; - for (lid_ho = 1; lid_ho <= max_lid_ho; lid_ho++) - if (cas_per_sw[lid_ho]) { - hop_val = - osm_switch_get_least_hops(p_sw, lid_ho); - if (hop_val >= IB_SUBNET_PATH_HOPS_MAX) - continue; - - hop_hist[hop_val] += cas_per_sw[lid_ho]; - } - - /* Now recognize the spines by requiring one bar to be - above 90% of the number of CAs and RTRs */ - for (i = 0; i < IB_SUBNET_PATH_HOPS_MAX; i++) { - if (hop_hist[i] > thd1) - numHopBarsOverThd1++; - if (hop_hist[i] > thd2) - numHopBarsOverThd2++; - } - - /* If thd conditions are valid - rank the root node */ - if (numHopBarsOverThd1 == 1 && numHopBarsOverThd2 == 1) { - OSM_LOG(&p_osm->log, OSM_LOG_DEBUG, - "Ranking GUID 0x%" PRIx64 " as root node\n", - cl_ntoh64(osm_node_get_node_guid(p_sw->p_node))); - ((struct updn_node *)p_sw->priv)->rank = 0; - p_updn->num_roots++; - } - } - - free(cas_per_sw); -_exit: - OSM_LOG_EXIT(&p_osm->log); - return; -} - -static void dump_roots(cl_map_item_t *item, FILE *file, void *cxt) -{ - osm_switch_t *sw = (osm_switch_t *)item; - if (!((struct updn_node *)sw->priv)->rank) - fprintf(file, "0x%" PRIx64 "\n", - cl_ntoh64(osm_node_get_node_guid(sw->p_node))); -} - -static int update_id(void *cxt, uint64_t guid, char *p) -{ - osm_opensm_t *osm = cxt; - osm_switch_t *sw; - uint64_t id; - char *e; - - sw = osm_get_switch_by_guid(&osm->subn, cl_hton64(guid)); - if (!sw) { - OSM_LOG(&osm->log, OSM_LOG_VERBOSE, - "switch with guid 0x%" PRIx64 " is not found\n", guid); - return 0; - } - - id = strtoull(p, &e, 0); - if (*e && !isspace(*e)) { - OSM_LOG(&osm->log, OSM_LOG_ERROR, - "ERR: cannot parse node id \'%s\'", p); - return -1; - } - - OSM_LOG(&osm->log, OSM_LOG_DEBUG, - "update node 0x%" PRIx64 " id to 0x%" PRIx64 "\n", guid, id); - - ((struct updn_node *)sw->priv)->id = id; - - return 0; -} - -static int rank_root_node(void *cxt, uint64_t guid, char *p) -{ - updn_t *updn = cxt; - osm_switch_t *sw; - - sw = osm_get_switch_by_guid(&updn->p_osm->subn, cl_hton64(guid)); - if (!sw) { - OSM_LOG(&updn->p_osm->log, OSM_LOG_VERBOSE, - "switch with guid 0x%" PRIx64 " is not found\n", guid); - return 0; - } - - OSM_LOG(&updn->p_osm->log, OSM_LOG_DEBUG, - "Ranking root port GUID 0x%" PRIx64 "\n", guid); - - ((struct updn_node *)sw->priv)->rank = 0; - updn->num_roots++; - - return 0; -} - -/* UPDN callback function */ -static int updn_lid_matrices(void *ctx) -{ - updn_t *p_updn = ctx; - cl_map_item_t *item; - osm_switch_t *p_sw; - int ret = 0; - - OSM_LOG_ENTER(&p_updn->p_osm->log); - - for (item = cl_qmap_head(&p_updn->p_osm->subn.sw_guid_tbl); - item != cl_qmap_end(&p_updn->p_osm->subn.sw_guid_tbl); - item = cl_qmap_next(item)) { - p_sw = (osm_switch_t *)item; - p_sw->priv = create_updn_node(p_sw); - if (!p_sw->priv) { - OSM_LOG(&(p_updn->p_osm->log), OSM_LOG_ERROR, "ERR AA0C: " - "cannot create updn node\n"); - OSM_LOG_EXIT(&p_updn->p_osm->log); - return -1; - } - } - - /* First setup root nodes */ - p_updn->num_roots = 0; - - if (p_updn->p_osm->subn.opt.root_guid_file) { - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_DEBUG, - "UPDN - Fetching root nodes from file \'%s\'\n", - p_updn->p_osm->subn.opt.root_guid_file); - - ret = parse_node_map(p_updn->p_osm->subn.opt.root_guid_file, - rank_root_node, p_updn); - if (ret) - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_ERROR, "ERR : " - "cannot parse root guids file \'%s\'\n", - p_updn->p_osm->subn.opt.root_guid_file); - if (p_updn->p_osm->subn.opt.connect_roots && - p_updn->num_roots > 1) - osm_ucast_mgr_build_lid_matrices(&p_updn->p_osm->sm.ucast_mgr); - } else { - osm_ucast_mgr_build_lid_matrices(&p_updn->p_osm->sm.ucast_mgr); - updn_find_root_nodes_by_min_hop(p_updn); - } - - if (p_updn->p_osm->subn.opt.ids_guid_file) { - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_DEBUG, - "UPDN - update node ids from file \'%s\'\n", - p_updn->p_osm->subn.opt.ids_guid_file); - - ret = parse_node_map(p_updn->p_osm->subn.opt.ids_guid_file, - update_id, p_updn->p_osm); - if (ret) - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_ERROR, "ERR : " - "cannot parse node ids file \'%s\'\n", - p_updn->p_osm->subn.opt.ids_guid_file); - } - - /* Only if there are assigned root nodes do the algorithm, otherwise perform do nothing */ - if (p_updn->num_roots) { - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_DEBUG, - "activating UPDN algorithm\n"); - ret = updn_build_lid_matrices(p_updn); - } else { - OSM_LOG(&p_updn->p_osm->log, OSM_LOG_INFO, - "disabling UPDN algorithm, no root nodes were found\n"); - ret = -1; - } - - if (osm_log_is_active(&p_updn->p_osm->log, OSM_LOG_ROUTING)) - osm_dump_qmap_to_file(p_updn->p_osm, "opensm-updn-roots.dump", - &p_updn->p_osm->subn.sw_guid_tbl, - dump_roots, NULL); - - for (item = cl_qmap_head(&p_updn->p_osm->subn.sw_guid_tbl); - item != cl_qmap_end(&p_updn->p_osm->subn.sw_guid_tbl); - item = cl_qmap_next(item)) { - p_sw = (osm_switch_t *) item; - delete_updn_node(p_sw->priv); - } - - OSM_LOG_EXIT(&p_updn->p_osm->log); - return ret; -} - -static void updn_delete(void *context) -{ - free(context); -} - -int osm_ucast_updn_setup(struct osm_routing_engine *r, osm_opensm_t *osm) -{ - updn_t *updn; - - updn = malloc(sizeof(updn_t)); - if (!updn) - return -1; - memset(updn, 0, sizeof(updn_t)); - - updn->p_osm = osm; - - r->context = updn; - r->delete = updn_delete; - r->build_lid_matrices = updn_lid_matrices; - - return 0; -} diff --git a/branches/opensm_3/user/opensm/osm_vl15intf.c b/branches/opensm_3/user/opensm/osm_vl15intf.c deleted file mode 100644 index 863120f0..00000000 --- a/branches/opensm_3/user/opensm/osm_vl15intf.c +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006,2009 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_vl15_t. - * This object represents the VL15 Interface object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include - -static void vl15_send_mad(osm_vl15_t * p_vl, osm_madw_t * p_madw) -{ - ib_api_status_t status; - - /* - Non-response-expected mads are not throttled on the wire - since we can have no confirmation that they arrived - at their destination. - */ - if (p_madw->resp_expected == TRUE) - /* - Note that other threads may not see the response MAD - arrive before send() even returns. - In that case, the wire count would temporarily go negative. - To avoid this confusion, preincrement the counts on the - assumption that send() will succeed. - */ - cl_atomic_inc(&p_vl->p_stats->qp0_mads_outstanding_on_wire); - else - cl_atomic_inc(&p_vl->p_stats->qp0_unicasts_sent); - - cl_atomic_inc(&p_vl->p_stats->qp0_mads_sent); - - status = osm_vendor_send(osm_madw_get_bind_handle(p_madw), - p_madw, p_madw->resp_expected); - - if (status == IB_SUCCESS) { - OSM_LOG(p_vl->p_log, OSM_LOG_DEBUG, - "%u QP0 MADs on wire, %u outstanding, " - "%u unicasts sent, %u total sent\n", - p_vl->p_stats->qp0_mads_outstanding_on_wire, - p_vl->p_stats->qp0_mads_outstanding, - p_vl->p_stats->qp0_unicasts_sent, - p_vl->p_stats->qp0_mads_sent); - return; - } - - OSM_LOG(p_vl->p_log, OSM_LOG_ERROR, "ERR 3E03: " - "MAD send failed (%s)\n", ib_get_err_str(status)); - - /* - The MAD was never successfully sent, so - fix up the pre-incremented count values. - */ - - /* Decrement qp0_mads_sent that were incremented in the code above. - qp0_mads_outstanding will be decremented by send error callback - (called by osm_vendor_send() */ - cl_atomic_dec(&p_vl->p_stats->qp0_mads_sent); - if (!p_madw->resp_expected) - cl_atomic_dec(&p_vl->p_stats->qp0_unicasts_sent); -} - -static void vl15_poller(IN void *p_ptr) -{ - ib_api_status_t status; - osm_madw_t *p_madw; - osm_vl15_t *p_vl = p_ptr; - cl_qlist_t *p_fifo; - - OSM_LOG_ENTER(p_vl->p_log); - - if (p_vl->thread_state == OSM_THREAD_STATE_NONE) - p_vl->thread_state = OSM_THREAD_STATE_RUN; - - while (p_vl->thread_state == OSM_THREAD_STATE_RUN) { - /* - Start servicing the FIFOs by pulling off MAD wrappers - and passing them to the transport interface. - There are lots of corner cases here so tread carefully. - - The unicast FIFO has priority, since somebody is waiting - for a timely response. - */ - cl_spinlock_acquire(&p_vl->lock); - - if (cl_qlist_count(&p_vl->ufifo) != 0) - p_fifo = &p_vl->ufifo; - else - p_fifo = &p_vl->rfifo; - - p_madw = (osm_madw_t *) cl_qlist_remove_head(p_fifo); - - cl_spinlock_release(&p_vl->lock); - - if (p_madw != (osm_madw_t *) cl_qlist_end(p_fifo)) { - OSM_LOG(p_vl->p_log, OSM_LOG_DEBUG, - "Servicing p_madw = %p\n", p_madw); - if (osm_log_is_active(p_vl->p_log, OSM_LOG_FRAMES)) - osm_dump_dr_smp(p_vl->p_log, - osm_madw_get_smp_ptr(p_madw), - OSM_LOG_FRAMES); - - vl15_send_mad(p_vl, p_madw); - } else - /* - The VL15 FIFO is empty, so we have nothing left to do. - */ - status = cl_event_wait_on(&p_vl->signal, - EVENT_NO_TIMEOUT, TRUE); - - while (p_vl->p_stats->qp0_mads_outstanding_on_wire >= - (int32_t) p_vl->max_wire_smps && - p_vl->thread_state == OSM_THREAD_STATE_RUN) { - status = cl_event_wait_on(&p_vl->signal, - EVENT_NO_TIMEOUT, TRUE); - if (status != CL_SUCCESS) { - OSM_LOG(p_vl->p_log, OSM_LOG_ERROR, "ERR 3E02: " - "Event wait failed (%s)\n", - CL_STATUS_MSG(status)); - break; - } - } - } - - /* - since we abort immediately when the state != OSM_THREAD_STATE_RUN - we might have some mads on the queues. After the thread exits - the vl15 destroy routine should put these mads back... - */ - - OSM_LOG_EXIT(p_vl->p_log); -} - -void osm_vl15_construct(IN osm_vl15_t * p_vl) -{ - memset(p_vl, 0, sizeof(*p_vl)); - p_vl->state = OSM_VL15_STATE_INIT; - p_vl->thread_state = OSM_THREAD_STATE_NONE; - cl_event_construct(&p_vl->signal); - cl_spinlock_construct(&p_vl->lock); - cl_qlist_init(&p_vl->rfifo); - cl_qlist_init(&p_vl->ufifo); - cl_thread_construct(&p_vl->poller); -} - -void osm_vl15_destroy(IN osm_vl15_t * p_vl, IN struct osm_mad_pool *p_pool) -{ - osm_madw_t *p_madw; - - OSM_LOG_ENTER(p_vl->p_log); - - /* - Signal our threads that we're leaving. - */ - p_vl->thread_state = OSM_THREAD_STATE_EXIT; - - /* - Don't trigger unless event has been initialized. - Destroy the thread before we tear down the other objects. - */ - if (p_vl->state != OSM_VL15_STATE_INIT) - cl_event_signal(&p_vl->signal); - - cl_thread_destroy(&p_vl->poller); - - /* - Return the outstanding messages to the pool - */ - - cl_spinlock_acquire(&p_vl->lock); - - while (!cl_is_qlist_empty(&p_vl->rfifo)) { - p_madw = (osm_madw_t *) cl_qlist_remove_head(&p_vl->rfifo); - osm_mad_pool_put(p_pool, p_madw); - } - while (!cl_is_qlist_empty(&p_vl->ufifo)) { - p_madw = (osm_madw_t *) cl_qlist_remove_head(&p_vl->ufifo); - osm_mad_pool_put(p_pool, p_madw); - } - - cl_spinlock_release(&p_vl->lock); - - cl_event_destroy(&p_vl->signal); - p_vl->state = OSM_VL15_STATE_INIT; - cl_spinlock_destroy(&p_vl->lock); - - OSM_LOG_EXIT(p_vl->p_log); -} - -ib_api_status_t osm_vl15_init(IN osm_vl15_t * p_vl, IN osm_vendor_t * p_vend, - IN osm_log_t * p_log, IN osm_stats_t * p_stats, - IN int32_t max_wire_smps) -{ - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_log); - - p_vl->p_vend = p_vend; - p_vl->p_log = p_log; - p_vl->p_stats = p_stats; - p_vl->max_wire_smps = max_wire_smps; - - status = cl_event_init(&p_vl->signal, FALSE); - if (status != IB_SUCCESS) - goto Exit; - - p_vl->state = OSM_VL15_STATE_READY; - - status = cl_spinlock_init(&p_vl->lock); - if (status != IB_SUCCESS) - goto Exit; - - /* - Initialize the thread after all other dependent objects - have been initialized. - */ - status = cl_thread_init(&p_vl->poller, vl15_poller, p_vl, - "opensm poller"); -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -void osm_vl15_poll(IN osm_vl15_t * p_vl) -{ - OSM_LOG_ENTER(p_vl->p_log); - - CL_ASSERT(p_vl->state == OSM_VL15_STATE_READY); - - /* - If we have room for more VL15 MADs on the wire, - then signal the poller thread. - - This is not an airtight check, since the poller thread - could be just about to send another MAD as we signal - the event here. To cover this rare case, the poller - thread checks for a spurious wake-up. - */ - if (p_vl->p_stats->qp0_mads_outstanding_on_wire < - (int32_t) p_vl->max_wire_smps) { - OSM_LOG(p_vl->p_log, OSM_LOG_DEBUG, - "Signalling poller thread\n"); - cl_event_signal(&p_vl->signal); - } - - OSM_LOG_EXIT(p_vl->p_log); -} - -void osm_vl15_post(IN osm_vl15_t * p_vl, IN osm_madw_t * p_madw) -{ - OSM_LOG_ENTER(p_vl->p_log); - - CL_ASSERT(p_vl->state == OSM_VL15_STATE_READY); - - OSM_LOG(p_vl->p_log, OSM_LOG_DEBUG, "Posting p_madw = %p\n", p_madw); - - /* - Determine in which fifo to place the pending madw. - */ - cl_spinlock_acquire(&p_vl->lock); - if (p_madw->resp_expected == TRUE) { - cl_qlist_insert_tail(&p_vl->rfifo, &p_madw->list_item); - osm_stats_inc_qp0_outstanding(p_vl->p_stats); - } else - cl_qlist_insert_tail(&p_vl->ufifo, &p_madw->list_item); - cl_spinlock_release(&p_vl->lock); - - OSM_LOG(p_vl->p_log, OSM_LOG_DEBUG, - "%u QP0 MADs on wire, %u QP0 MADs outstanding\n", - p_vl->p_stats->qp0_mads_outstanding_on_wire, - p_vl->p_stats->qp0_mads_outstanding); - - osm_vl15_poll(p_vl); - - OSM_LOG_EXIT(p_vl->p_log); -} - -void osm_vl15_shutdown(IN osm_vl15_t * p_vl, IN osm_mad_pool_t * p_mad_pool) -{ - osm_madw_t *p_madw; - - OSM_LOG_ENTER(p_vl->p_log); - - /* we only should get here after the VL15 interface was initialized */ - CL_ASSERT(p_vl->state == OSM_VL15_STATE_READY); - - /* grap a lock on the object */ - cl_spinlock_acquire(&p_vl->lock); - - /* go over all outstanding MADs and retire their transactions */ - - /* first we handle the list of response MADs */ - p_madw = (osm_madw_t *) cl_qlist_remove_head(&p_vl->ufifo); - while (p_madw != (osm_madw_t *) cl_qlist_end(&p_vl->ufifo)) { - OSM_LOG(p_vl->p_log, OSM_LOG_DEBUG, - "Releasing Response p_madw = %p\n", p_madw); - - osm_mad_pool_put(p_mad_pool, p_madw); - - p_madw = (osm_madw_t *) cl_qlist_remove_head(&p_vl->ufifo); - } - - /* Request MADs we send out */ - p_madw = (osm_madw_t *) cl_qlist_remove_head(&p_vl->rfifo); - while (p_madw != (osm_madw_t *) cl_qlist_end(&p_vl->rfifo)) { - OSM_LOG(p_vl->p_log, OSM_LOG_DEBUG, - "Releasing Request p_madw = %p\n", p_madw); - - osm_mad_pool_put(p_mad_pool, p_madw); - osm_stats_dec_qp0_outstanding(p_vl->p_stats); - - p_madw = (osm_madw_t *) cl_qlist_remove_head(&p_vl->rfifo); - } - - /* free the lock */ - cl_spinlock_release(&p_vl->lock); - - OSM_LOG_EXIT(p_vl->p_log); -} diff --git a/branches/opensm_3/user/opensm/osm_vl_arb_rcv.c b/branches/opensm_3/user/opensm/osm_vl_arb_rcv.c deleted file mode 100644 index 37e30bd1..00000000 --- a/branches/opensm_3/user/opensm/osm_vl_arb_rcv.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2010 HNR Consulting. All rights reserved. - * Copyright (c) 2010 Sun Microsystems, Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of osm_vla_rcv_t. - * This object represents the Vl Arbitration Receiver object. - * This object is part of the opensm family of objects. - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * WE ONLY RECEIVE GET or SET responses - */ -void osm_vla_rcv_process(IN void *context, IN void *data) -{ - osm_sm_t *sm = context; - osm_madw_t *p_madw = data; - ib_vl_arb_table_t *p_vla_tbl; - ib_smp_t *p_smp; - osm_port_t *p_port; - osm_physp_t *p_physp; - osm_node_t *p_node; - osm_vla_context_t *p_context; - ib_net64_t port_guid; - ib_net64_t node_guid; - uint8_t port_num, block_num; - - CL_ASSERT(sm); - - OSM_LOG_ENTER(sm->p_log); - - CL_ASSERT(p_madw); - - p_smp = osm_madw_get_smp_ptr(p_madw); - - p_context = osm_madw_get_vla_context_ptr(p_madw); - p_vla_tbl = ib_smp_get_payload_ptr(p_smp); - - port_guid = p_context->port_guid; - node_guid = p_context->node_guid; - - CL_ASSERT(p_smp->attr_id == IB_MAD_ATTR_VL_ARBITRATION); - - cl_plock_excl_acquire(sm->p_lock); - p_port = osm_get_port_by_guid(sm->p_subn, port_guid); - if (!p_port) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3F06: " - "No port object for port with GUID 0x%" PRIx64 - "\n\t\t\t\tfor parent node GUID 0x%" PRIx64 - ", TID 0x%" PRIx64 "\n", cl_ntoh64(port_guid), - cl_ntoh64(node_guid), cl_ntoh64(p_smp->trans_id)); - goto Exit; - } - - p_node = p_port->p_node; - CL_ASSERT(p_node); - - block_num = (uint8_t) (cl_ntoh32(p_smp->attr_mod) >> 16); - /* in case of a non switch node the attr modifier should be ignored */ - if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH) { - port_num = (uint8_t) (cl_ntoh32(p_smp->attr_mod) & 0x000000FF); - p_physp = osm_node_get_physp_ptr(p_node, port_num); - } else { - p_physp = p_port->p_physp; - port_num = p_physp->port_num; - } - - /* - We do not care if this is a result of a set or get - - all we want is to update the subnet. - */ - OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, - "Got GetResp(VLArb) block:%u port_num %u with GUID 0x%" - PRIx64 " for parent node GUID 0x%" PRIx64 ", TID 0x%" - PRIx64 "\n", block_num, port_num, cl_ntoh64(port_guid), - cl_ntoh64(node_guid), cl_ntoh64(p_smp->trans_id)); - - /* - Determine if we encountered a new Physical Port. - If so, Ignore it. - */ - if (!p_physp) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "Got invalid port number %u\n", port_num); - goto Exit; - } - - if ((block_num < 1) || (block_num > 4)) { - OSM_LOG(sm->p_log, OSM_LOG_ERROR, - "Got invalid block number 0x%X\n", block_num); - goto Exit; - } - - osm_dump_vl_arb_table(sm->p_log, port_guid, block_num, port_num, - p_vla_tbl, OSM_LOG_DEBUG); - osm_physp_set_vla_tbl(p_physp, p_vla_tbl, block_num); - -Exit: - cl_plock_release(sm->p_lock); - - OSM_LOG_EXIT(sm->p_log); -} diff --git a/branches/opensm_3/user/opensm/st.c b/branches/opensm_3/user/opensm/st.c deleted file mode 100644 index 676b1c23..00000000 --- a/branches/opensm_3/user/opensm/st.c +++ /dev/null @@ -1,584 +0,0 @@ -/* - * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* static char sccsid[] = "@(#) st.c 5.1 89/12/14 Crucible"; */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include - -typedef struct st_table_entry st_table_entry; - -struct st_table_entry { - unsigned int hash; - st_data_t key; - st_data_t record; - st_table_entry *next; -}; - -#define ST_DEFAULT_MAX_DENSITY 5 -#define ST_DEFAULT_INIT_TABLE_SIZE 11 - -/* - * DEFAULT_MAX_DENSITY is the default for the largest we allow the - * average number of items per bin before increasing the number of - * bins - * - * DEFAULT_INIT_TABLE_SIZE is the default for the number of bins - * allocated initially - * - */ -static int numcmp(void *, void *); -static st_ptr_t numhash(void *); -static struct st_hash_type type_numhash = { - numcmp, - numhash, -}; - -/* extern int strcmp(const char *, const char *); */ -static int strhash(const char *); - -static inline st_ptr_t st_strhash(void *key) -{ - return strhash((const char *)key); -} - -static inline int st_strcmp(void *key1, void *key2) -{ - return strcmp((const char *)key1, (const char *)key2); -} - -static struct st_hash_type type_strhash = { - st_strcmp, - st_strhash -}; - -#define xmalloc malloc -#define xcalloc calloc -#define xrealloc realloc -#define xfree free - -static void rehash(st_table *); - -#define alloc(type) (type*)xmalloc(sizeof(type)) -#define Calloc(n,s) (char*)xcalloc((n), (s)) - -#define EQUAL(table,x,y) ((x)==(y) || (*table->type->compare)(((void*)x),((void *)y)) == 0) - -#define do_hash(key,table) (unsigned int)(*(table)->type->hash)(((void*)key)) -#define do_hash_bin(key,table) (do_hash(key, table)%(table)->num_bins) - -/* - * MINSIZE is the minimum size of a dictionary. - */ - -#define MINSIZE 8 - -/* - Table of prime numbers 2^n+a, 2<=n<=30. -*/ -static long primes[] = { - 8 + 3, - 16 + 3, - 32 + 5, - 64 + 3, - 128 + 3, - 256 + 27, - 512 + 9, - 1024 + 9, - 2048 + 5, - 4096 + 3, - 8192 + 27, - 16384 + 43, - 32768 + 3, - 65536 + 45, - 131072 + 29, - 262144 + 3, - 524288 + 21, - 1048576 + 7, - 2097152 + 17, - 4194304 + 15, - 8388608 + 9, - 16777216 + 43, - 33554432 + 35, - 67108864 + 15, - 134217728 + 29, - 268435456 + 3, - 536870912 + 11, - 1073741824 + 85, - 0 -}; - -static int new_size(int size) -{ - int i; - -#if 0 - for (i = 3; i < 31; i++) { - if ((1 << i) > size) - return 1 << i; - } - return -1; -#else - int newsize; - - for (i = 0, newsize = MINSIZE; - i < sizeof(primes) / sizeof(primes[0]); i++, newsize <<= 1) { - if (newsize > size) - return primes[i]; - } - /* Ran out of polynomials */ - return -1; /* should raise exception */ -#endif -} - -#ifdef HASH_LOG -static int collision = 0; -static int init_st = 0; - -static void stat_col(void) -{ - FILE *f = fopen(OSM_DEFAULT_TMP_DIR "osm_st_col", "w"); - fprintf(f, "collision: %d\n", collision); - fclose(f); -} -#endif - -st_table *st_init_table_with_size(type, size) -struct st_hash_type *type; -size_t size; -{ - st_table *tbl; - -#ifdef HASH_LOG - if (init_st == 0) { - init_st = 1; - atexit(stat_col); - } -#endif - - size = new_size(size); /* round up to prime number */ - - tbl = alloc(st_table); - tbl->type = type; - tbl->num_entries = 0; - tbl->num_bins = size; - tbl->bins = (st_table_entry **) Calloc(size, sizeof(st_table_entry *)); - - return tbl; -} - -st_table *st_init_table(type) -struct st_hash_type *type; -{ - return st_init_table_with_size(type, 0); -} - -st_table *st_init_numtable(void) -{ - return st_init_table(&type_numhash); -} - -st_table *st_init_numtable_with_size(size) -size_t size; -{ - return st_init_table_with_size(&type_numhash, size); -} - -st_table *st_init_strtable(void) -{ - return st_init_table(&type_strhash); -} - -st_table *st_init_strtable_with_size(size) -size_t size; -{ - return st_init_table_with_size(&type_strhash, size); -} - -void st_free_table(table) -st_table *table; -{ - register st_table_entry *ptr, *next; - int i; - - for (i = 0; i < table->num_bins; i++) { - ptr = table->bins[i]; - while (ptr != 0) { - next = ptr->next; - free(ptr); - ptr = next; - } - } - free(table->bins); - free(table); -} - -#define PTR_NOT_EQUAL(table, ptr, hash_val, key) \ -((ptr) != 0 && (ptr->hash != (hash_val) || !EQUAL((table), (key), (ptr)->key))) - -#ifdef HASH_LOG -#define COLLISION collision++ -#else -#define COLLISION -#endif - -#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\ - bin_pos = hash_val%(table)->num_bins;\ - ptr = (table)->bins[bin_pos];\ - if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) \ - {\ - COLLISION;\ - while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {\ - ptr = ptr->next;\ - }\ - ptr = ptr->next;\ - }\ -} while (0) - -int st_lookup(table, key, value) -st_table *table; -register st_data_t key; -st_data_t *value; -{ - unsigned int hash_val, bin_pos; - register st_table_entry *ptr; - - hash_val = do_hash(key, table); - FIND_ENTRY(table, ptr, hash_val, bin_pos); - - if (ptr == 0) { - return 0; - } else { - if (value != 0) - *value = ptr->record; - return 1; - } -} - -#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\ -do {\ - st_table_entry *entry;\ - if (table->num_entries/(table->num_bins) > ST_DEFAULT_MAX_DENSITY) \ - {\ - rehash(table);\ - bin_pos = hash_val % table->num_bins;\ - }\ - \ - entry = alloc(st_table_entry);\ - \ - entry->hash = hash_val;\ - entry->key = key;\ - entry->record = value;\ - entry->next = table->bins[bin_pos];\ - table->bins[bin_pos] = entry;\ - table->num_entries++;\ -} while (0); - -int st_insert(table, key, value) -register st_table *table; -register st_data_t key; -st_data_t value; -{ - unsigned int hash_val, bin_pos; - register st_table_entry *ptr; - - hash_val = do_hash(key, table); - FIND_ENTRY(table, ptr, hash_val, bin_pos); - - if (ptr == 0) { - ADD_DIRECT(table, key, value, hash_val, bin_pos); - return 0; - } else { - ptr->record = value; - return 1; - } -} - -void st_add_direct(table, key, value) -st_table *table; -st_data_t key; -st_data_t value; -{ - unsigned int hash_val, bin_pos; - - hash_val = do_hash(key, table); - bin_pos = hash_val % table->num_bins; - ADD_DIRECT(table, key, value, hash_val, bin_pos); -} - -static void rehash(table) -register st_table *table; -{ - register st_table_entry *ptr, *next, **new_bins; - int i, old_num_bins = table->num_bins, new_num_bins; - unsigned int hash_val; - - new_num_bins = new_size(old_num_bins + 1); - new_bins = - (st_table_entry **) Calloc(new_num_bins, sizeof(st_table_entry *)); - - for (i = 0; i < old_num_bins; i++) { - ptr = table->bins[i]; - while (ptr != 0) { - next = ptr->next; - hash_val = ptr->hash % new_num_bins; - ptr->next = new_bins[hash_val]; - new_bins[hash_val] = ptr; - ptr = next; - } - } - free(table->bins); - table->num_bins = new_num_bins; - table->bins = new_bins; -} - -st_table *st_copy(old_table) -st_table *old_table; -{ - st_table *new_table; - st_table_entry *ptr, *entry; - size_t i, num_bins = old_table->num_bins; - - new_table = alloc(st_table); - if (new_table == 0) { - return 0; - } - - *new_table = *old_table; - new_table->bins = (st_table_entry **) - Calloc(num_bins, sizeof(st_table_entry *)); - - if (new_table->bins == 0) { - free(new_table); - return 0; - } - - for (i = 0; i < num_bins; i++) { - new_table->bins[i] = 0; - ptr = old_table->bins[i]; - while (ptr != 0) { - entry = alloc(st_table_entry); - if (entry == 0) { - free(new_table->bins); - free(new_table); - return 0; - } - *entry = *ptr; - entry->next = new_table->bins[i]; - new_table->bins[i] = entry; - ptr = ptr->next; - } - } - return new_table; -} - -int st_delete(table, key, value) -register st_table *table; -register st_data_t *key; -st_data_t *value; -{ - unsigned int hash_val; - st_table_entry *tmp; - register st_table_entry *ptr; - - hash_val = do_hash_bin(*key, table); - ptr = table->bins[hash_val]; - - if (ptr == 0) { - if (value != 0) - *value = 0; - return 0; - } - - if (EQUAL(table, *key, ptr->key)) { - table->bins[hash_val] = ptr->next; - table->num_entries--; - if (value != 0) - *value = ptr->record; - *key = ptr->key; - free(ptr); - return 1; - } - - for (; ptr->next != 0; ptr = ptr->next) { - if (EQUAL(table, ptr->next->key, *key)) { - tmp = ptr->next; - ptr->next = ptr->next->next; - table->num_entries--; - if (value != 0) - *value = tmp->record; - *key = tmp->key; - free(tmp); - return 1; - } - } - - return 0; -} - -int st_delete_safe(table, key, value, never) -register st_table *table; -register st_data_t *key; -st_data_t *value; -st_data_t never; -{ - unsigned int hash_val; - register st_table_entry *ptr; - - hash_val = do_hash_bin(*key, table); - ptr = table->bins[hash_val]; - - if (ptr == 0) { - if (value != 0) - *value = 0; - return 0; - } - - for (; ptr != 0; ptr = ptr->next) { - if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) { - table->num_entries--; - *key = ptr->key; - if (value != 0) - *value = ptr->record; - ptr->key = ptr->record = never; - return 1; - } - } - - return 0; -} - -static int delete_never(st_data_t key, st_data_t value, st_data_t never) -{ - if (value == never) - return ST_DELETE; - return ST_CONTINUE; -} - -void st_cleanup_safe(table, never) -st_table *table; -st_data_t never; -{ - int num_entries = table->num_entries; - - st_foreach(table, delete_never, never); - table->num_entries = num_entries; -} - -void st_foreach(table, func, arg) -st_table *table; -int (*func) (st_data_t key, st_data_t val, st_data_t arg); -st_data_t arg; -{ - st_table_entry *ptr, *last, *tmp; - enum st_retval retval; - int i; - - for (i = 0; i < table->num_bins; i++) { - last = 0; - for (ptr = table->bins[i]; ptr != 0;) { - retval = (*func) (ptr->key, ptr->record, arg); - switch (retval) { - case ST_CONTINUE: - last = ptr; - ptr = ptr->next; - break; - case ST_STOP: - return; - case ST_DELETE: - tmp = ptr; - if (last == 0) { - table->bins[i] = ptr->next; - } else { - last->next = ptr->next; - } - ptr = ptr->next; - free(tmp); - table->num_entries--; - } - } - } -} - -static int strhash(string) -register const char *string; -{ - register int c; - -#ifdef HASH_ELFHASH - register unsigned int h = 0, g; - - while ((c = *string++) != '\0') { - h = (h << 4) + c; - if (g = h & 0xF0000000) - h ^= g >> 24; - h &= ~g; - } - return h; -#elif HASH_PERL - register int val = 0; - - while ((c = *string++) != '\0') { - val = val * 33 + c; - } - - return val + (val >> 5); -#else - register int val = 0; - - while ((c = *string++) != '\0') { - val = val * 997 + c; - } - - return val + (val >> 5); -#endif -} - -static int numcmp(x, y) -void *x, *y; -{ - return (st_ptr_t) x != (st_ptr_t) y; -} - -static st_ptr_t numhash(n) -void *n; -{ - return (st_ptr_t) n; -} diff --git a/branches/opensm_3/user/opensm/vendor-ibal.inc b/branches/opensm_3/user/opensm/vendor-ibal.inc deleted file mode 100644 index 85a2dcec..00000000 --- a/branches/opensm_3/user/opensm/vendor-ibal.inc +++ /dev/null @@ -1,5 +0,0 @@ -# Vendor IBAL -VENDOR_LIBS=$(LIBPATH)\*\osmv_ibal.lib -VENDOR_LIBSD=$(VENDOR_LIBS) -VENDOR_IF=OSM_VENDOR_INTF_AL - diff --git a/branches/opensm_3/user/opensm/vendor-umad.inc b/branches/opensm_3/user/opensm/vendor-umad.inc deleted file mode 100644 index 48285ed2..00000000 --- a/branches/opensm_3/user/opensm/vendor-umad.inc +++ /dev/null @@ -1,19 +0,0 @@ -# Vendor umad - -VENDOR_INC= $(WINIBHOME)\ulp\libibmad\include; \ - $(WINIBHOME)\ulp\libibumad\include; - -VENDOR_LIBS=$(TARGETPATH)\*\osmv_openib.lib \ - $(LIBPATH)\*\libibmad.lib \ - $(LIBPATH)\*\libibumad.lib \ - $(LIBPATH)\*\libibverbs.lib \ - $(LIBPATH)\*\winverbs.lib - -VENDOR_LIBSD=$(TARGETPATH)\*\osmv_openib.lib \ - $(LIBPATH)\*\libibmadd.lib \ - $(LIBPATH)\*\libibumadd.lib \ - $(LIBPATH)\*\libibverbsd.lib \ - $(LIBPATH)\*\winverbsd.lib - -VENDOR_IF=OSM_VENDOR_INTF_OPENIB - diff --git a/branches/opensm_3/user/osmeventplugin/libosmeventplugin.map b/branches/opensm_3/user/osmeventplugin/libosmeventplugin.map deleted file mode 100644 index 15bf29a9..00000000 --- a/branches/opensm_3/user/osmeventplugin/libosmeventplugin.map +++ /dev/null @@ -1,5 +0,0 @@ -OSMPMDB_1.0 { - global: - osm_event_plugin; - local: *; -}; diff --git a/branches/opensm_3/user/osmeventplugin/libosmeventplugin.ver b/branches/opensm_3/user/osmeventplugin/libosmeventplugin.ver deleted file mode 100644 index c463efc2..00000000 --- a/branches/opensm_3/user/osmeventplugin/libosmeventplugin.ver +++ /dev/null @@ -1,9 +0,0 @@ -# In this file we track the current API version -# of the vendor interface (and libraries) -# The version is built of the following -# tree numbers: -# API_REV:RUNNING_REV:AGE -# API_REV - advance on any added API -# RUNNING_REV - advance any change to the vendor files -# AGE - number of backward versions the API still supports -LIBVERSION=1:0:0 diff --git a/branches/opensm_3/user/osmeventplugin/src/osmeventplugin.c b/branches/opensm_3/user/osmeventplugin/src/osmeventplugin.c deleted file mode 100644 index 24618785..00000000 --- a/branches/opensm_3/user/osmeventplugin/src/osmeventplugin.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2007 The Regents of the University of California. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#if HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** ========================================================================= - * This is a simple example plugin which logs some of the events the OSM - * generates to this interface. - */ -#define SAMPLE_PLUGIN_OUTPUT_FILE "/tmp/osm_sample_event_plugin_output" -typedef struct _log_events { - FILE *log_file; - osm_log_t *osmlog; -} _log_events_t; - -/** ========================================================================= - */ -static void *construct(osm_opensm_t *osm) -{ - _log_events_t *log = malloc(sizeof(*log)); - if (!log) - return (NULL); - - log->log_file = fopen(SAMPLE_PLUGIN_OUTPUT_FILE, "a+"); - - if (!(log->log_file)) { - osm_log(&osm->log, OSM_LOG_ERROR, - "Sample Event Plugin: Failed to open output file \"%s\"\n", - SAMPLE_PLUGIN_OUTPUT_FILE); - free(log); - return (NULL); - } - - log->osmlog = &osm->log; - return ((void *)log); -} - -/** ========================================================================= - */ -static void destroy(void *_log) -{ - _log_events_t *log = (_log_events_t *) _log; - fclose(log->log_file); - free(log); -} - -/** ========================================================================= - */ -static void handle_port_counter(_log_events_t * log, osm_epi_pe_event_t * pc) -{ - if (pc->symbol_err_cnt > 0 - || pc->link_err_recover > 0 - || pc->link_downed > 0 - || pc->rcv_err > 0 - || pc->rcv_rem_phys_err > 0 - || pc->rcv_switch_relay_err > 0 - || pc->xmit_discards > 0 - || pc->xmit_constraint_err > 0 - || pc->rcv_constraint_err > 0 - || pc->link_integrity > 0 - || pc->buffer_overrun > 0 || pc->vl15_dropped > 0) { - fprintf(log->log_file, - "Port counter errors for node 0x%" PRIx64 - " (%s) port %d\n", pc->port_id.node_guid, - pc->port_id.node_name, pc->port_id.port_num); - } -} - -/** ========================================================================= - */ -static void -handle_port_counter_ext(_log_events_t * log, osm_epi_dc_event_t * epc) -{ - fprintf(log->log_file, - "Recieved Data counters for node 0x%" PRIx64 " (%s) port %d\n", - epc->port_id.node_guid, - epc->port_id.node_name, epc->port_id.port_num); -} - -/** ========================================================================= - */ -static void handle_port_select(_log_events_t * log, osm_epi_ps_event_t * ps) -{ - if (ps->xmit_wait > 0) { - fprintf(log->log_file, - "Port select Xmit Wait counts for node 0x%" PRIx64 - " (%s) port %d\n", ps->port_id.node_guid, - ps->port_id.node_name, ps->port_id.port_num); - } -} - -/** ========================================================================= - */ -static void handle_trap_event(_log_events_t *log, ib_mad_notice_attr_t *p_ntc) -{ - if (ib_notice_is_generic(p_ntc)) { - fprintf(log->log_file, - "Generic trap type %d; event %d; from LID 0x%x\n", - ib_notice_get_type(p_ntc), - cl_ntoh16(p_ntc->g_or_v.generic.trap_num), - cl_ntoh16(p_ntc->issuer_lid)); - } else { - fprintf(log->log_file, - "Vendor trap type %d; from LID 0x%x\n", - ib_notice_get_type(p_ntc), - cl_ntoh16(p_ntc->issuer_lid)); - } - -} - -/** ========================================================================= - */ -static void report(void *_log, osm_epi_event_id_t event_id, void *event_data) -{ - _log_events_t *log = (_log_events_t *) _log; - - switch (event_id) { - case OSM_EVENT_ID_PORT_ERRORS: - handle_port_counter(log, (osm_epi_pe_event_t *) event_data); - break; - case OSM_EVENT_ID_PORT_DATA_COUNTERS: - handle_port_counter_ext(log, (osm_epi_dc_event_t *) event_data); - break; - case OSM_EVENT_ID_PORT_SELECT: - handle_port_select(log, (osm_epi_ps_event_t *) event_data); - break; - case OSM_EVENT_ID_TRAP: - handle_trap_event(log, (ib_mad_notice_attr_t *) event_data); - break; - case OSM_EVENT_ID_SUBNET_UP: - fprintf(log->log_file, "Subnet up reported\n"); - break; - case OSM_EVENT_ID_MAX: - default: - osm_log(log->osmlog, OSM_LOG_ERROR, - "Unknown event (%d) reported to plugin\n", event_id); - } - fflush(log->log_file); -} - -/** ========================================================================= - * Define the object symbol for loading - */ - -#if OSM_EVENT_PLUGIN_INTERFACE_VER != 2 -#error OpenSM plugin interface version missmatch -#endif - -osm_event_plugin_t osm_event_plugin = { - osm_version:OSM_VERSION, - create:construct, - delete:destroy, - report:report -}; diff --git a/branches/opensm_3/user/osmtest/Makefile b/branches/opensm_3/user/osmtest/Makefile deleted file mode 100644 index b8c9cc35..00000000 --- a/branches/opensm_3/user/osmtest/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source -# file to this component. This file merely indirects to the real make file -# that is shared by all the driver components of the Windows NT DDK -# - -!INCLUDE ..\..\..\..\inc\openib.def diff --git a/branches/opensm_3/user/osmtest/SOURCES b/branches/opensm_3/user/osmtest/SOURCES deleted file mode 100644 index 1027e8d7..00000000 --- a/branches/opensm_3/user/osmtest/SOURCES +++ /dev/null @@ -1,71 +0,0 @@ -TARGETNAME=osmtest - -!if !defined(WINIBHOME) -WINIBHOME=..\..\..\.. -!endif - -LIBPATH=$(WINIBHOME)\bin\user\obj$(BUILD_ALT_DIR) - -!if defined(OSM_TARGET) -TARGETPATH=$(OSM_TARGET)\bin\user\obj$(BUILD_ALT_DIR) -!else -TARGETPATH=$(WINIBHOME)\bin\user\obj$(BUILD_ALT_DIR) -!endif - -!include ..\mad-vendor.inc - -TARGETTYPE=PROGRAM -UMTYPE=console -USE_MSVCRT=1 -OVR_DIR=..\addon - - -SOURCES=osmtest.rc \ - osmt_files.c \ - osmt_slvl_vl_arb.c \ - osmt_service.c \ - osmt_multicast.c \ - osmt_inform.c \ - osmtest.c \ - main.c - -OSM_HOME=.. - -TARGETLIBS=\ - $(SDK_LIB_PATH)\kernel32.lib \ - $(SDK_LIB_PATH)\ws2_32.lib \ -!if $(FREEBUILD) - $(VENDOR_LIBS) \ - $(LIBPATH)\*\ibal.lib \ - $(LIBPATH)\*\complib.lib -!else - $(VENDOR_LIBSD) \ - $(LIBPATH)\*\ibald.lib \ - $(LIBPATH)\*\complibd.lib -!endif - - -INCLUDES= \ - $(WINIBHOME)\inc; \ - $(WINIBHOME)\inc\user; \ - $(WINIBHOME)\inc\user\linux; \ - $(VENDOR_INC) \ - $(OSM_HOME); \ - $(OSM_HOME)\osmtest\include; \ - $(OSM_HOME)\include; - -# Could be any special flag needed for this project -USER_C_FLAGS=$(USER_C_FLAGS) /MD - -#Add preproccessor definitions - -C_DEFINES=$(C_DEFINES) -D__WIN__ -D$(VENDOR_IF) -DHAVE_CONFIG_H - -!if !$(FREEBUILD) -#C_DEFINES=$(C_DEFINES) -D_DEBUG -DDEBUG -DDBG -C_DEFINES=$(C_DEFINES) -!endif - -LINKER_FLAGS= $(LINKER_FLAGS) -MSC_WARNING_LEVEL= /W3 /wd4007 /wd4090 - diff --git a/branches/opensm_3/user/osmtest/include/osmt_inform.h b/branches/opensm_3/user/osmtest/include/osmt_inform.h deleted file mode 100644 index 4bae63a9..00000000 --- a/branches/opensm_3/user/osmtest/include/osmt_inform.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifndef __OSMT_INFORM__ -#define __OSMT_INFORM__ - -#ifdef OSM_VENDOR_INTF_MTL -#include -#include -#include "osmt_mtl_regular_qp.h" -#endif - -typedef struct _osmt_qp_ctx { -#ifdef OSM_VENDOR_INTF_MTL - osmt_mtl_mad_res_t qp_bind_hndl; -#endif - uint8_t *p_send_buf; - uint8_t *p_recv_buf; -#ifdef OSM_VENDOR_INTF_MTL - IB_MGT_mad_hndl_t ib_mgt_qp0_handle; -#endif -} osmt_qp_ctx_t; - -ib_api_status_t -osmt_bind_inform_qp(IN osmtest_t * const p_osmt, OUT osmt_qp_ctx_t * p_qp_ctx); - -void -osmt_unbind_inform_qp(IN osmtest_t * const p_osmt, IN osmt_qp_ctx_t * p_qp_ctx); - -ib_api_status_t -osmt_reg_unreg_inform_info(IN osmtest_t * p_osmt, - IN osmt_qp_ctx_t * p_qp_ctx, - IN ib_inform_info_t * p_inform_info, - IN uint8_t reg_flag); - -ib_api_status_t -osmt_trap_wait(IN osmtest_t * const p_osmt, IN osmt_qp_ctx_t * p_qp_ctx); - -ib_api_status_t -osmt_init_inform_info(IN osmtest_t * const p_osmt, OUT ib_inform_info_t * p_ii); - -ib_api_status_t -osmt_init_inform_info_by_trap(IN osmtest_t * const p_osmt, - IN ib_net16_t trap_num, - OUT ib_inform_info_t * p_ii); - -#endif /* __OSMT_INFORM__ */ diff --git a/branches/opensm_3/user/osmtest/include/osmt_mtl_regular_qp.h b/branches/opensm_3/user/osmtest/include/osmt_mtl_regular_qp.h deleted file mode 100644 index b9136e69..00000000 --- a/branches/opensm_3/user/osmtest/include/osmt_mtl_regular_qp.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2001-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * mad.h - - * Header file for common special QP resources creation code. - * - * Creation date: - * - * Version: osmt_mtl_regular_qp.h,v 1.2 2003/03/20 16:05:10 eitan - * - * Authors: - * Elazar Raab - * - * Changes: - */ - -#ifndef H_MAD_H -#define H_MAD_H - -#include -#include -#include -#include - -#if defined(MAD_IN) || defined(MAD_OUT) -#error MACROS MAD_IN and MAD_OUT are in use, do not override -#endif -#define MAD_IN -#define MAD_OUT - -/* HCA Constants */ -#define HCA_ID "mt21108_pci0" -#define GRH_LEN 40 -#define KNOWN_QP1_QKEY 0x80010000 - -#define MAX_OUTS_SQ 2 /* Max. buffers posted for requests in SQ */ -#define MAX_OUTS_RQ 5 /* Max. buffers posted for responses in RQ */ - -#define MAX_POLL_CNT 300 -#define POLL_SLEEP 1 /* for usleep */ - -#define MAD_SIZE 256 /* MADs are always 256B */ -#define MAD_ATTR_OFFSET 16 -#define MAD_TID_OFFSET 8 - -/* Verbs SQP resources handles */ -typedef struct { - VAPI_hca_id_t hca_id; /*id of HCA */ - u_int8_t port_num; /* the port num to use */ - VAPI_hca_hndl_t hca_hndl; /*handle of HCA */ - VAPI_qp_hndl_t qp_hndl; /*handle of QP I use */ - VAPI_mr_hndl_t mr_hndl; /*handle of memory region */ - VAPI_cq_hndl_t rq_cq_hndl, sq_cq_hndl; /*handle of send & receive completion Queues */ - VAPI_pd_hndl_t pd_hndl; /*handle of Partition Domain */ - /* VAPI_ud_av_hndl_t av_hndl; */ - IB_lid_t slid; - /*LID*/ void *buf_ptr; /*mem buffer for outstanding pkts */ - MT_size_t buf_size; /*size of mem buffer for outstanding pkts */ - - u_int32_t max_outs_sq; /*max # of outstanding pkts in send queue */ - u_int32_t max_outs_rq; /*max # of outstanding pkts in receive queue */ - - IB_rkey_t l_key; /*my l_key for memory regions */ - VAPI_qkey_t qkey; /*my qkey */ - - EVAPI_compl_handler_hndl_t rq_cq_eventh, sq_cq_eventh; /* event handlers for polling */ - - bool is_sqp; /* relate to union below - my QP */ - union { - VAPI_special_qp_t sqp_type; - VAPI_qp_num_t qp_num; - } qp_id; - void *wait_q; -} osmt_mtl_mad_res_t; - -/* init an osmt_mtl_mad_res_t with all resources initialized (use functions below) */ -VAPI_ret_t osmt_mtl_init(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ - ); -VAPI_ret_t osmt_mtl_init_opened_hca(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ - ); - -/* Cleanup all resources of (which are valid) in res */ -VAPI_ret_t osmt_mtl_mad_cleanup(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ - ); - -/* create CQs and QP as given in res->is_sqp (if TRUE, get special QP) */ -VAPI_ret_t osmt_mtl_get_qp_resources(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ - ); - -/* move QP to RTS state */ -VAPI_ret_t osmt_mtl_mad_qp_init(osmt_mtl_mad_res_t * res /*max number of outstanding packets allowed in send queue */ - ); - -/* create and register res->buf_ptr */ -VAPI_ret_t osmt_mtl_mad_create_mr(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ - ); - -VAPI_ret_t osmt_mtl_create_av(osmt_mtl_mad_res_t * res, /* pointer to res (resources) struct */ - int16_t dlid, /*destination lid */ - VAPI_ud_av_hndl_t * avh_p /* address vectr handle to update */ - ); - -/* Send MAD to given dest QP*/ -VAPI_ret_t osmt_mtl_mad_send(osmt_mtl_mad_res_t * res, /*pointer to res (resources) struct */ - VAPI_wr_id_t id, /*wqe ID */ - void *mad, /*mad buffer to send */ - VAPI_qp_num_t dest_qp, /*destination QP */ - IB_sl_t sl, /*Service Level */ - u_int32_t dest_qkey, /*Destination QP KEY */ - VAPI_ud_av_hndl_t avh /* address vectr handle to use */ - ); - -/* post buffers to RQ. returns num of buffers actually posted */ -int osmt_mtl_mad_post_recv_bufs(osmt_mtl_mad_res_t * res, /*pointer to res (resources) struct */ - void *buf_array, /*array of receive buffers */ - u_int32_t num_o_bufs, /*number of receive buffers */ - u_int32_t size, /* size of expected receive packet - MAD */ - VAPI_wr_id_t start_id /* start id for receive buffers */ - ); - -/* Poll given CQ for completion max_poll times (POLL_SLEEP [usec] delays). result in wc_desc_p. */ -VAPI_ret_t osmt_mtl_mad_poll4cqe(VAPI_hca_hndl_t hca, /*handle for HCA */ - VAPI_cq_hndl_t cq, /*handle for Completion Queue - Rcv/Send */ - VAPI_wc_desc_t * wc_desc_p, /*handle of cqe */ - u_int32_t max_poll, /*number of polling iterations */ - u_int32_t poll_sleep, /*timeout for each polling */ - VAPI_ud_av_hndl_t * avh_p /* address vectopr handle to cleanup */ - ); - -#endif diff --git a/branches/opensm_3/user/osmtest/include/osmtest.h b/branches/opensm_3/user/osmtest/include/osmtest.h deleted file mode 100644 index e0d63b0a..00000000 --- a/branches/opensm_3/user/osmtest/include/osmtest.h +++ /dev/null @@ -1,510 +0,0 @@ -/* - * Copyright (c) 2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osmtest_t. - * This object represents the OSMTest Test object. - * - */ - -#ifndef _OSMTEST_H_ -#define _OSMTEST_H_ - -#include -#include -#include -#include -#include -#include -#include "osmtest_base.h" -#include "osmtest_subnet.h" - -enum OSMT_FLOWS { - OSMT_FLOW_ALL = 0, - OSMT_FLOW_CREATE_INVENTORY, - OSMT_FLOW_VALIDATE_INVENTORY, - OSMT_FLOW_SERVICE_REGISTRATION, - OSMT_FLOW_EVENT_FORWARDING, - OSMT_FLOW_STRESS_SA, - OSMT_FLOW_MULTICAST, - OSMT_FLOW_QOS, - OSMT_FLOW_TRAP, -}; - -/****s* OpenSM: Subnet/osmtest_opt_t - * NAME - * osmtest_opt_t - * - * DESCRIPTION - * Subnet options structure. This structure contains the various - * site specific configuration parameters for osmtest. - * - * SYNOPSIS - */ -typedef struct _osmtest_opt { - uint32_t transaction_timeout; - boolean_t force_log_flush; - boolean_t create; - uint32_t retry_count; - uint32_t stress; - uint32_t mmode; - char file_name[OSMTEST_FILE_PATH_MAX]; - uint8_t flow; - uint8_t wait_time; - char *log_file; - boolean_t ignore_path_records; -} osmtest_opt_t; - -/* - * FIELDS - * - * SEE ALSO - *********/ - -/****h* OSMTest/OSMTest - * NAME - * OSMTest - * - * DESCRIPTION - * The OSMTest object tests an SM/SA for conformance to a known - * set of data about an Infiniband subnet. - * - * AUTHOR - * Steve King, Intel - * - *********/ - -/****s* OSMTest/osmtest_t - * NAME - * osmtest_t - * - * DESCRIPTION - * OSMTest structure. - * - * This object should be treated as opaque and should - * be manipulated only through the provided functions. - * - * SYNOPSIS - */ -typedef struct _osmtest { - osm_log_t log; - struct _osm_vendor *p_vendor; - osm_bind_handle_t h_bind; - osm_mad_pool_t mad_pool; - - osmtest_opt_t opt; - ib_port_attr_t local_port; - subnet_t exp_subn; - cl_qpool_t node_pool; - cl_qpool_t port_pool; - cl_qpool_t link_pool; - - uint16_t max_lid; -} osmtest_t; - -/* - * FIELDS - * log - * Log facility used by all OSMTest components. - * - * p_vendor - * Pointer to the vendor transport layer. - * - * h_bind - * The bind handle obtained by osm_vendor_sa_api/osmv_bind_sa - * - * mad_pool - * The mad pool provided for teh vendor layer to allocate mad wrappers in - * - * opt - * osmtest options structure - * - * local_port - * Port attributes for the port over which osmtest is running. - * - * exp_subn - * Subnet object representing the expected subnet - * - * node_pool - * Pool of objects for use in populating the subnet databases. - * - * port_pool - * Pool of objects for use in populating the subnet databases. - * - * link_pool - * Pool of objects for use in populating the subnet databases. - * - * SEE ALSO - *********/ - -/****s* OpenSM: Subnet/osmtest_req_context_t - * NAME - * osmtest_req_context_t - * - * DESCRIPTION - * Query context for ib_query callback function. - * - * SYNOPSIS - */ -typedef struct _osmtest_req_context { - osmtest_t *p_osmt; - osmv_query_res_t result; -} osmtest_req_context_t; - -typedef struct _osmtest_mgrp_t { - cl_map_item_t map_item; - ib_member_rec_t mcmember_rec; -} osmtest_mgrp_t; - -/* - * FIELDS - * - * SEE ALSO - *********/ - -/****f* OSMTest/osmtest_construct - * NAME - * osmtest_construct - * - * DESCRIPTION - * This function constructs an OSMTest object. - * - * SYNOPSIS - */ -void osmtest_construct(IN osmtest_t * const p_osmt); - -/* - * PARAMETERS - * p_osmt - * [in] Pointer to a OSMTest object to construct. - * - * RETURN VALUE - * This function does not return a value. - * - * NOTES - * Allows calling osmtest_init, osmtest_destroy. - * - * Calling osmtest_construct is a prerequisite to calling any other - * method except osmtest_init. - * - * SEE ALSO - * SM object, osmtest_init, osmtest_destroy - *********/ - -/****f* OSMTest/osmtest_destroy - * NAME - * osmtest_destroy - * - * DESCRIPTION - * The osmtest_destroy function destroys an osmtest object, releasing - * all resources. - * - * SYNOPSIS - */ -void osmtest_destroy(IN osmtest_t * const p_osmt); - -/* - * PARAMETERS - * p_osmt - * [in] Pointer to a OSMTest object to destroy. - * - * RETURN VALUE - * This function does not return a value. - * - * NOTES - * Performs any necessary cleanup of the specified OSMTest object. - * Further operations should not be attempted on the destroyed object. - * This function should only be called after a call to osmtest_construct or - * osmtest_init. - * - * SEE ALSO - * SM object, osmtest_construct, osmtest_init - *********/ - -/****f* OSMTest/osmtest_init - * NAME - * osmtest_init - * - * DESCRIPTION - * The osmtest_init function initializes a OSMTest object for use. - * - * SYNOPSIS - */ -ib_api_status_t osmtest_init(IN osmtest_t * const p_osmt, - IN const osmtest_opt_t * const p_opt, - IN const osm_log_level_t log_flags); - -/* - * PARAMETERS - * p_osmt - * [in] Pointer to an osmtest_t object to initialize. - * - * p_opt - * [in] Pointer to the options structure. - * - * log_flags - * [in] Log level flags to set. - * - * RETURN VALUES - * IB_SUCCESS if the OSMTest object was initialized successfully. - * - * NOTES - * Allows calling other OSMTest methods. - * - * SEE ALSO - * SM object, osmtest_construct, osmtest_destroy - *********/ - -/****f* OSMTest/osmtest_run - * NAME - * osmtest_run - * - * DESCRIPTION - * Runs the osmtest suite. - * - * SYNOPSIS - */ -ib_api_status_t osmtest_run(IN osmtest_t * const p_osmt); - -/* - * PARAMETERS - * p_osmt - * [in] Pointer to an osmtest_t object. - * - * guid - * [in] Port GUID over which to run the test suite. - * - * RETURN VALUES - * IB_SUCCESS - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OSMTest/osmtest_bind - * NAME - * osmtest_bind - * - * DESCRIPTION - * Binds osmtest to a local port. - * - * SYNOPSIS - */ -ib_api_status_t osmtest_bind(IN osmtest_t * p_osmt, - IN uint16_t max_lid, IN ib_net64_t guid OPTIONAL); - -/* - * PARAMETERS - * p_osmt - * [in] Pointer to an osmtest_t object. - * - * max_lid - * [in] The maximal lid to query about (if RMPP is not supported) - * - * guid - * [in] Port GUID over which to run the test suite. - * If zero, the bind function will display a menu of local - * port guids and wait for user input. - * - * RETURN VALUES - * IB_SUCCESS - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OSMTest/osmtest_query_res_cb - * NAME - * osmtest_query_res_cb - * - * DESCRIPTION - * A Callback for the query to invoke on completion - * - * SYNOPSIS - */ -void osmtest_query_res_cb(IN osmv_query_res_t * p_rec); -/* - * PARAMETERS - * p_rec - * [in] Pointer to an ib_query_rec_t object used for the query. - * - * RETURN VALUES - * NONE - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OSMTest/ib_get_mad_status_str - * NAME - * ib_get_mad_status_str - * - * DESCRIPTION - * return the string representing the given mad status - * - * SYNOPSIS - */ -const char *ib_get_mad_status_str(IN const ib_mad_t * const p_mad); -/* - * PARAMETERS - * p_mad - * [in] Pointer to the mad payload - * - * RETURN VALUES - * NONE - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OSMTest/osmt_run_service_records_flow - * NAME - * osmt_run_service_records_flow - * - * DESCRIPTION - * Run the service record testing flow. - * - * SYNOPSIS - */ -ib_api_status_t osmt_run_service_records_flow(IN osmtest_t * const p_osmt); -/* - * PARAMETERS - * p_osmt - * [in] Pointer to the osmtest obj - * - * RETURN VALUES - * IB_SUCCESS if PASS - * - * NOTES - * - * SEE ALSO - *********/ - -ib_api_status_t osmt_run_inform_info_flow(IN osmtest_t * const p_osmt); - -/****f* OSMTest/osmt_run_slvl_and_vlarb_records_flow - * NAME - * osmt_run_slvl_and_vlarb_records_flow - * - * DESCRIPTION - * Run the sl2vl and vlarb tables testing flow. - * - * SYNOPSIS - */ -ib_api_status_t -osmt_run_slvl_and_vlarb_records_flow(IN osmtest_t * const p_osmt); -/* - * PARAMETERS - * p_osmt - * [in] Pointer to the osmtest obj - * - * RETURN VALUES - * IB_SUCCESS if PASS - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OSMTest/osmt_run_mcast_flow - * NAME - * osmt_run_mcast_flow - * - * DESCRIPTION - * Run the multicast test flow - * - * SYNOPSIS - */ -ib_api_status_t osmt_run_mcast_flow(IN osmtest_t * const p_osmt); -/* - * PARAMETERS - * p_osmt - * [in] Pointer to the osmtest obj - * - * RETURN VALUES - * IB_SUCCESS if PASS - * - * NOTES - * - * SEE ALSO - *********/ - -/****f* OSMTest/osmt_run_trap64_65_flow - * NAME - * osmt_run_trap64_65_flow - * - * DESCRIPTION - * Run the trap 64/65 test flow. This test is ran with - * an outside tool. - * - * SYNOPSIS - */ -ib_api_status_t osmt_run_trap64_65_flow(IN osmtest_t * const p_osmt); -/* - * PARAMETERS - * p_osmt - * [in] Pointer to the osmtest obj - * - * RETURN VALUES - * IB_SUCCESS if PASS - * - * NOTES - * - * SEE ALSO - *********/ - -ib_api_status_t -osmtest_get_all_recs(IN osmtest_t * const p_osmt, - IN ib_net16_t const attr_id, - IN size_t const attr_size, - IN OUT osmtest_req_context_t * const p_context); - -ib_api_status_t -osmtest_get_local_port_lmc(IN osmtest_t * const p_osmt, - IN ib_net16_t lid, OUT uint8_t * const p_lmc); - -/* - * A few auxiliary macros for logging - */ - -#define EXPECTING_ERRORS_START "[[ ===== Expecting Errors - START ===== " -#define EXPECTING_ERRORS_END " ===== Expecting Errors - END ===== ]]" - -#endif /* _OSMTEST_H_ */ diff --git a/branches/opensm_3/user/osmtest/include/osmtest_base.h b/branches/opensm_3/user/osmtest/include/osmtest_base.h deleted file mode 100644 index 00749705..00000000 --- a/branches/opensm_3/user/osmtest/include/osmtest_base.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osmtest_t. - * This object represents the OSMTest Test object. - * - */ -#ifndef _OSMTEST_BASE_H_ -#define _OSMTEST_BASE_H_ - -#ifndef __WIN__ -#include -#else -#include -#endif - -#define OSMTEST_MAX_LINE_LEN 120 -#define OSMTEST_FILE_PATH_MAX PATH_MAX - -#define STRESS_SMALL_RMPP_THR 100000 -/* - Take long times when querying big clusters (over 40 nodes), an average of : 0.25 sec for query - each query receives 1000 records -*/ -#define STRESS_LARGE_RMPP_THR 4000 -#define STRESS_LARGE_PR_RMPP_THR 20000 -#define STRESS_GET_PR 100000 - -extern const char *const p_file; - -#endif /* _OSMTEST_BASE_H_ */ diff --git a/branches/opensm_3/user/osmtest/include/osmtest_subnet.h b/branches/opensm_3/user/osmtest/include/osmtest_subnet.h deleted file mode 100644 index dfd92016..00000000 --- a/branches/opensm_3/user/osmtest/include/osmtest_subnet.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Copyright (c) 2006 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Declaration of osmtest_t. - * This object represents the OSMTest Test object. - * - */ - -#ifndef _OSMTEST_SUBNET_H_ -#define _OSMTEST_SUBNET_H_ - -#include -#include -#include -#include -#include -#include - -/****s* Subnet Database/generic_t -* NAME -* generic_t -* -* DESCRIPTION -* Subnet database object for fields common to all record types. -* All other database types must be castable to this type. -* -* SYNOPSIS -*/ -typedef struct _generic { - cl_map_item_t map_item; /* must be first element! */ - uint32_t count; /* must be second element! */ -} generic_t; - -/* -* FIELDS -* -* SEE ALSO -*********/ - -/****s* Subnet Database/node_t -* NAME -* node_t -* -* DESCRIPTION -* Subnet database object for nodes. -* Must be castable to generic_t. -* -* SYNOPSIS -*/ -typedef struct _node { - cl_map_item_t map_item; /* must be first element! */ - uint32_t count; /* must be second element! */ - ib_node_record_t rec; - ib_node_record_t comp; -} node_t; - -/* -* FIELDS -* map_item -* Provides linkage for the qmap container. -* -* rec -* NodeRecord for this node as read from the database file. -* -* comp -* NodeRecord indicating which fields should be compared against rec. -* Bits set in the comp NodeRecord indicate that bit in the rec structure -* should be compared against real-time data from the SA. -* -* count -* Utility counter used by the validation logic. Typically used to -* to indicate the number of times a matching node was received from -* the SA. -* -* SEE ALSO -*********/ - -static inline node_t *node_new(void) -{ - node_t *p_obj; - - p_obj = malloc(sizeof(*p_obj)); - if (p_obj) - memset(p_obj, 0, sizeof(*p_obj)); - return (p_obj); -} - -static inline void node_delete(IN node_t * p_obj) -{ - free(p_obj); -} - -/****s* Subnet Database/port_t -* NAME -* port_t -* -* DESCRIPTION -* Subnet database object for ports. -* Must be castable to generic_t. -* -* SYNOPSIS -*/ -typedef struct _port { - cl_map_item_t map_item; /* must be first element! */ - uint32_t count; /* must be second element! */ - /* Since there is no unique identifier for all ports we - must be able to have such a key by the lid and port num */ - uint64_t port_id; - ib_portinfo_record_t rec; - ib_portinfo_record_t comp; -} port_t; - -/* -* FIELDS -* -* map_item -* Provides linkage for the qmap container. -* -* rec -* PortInfoRecord for this port as read from the database file. -* -* comp -* PortInfoRecord indicating which fields should be compared against rec. -* Bits set in the comp NodeRecord indicate that bit in the rec structure -* should be compared against real-time data from the SA. -* -* count -* Utility counter used by the validation logic. Typically used to -* to indicate the number of times a matching node was received from -* the SA. -* -* SEE ALSO -*********/ - -static inline port_t *port_new(void) -{ - port_t *p_obj; - - p_obj = malloc(sizeof(*p_obj)); - if (p_obj) - memset(p_obj, 0, sizeof(*p_obj)); - return (p_obj); -} - -static inline void port_delete(IN port_t * p_obj) -{ - free(p_obj); -} - -static inline uint64_t -port_gen_id(IN ib_net16_t const lid, IN uint8_t const port_num) -{ - return (lid << 8 | port_num); -} - -static inline void -port_ext_id(IN uint64_t id, IN ib_net16_t * p_lid, IN uint8_t * p_port_num) -{ - CL_ASSERT((id & 0xFF) < 0x100); - *p_port_num = (uint8_t) (id & 0xFF); - CL_ASSERT(((id >> 8) & 0xFFFF) < 0x10000); - *p_lid = (uint16_t) ((id >> 8) & 0xFFFF); -} - -static inline void -port_set_id(IN port_t * p_obj, - IN ib_net16_t const lid, IN uint8_t const port_num) -{ - p_obj->port_id = port_gen_id(lid, port_num); -} - -static inline void -port_get_id(IN port_t * p_obj, IN ib_net16_t * p_lid, IN uint8_t * p_port_num) -{ - port_ext_id(p_obj->port_id, p_lid, p_port_num); -} - -/****s* Subnet Database/path_t -* NAME -* node_t -* -* DESCRIPTION -* Subnet database object for paths. -* Must be castable to generic_t. -* -* SYNOPSIS -*/ -typedef struct _path { - cl_map_item_t map_item; /* must be first element! */ - uint32_t count; /* must be second element! */ - ib_path_rec_t rec; - ib_path_rec_t comp; -} path_t; - -/* -* FIELDS -* map_item -* Provides linkage for the qmap container. -* -* rec -* PathRecord for this path as read from the database file. -* -* comp -* PathRecord indicating which fields should be compared against rec. -* Bits set in the comp PathRecord indicate that bit in the rec structure -* should be compared against real-time data from the SA. -* -* count -* Utility counter used by the validation logic. Typically used to -* to indicate the number of times a matching node was received from -* the SA. -* -* SEE ALSO -*********/ - -static inline path_t *path_new(void) -{ - path_t *p_obj; - - p_obj = malloc(sizeof(*p_obj)); - if (p_obj) - memset(p_obj, 0, sizeof(*p_obj)); - return (p_obj); -} - -static inline void path_delete(IN path_t * p_obj) -{ - free(p_obj); -} - -/****s* Subnet Database/subnet_t -* NAME -* subnet_t -* -* DESCRIPTION -* Subnet database object. -* -* SYNOPSIS -*/ -typedef struct _subnet { - cl_qmap_t node_lid_tbl; - cl_qmap_t node_guid_tbl; - cl_qmap_t mgrp_mlid_tbl; - /* cl_qmap_t port_lid_tbl; */ - /* cl_qmap_t port_guid_tbl; */ - cl_qmap_t port_key_tbl; - cl_qmap_t link_tbl; - cl_qmap_t path_tbl; -} subnet_t; - -/* -* FIELDS -* -* SEE ALSO -*********/ - -/****f* Subnet Database/subnet_construct -* NAME -* subnet_construct -* -* DESCRIPTION -* This function constructs an subnet database object. -* This function cannot fail. -* -* SYNOPSIS -*/ -void subnet_construct(IN subnet_t * const p_subn); - -/* -* FIELDS -* -* SEE ALSO -*********/ - -/****f* Subnet Database/subnet_init -* NAME -* subnet_init -* -* DESCRIPTION -* This function initializes an subnet database object. -* -* SYNOPSIS -*/ -cl_status_t subnet_init(IN subnet_t * const p_subn); - -/* -* FIELDS -* -* SEE ALSO -*********/ - -#endif diff --git a/branches/opensm_3/user/osmtest/main.c b/branches/opensm_3/user/osmtest/main.c deleted file mode 100644 index a8f41fe3..00000000 --- a/branches/opensm_3/user/osmtest/main.c +++ /dev/null @@ -1,622 +0,0 @@ -/* - * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Command line interface for osmtest. - * - */ - -#include -#include -#include -#include -#include "osmtest.h" - -/******************************************************************** - D E F I N E G L O B A L V A R I A B L E S -*********************************************************************/ - -/* - This is the global osmtest object. - One osmtest object is required per subnet. - Future versions could support multiple subents by - instantiating more than one osmtest object. -*/ -#define MAX_LOCAL_IBPORTS 64 -#define OSMT_DEFAULT_RETRY_COUNT 3 -#define OSMT_DEFAULT_TRANS_TIMEOUT_MILLISEC 1000 -#define OSMT_DEFAULT_TRAP_WAIT_TIMEOUT_SEC 10 -#define INVALID_GUID (0xFFFFFFFFFFFFFFFFULL) - -boolean_t osmt_is_debug(void) -{ -#if defined( _DEBUG_ ) - return TRUE; -#else - return FALSE; -#endif /* defined( _DEBUG_ ) */ -} - -void show_usage() -{ - printf - ("\n------- osmtest - Usage and options ----------------------\n"); - printf("Usage: osmtest [options]\n"); - printf("Options:\n"); - printf("-f \n" - "--flow \n" - " This option directs osmtest to run a specific flow:\n" - " FLOW DESCRIPTION\n" - " c = create an inventory file with all nodes, ports and paths\n" - " a = run all validation tests (expecting an input inventory)\n" - " v = only validate the given inventory file\n" - " s = run service registration, deregistration, and lease test\n" - " e = run event forwarding test\n" - " f = flood the SA with queries according to the stress mode\n" - " m = multicast flow\n" - " q = QoS info: dump VLArb and SLtoVL tables\n" - " t = run trap 64/65 flow (this flow requires running of external tool)\n" - " (default is all flows except QoS)\n\n"); - - printf("-w \n" - "--wait \n" - " This option specifies the wait time for trap 64/65 in seconds\n" - " It is used only when running -f t - the trap 64/65 flow\n" - " (default to 10 sec)\n\n"); - printf("-d \n" - "--debug \n" - " This option specifies a debug option\n" - " These options are not normally needed\n" - " The number following -d selects the debug\n" - " option to enable as follows:\n" - " OPT Description\n" - " --- -----------------\n" - " -d0 - Unused.\n" - " -d1 - Do not scan/compare path records.\n" - " -d2 - Force log flushing after each log message.\n" - " Without -d, no debug options are enabled\n\n"); - printf("-m \n" - "--max_lid \n" - " This option specifies the maximal LID number to be searched\n" - " for during inventory file build (default to 100)\n\n"); - printf("-g \n" - "--guid \n" - " This option specifies the local port GUID value\n" - " with which osmtest should bind. osmtest may be\n" - " bound to 1 port at a time\n\n"); - printf("-p \n" - "--port\n" - " This option displays a menu of possible local port GUID values\n" - " with which osmtest could bind\n\n"); - printf("-h\n" - "--help\n" " Display this usage info then exit\n\n"); - printf("-i \n" - "--inventory \n" - " This option specifies the name of the inventory file\n" - " Normally, osmtest expects to find an inventory file,\n" - " which osmtest uses to validate real-time information\n" - " received from the SA during testing\n" - " If -i is not specified, osmtest defaults to the file\n" - " 'osmtest.dat'\n" - " See -c option for related information\n\n"); - printf("-s\n" - "--stress\n" - " This option runs the specified stress test instead\n" - " of the normal test suite\n" - " Stress test options are as follows:\n" - " OPT Description\n" - " --- -----------------\n" - " -s1 - Single-MAD (RMPP) response SA queries\n" - " -s2 - Multi-MAD (RMPP) response SA queries\n" - " -s3 - Multi-MAD (RMPP) Path Record SA queries\n" - " -s4 - Single-MAD (non RMPP) get Path Record SA queries\n" - " Without -s, stress testing is not performed\n\n"); - printf("-M\n" - "--Multicast_Mode\n" - " This option specify length of Multicast test:\n" - " OPT Description\n" - " --- -----------------\n" - " -M1 - Short Multicast Flow (default) - single mode\n" - " -M2 - Short Multicast Flow - multiple mode\n" - " -M3 - Long Multicast Flow - single mode\n" - " -M4 - Long Multicast Flow - multiple mode\n" - " Single mode - Osmtest is tested alone, with no other\n" - " apps that interact with OpenSM MC\n" - " Multiple mode - Could be run with other apps using MC with\n" - " OpenSM." - " Without -M, default flow testing is performed\n\n"); - - printf("-t \n" - " This option specifies the time in milliseconds\n" - " used for transaction timeouts\n" - " Specifying -t 0 disables timeouts\n" - " Without -t, osmtest defaults to a timeout value of\n" - " 1 second\n\n"); - printf("-l\n" - "--log_file\n" - " This option defines the log to be the given file\n" - " By default the log goes to stdout\n\n"); - printf("-v\n" - " This option increases the log verbosity level\n" - " The -v option may be specified multiple times\n" - " to further increase the verbosity level\n" - " See the -vf option for more information about.\n" - " log verbosity\n\n"); - printf("-V\n" - " This option sets the maximum verbosity level and\n" - " forces log flushing\n" - " The -V is equivalent to '-vf 0xFF -d 2'\n" - " See the -vf option for more information about.\n" - " log verbosity\n\n"); - printf("-vf \n" - " This option sets the log verbosity level\n" - " A flags field must follow the -vf option\n" - " A bit set/clear in the flags enables/disables a\n" - " specific log level as follows:\n" - " BIT LOG LEVEL ENABLED\n" - " ---- -----------------\n" - " 0x01 - ERROR (error messages)\n" - " 0x02 - INFO (basic messages, low volume)\n" - " 0x04 - VERBOSE (interesting stuff, moderate volume)\n" - " 0x08 - DEBUG (diagnostic, high volume)\n" - " 0x10 - FUNCS (function entry/exit, very high volume)\n" - " 0x20 - FRAMES (dumps all SMP and GMP frames)\n" - " 0x40 - currently unused\n" - " 0x80 - currently unused\n" - " Without -vf, osmtest defaults to ERROR + INFO (0x3)\n" - " Specifying -vf 0 disables all messages\n" - " Specifying -vf 0xFF enables all messages (see -V)\n" - " High verbosity levels may require increasing\n" - " the transaction timeout with the -t option\n\n"); -} - -static void print_all_guids(IN osmtest_t * p_osmt) -{ - ib_api_status_t status; - uint32_t num_ports = MAX_LOCAL_IBPORTS; - ib_port_attr_t attr_array[MAX_LOCAL_IBPORTS] = { {0} }; - uint32_t i; - - /* - Call the transport layer for a list of local port - GUID values. - */ - status = - osm_vendor_get_all_port_attr(p_osmt->p_vendor, attr_array, - &num_ports); - if (status != IB_SUCCESS) { - printf("\nError from osm_vendor_get_all_port_attr (%x)\n", - status); - return; - } - - printf("\nListing GUIDs:\n"); - for (i = 0; i < num_ports; i++) - printf("Port %i: 0x%" PRIx64 "\n", i, - cl_hton64(attr_array[i].port_guid)); -} - -ib_net64_t get_port_guid(IN osmtest_t * p_osmt, uint64_t port_guid) -{ - ib_api_status_t status; - uint32_t num_ports = MAX_LOCAL_IBPORTS; - ib_port_attr_t attr_array[MAX_LOCAL_IBPORTS] = { {0} }; - uint32_t i; - - /* - Call the transport layer for a list of local port - GUID values. - */ -/* "local ports" is(?) phys, shouldn't this exclude port 0 then ? */ - status = - osm_vendor_get_all_port_attr(p_osmt->p_vendor, attr_array, - &num_ports); - if (status != IB_SUCCESS) { - printf("\nError from osm_vendor_get_all_port_attr (%x)\n", - status); - return (0); - } - - if (num_ports == 1) { - printf("using default guid 0x%" PRIx64 "\n", - cl_hton64(attr_array[0].port_guid)); - return (attr_array[0].port_guid); - } - - for (i = 0; i < num_ports; i++) { - if (attr_array[i].port_guid == port_guid || - (!port_guid && attr_array[i].link_state > IB_LINK_DOWN)) - return attr_array[i].port_guid; - } - - return 0; -} - -int main(int argc, char *argv[]) -{ - static osmtest_t osm_test; - osmtest_opt_t opt = { 0 }; - ib_net64_t guid = 0; - uint16_t max_lid = 100; - ib_api_status_t status; - uint32_t log_flags = OSM_LOG_ERROR | OSM_LOG_INFO; - int32_t vendor_debug = 0; - char flow_name[64]; - uint32_t next_option; - const char *const short_option = -#ifdef __WIN__ - "?" -#endif - "f:l:m:M:d:g:s:t:i:pcvVh"; - - /* - * In the array below, the 2nd parameter specified the number - * of arguments as follows: - * 0: no arguments - * 1: argument - * 2: optional - */ - const struct option long_option[] = { - {"create", 0, NULL, 'c'}, - {"debug", 1, NULL, 'd'}, - {"flow", 1, NULL, 'f'}, - {"wait", 1, NULL, 'w'}, - {"inventory", 1, NULL, 'i'}, - {"max_lid", 1, NULL, 'm'}, - {"guid", 2, NULL, 'g'}, - {"port", 0, NULL, 'p'}, - {"help", 0, NULL, 'h'}, - {"stress", 1, NULL, 's'}, - {"Multicast_Mode", 1, NULL, 'M'}, - {"timeout", 1, NULL, 't'}, - {"verbose", 0, NULL, 'v'}, - {"log_file", 1, NULL, 'l'}, - {"vf", 1, NULL, 'x'}, - {"V", 0, NULL, 'V'}, - - {NULL, 0, NULL, 0} /* Required at end of array */ - }; - - /* Make sure that the opensm, complib and osmtest were compiled using - same modes (debug/free) */ - if (osm_is_debug() != cl_is_debug() || osm_is_debug() != osmt_is_debug() - || osmt_is_debug() != cl_is_debug()) { - fprintf(stderr, - "-E- OpenSM, Complib and OsmTest were compiled using different modes\n"); - fprintf(stderr, - "-E- OpenSM debug:%d Complib debug:%d OsmTest debug:%d \n", - osm_is_debug(), cl_is_debug(), osmt_is_debug()); - exit(1); - } - - opt.transaction_timeout = OSMT_DEFAULT_TRANS_TIMEOUT_MILLISEC; - opt.wait_time = OSMT_DEFAULT_TRAP_WAIT_TIMEOUT_SEC; - opt.retry_count = OSMT_DEFAULT_RETRY_COUNT; - opt.force_log_flush = FALSE; - opt.stress = 0; - opt.log_file = NULL; - opt.create = FALSE; - opt.mmode = 1; - opt.ignore_path_records = FALSE; /* Do path Records too */ - opt.flow = OSMT_FLOW_ALL; /* run all validation tests */ - strcpy(flow_name, "All Validations"); - strcpy(opt.file_name, "osmtest.dat"); - - printf("\nCommand Line Arguments\n"); - do { - next_option = getopt_long_only(argc, argv, short_option, - long_option, NULL); - switch (next_option) { - case 'c': - /* - * Create the inventory file. - */ - opt.create = TRUE; - printf("\tCreating inventory file\n"); - break; - - case 'i': - /* - * Specifies inventory file name. - */ - if (strlen(optarg) > OSMTEST_FILE_PATH_MAX) - printf - ("\nError: path name too long (ignored)\n"); - else - strcpy(opt.file_name, optarg); - - printf("\tFile = %s\n", opt.file_name); - break; - - case 'f': - /* - * Specifies Flow . - */ - if (strlen(optarg) > OSMTEST_FILE_PATH_MAX) - printf - ("\nError: path name too long (ignored)\n"); - else - strcpy(flow_name, optarg); - - if (!strcmp("c", optarg)) { - strcpy(flow_name, "Create Inventory"); - opt.flow = OSMT_FLOW_CREATE_INVENTORY; - } else if (!strcmp("v", optarg)) { - strcpy(flow_name, "Validate Inventory"); - opt.flow = OSMT_FLOW_VALIDATE_INVENTORY; - } else if (!strcmp("s", optarg)) { - strcpy(flow_name, "Services Registration"); - opt.flow = OSMT_FLOW_SERVICE_REGISTRATION; - } else if (!strcmp("e", optarg)) { - strcpy(flow_name, "Event Forwarding"); - opt.flow = OSMT_FLOW_EVENT_FORWARDING; - } else if (!strcmp("f", optarg)) { - strcpy(flow_name, "Stress SA"); - opt.flow = OSMT_FLOW_STRESS_SA; - } else if (!strcmp("m", optarg)) { - strcpy(flow_name, "Multicast"); - opt.flow = OSMT_FLOW_MULTICAST; - } else if (!strcmp("q", optarg)) { - strcpy(flow_name, "QoS: VLArb and SLtoVL"); - opt.flow = OSMT_FLOW_QOS; - } else if (!strcmp("t", optarg)) { - strcpy(flow_name, "Trap 64/65"); - opt.flow = OSMT_FLOW_TRAP; - } else if (!strcmp("a", optarg)) { - strcpy(flow_name, "All Validations"); - opt.flow = OSMT_FLOW_ALL; - } else { - printf("\nError: unknown flow %s\n", flow_name); - exit(2); - } - break; - - case 'w': - /* - * Specifies trap 64/65 wait time - */ - CL_ASSERT(strtol(optarg, NULL, 0) < 0x100); - opt.wait_time = (uint8_t) strtol(optarg, NULL, 0); - printf("\tTrap 64/65 wait time = %d\n", opt.wait_time); - break; - - case 'm': - /* - * Specifies the max LID to search for during exploration. - */ - max_lid = (uint16_t) atoi(optarg); - printf("\tMAX-LID %u\n", max_lid); - break; - - case 'g': - /* - * Specifies port guid with which to bind. - */ - guid = cl_hton64(strtoull(optarg, NULL, 16)); - printf(" Guid <0x%" PRIx64 ">\n", cl_hton64(guid)); - break; - - case 'p': - /* - * Display current port guids - */ - guid = INVALID_GUID; - break; - - case 't': - /* - * Specifies transaction timeout. - */ - opt.transaction_timeout = strtol(optarg, NULL, 0); - printf("\tTransaction timeout = %d\n", - opt.transaction_timeout); - break; - - case 'l': - opt.log_file = optarg; - printf("\tLog File:%s\n", opt.log_file); - break; - - case 'v': - /* - * Increases log verbosity. - */ - log_flags = (log_flags << 1) | 1; - printf("\tVerbose option -v (log flags = 0x%X)\n", - log_flags); - break; - - case 'V': - /* - * Specifies maximum log verbosity. - */ - log_flags = 0xFFFFFFFF; - opt.force_log_flush = TRUE; - printf("\tEnabling maximum log verbosity\n"); - break; - - case 's': - /* - * Perform stress test. - */ - opt.stress = strtol(optarg, NULL, 0); - printf("\tStress test enabled: "); - switch (opt.stress) { - case 1: - printf("Small SA queries\n"); - break; - case 2: - printf("Large SA queries\n"); - break; - case 3: - printf("Large Path Record SA queries\n"); - break; - case 4: - printf("SA Get Path Record queries\n"); - break; - default: - printf("Unknown value %u (ignored)\n", - opt.stress); - opt.stress = 0; - break; - } - break; - - case 'M': - /* - * Perform multicast test. - */ - opt.mmode = strtol(optarg, NULL, 0); - printf("\tMulticast test enabled: "); - switch (opt.mmode) { - case 1: - printf - ("Short MC Flow - single mode (default)\n"); - break; - case 2: - printf("Short MC Flow - multiple mode\n"); - break; - case 3: - printf("Long MC Flow - single mode\n"); - break; - case 4: - printf("Long MC Flow - multiple mode\n"); - break; - default: - printf("Unknown value %u (ignored)\n", - opt.stress); - opt.mmode = 0; - break; - } - break; - - case 'd': - /* - * Debug Options - */ - printf("\tDebug Option: "); - switch (strtol(optarg, NULL, 0)) { - case 1: - printf("Ignore Path Records\n"); - opt.ignore_path_records = TRUE; - break; - case 2: - printf("Force Log Flush\n"); - opt.force_log_flush = TRUE; - break; - case 3: - /* Used to be memory tracking */ - default: - printf("Unknown value %ld (ignored)\n", - strtol(optarg, NULL, 0)); - break; - } - break; - -#ifdef __WIN__ - case '?': -#endif - case 'h': - show_usage(); - return 0; - - case 'x': - log_flags = strtol(optarg, NULL, 0); - printf - ("\t\t\t\tVerbose option -vf (log flags = 0x%X)\n", - log_flags); - break; - - case -1: - printf("Done with args\n"); - break; - - default: /* something wrong */ - abort(); - } - - } - while (next_option != -1); - - printf("\tFlow = %s\n", flow_name); - - if (vendor_debug) - osm_vendor_set_debug(osm_test.p_vendor, vendor_debug); - - complib_init(); - - status = osmtest_init(&osm_test, &opt, (osm_log_level_t) log_flags); - if (status != IB_SUCCESS) { - printf("\nError from osmtest_init: %s\n", - ib_get_err_str(status)); - goto Exit; - } - if (cl_hton64(guid) == cl_hton64(INVALID_GUID)) { - print_all_guids(&osm_test); - complib_exit(); - return (status); - } - - /* - If the user didn't specify a GUID on the command line, - then get a port GUID value with which to bind. - */ - if (guid == 0 && !(guid = get_port_guid(&osm_test, guid))) { - printf("\nError: port guid 0x%" PRIx64 " not found\n", guid); - goto Exit; - } - - /* - * Guid may be zero going into this function if the user - * hasn't specified a binding port on the command line. - */ - status = osmtest_bind(&osm_test, max_lid, guid); - if (status != IB_SUCCESS) - exit(status); - - status = osmtest_run(&osm_test); - if (status != IB_SUCCESS) { - printf("OSMTEST: TEST \"%s\" FAIL\n", flow_name); - } else { - printf("OSMTEST: TEST \"%s\" PASS\n", flow_name); - } - osmtest_destroy(&osm_test); - - complib_exit(); - -Exit: - return (status); -} diff --git a/branches/opensm_3/user/osmtest/osmt_files.c b/branches/opensm_3/user/osmtest/osmt_files.c deleted file mode 100644 index 65b6bcb0..00000000 --- a/branches/opensm_3/user/osmtest/osmt_files.c +++ /dev/null @@ -1,11 +0,0 @@ - -/* - * Supply missing files/routines for Windows osmtest build. - * Point being to minimize mods to other OFED/opensm files... - */ - -void OsmReportState(const char *p_str) { } - -#include <..\opensm\osm_log.c> -#include <..\opensm\osm_mad_pool.c> -#include <..\opensm\osm_helper.c> diff --git a/branches/opensm_3/user/osmtest/osmt_inform.c b/branches/opensm_3/user/osmtest/osmt_inform.c deleted file mode 100644 index a28c0051..00000000 --- a/branches/opensm_3/user/osmtest/osmt_inform.c +++ /dev/null @@ -1,767 +0,0 @@ -/* - * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifdef OSM_VENDOR_INTF_MTL -/* - * Abstract: - * Implementation of InformInfo testing flow.. - * Top level is osmt_run_inform_info_flow: - * osmt_bind_inform_qp - * osmt_reg_unreg_inform_info - * osmt_send_trap_wait_for_forward - * - */ - -#include -#include -#include -#include -#include -#include -#include "osmtest.h" -#include "osmt_inform.h" - -/* - * Prepare an asynchronous QP (rcv) for sending inform info and - * handling the incoming reports. - * - */ -ib_api_status_t -osmt_bind_inform_qp(IN osmtest_t * const p_osmt, OUT osmt_qp_ctx_t * p_qp_ctx) -{ - ib_net64_t port_guid; - VAPI_hca_hndl_t hca_hndl; - VAPI_hca_id_t hca_id; - uint32_t port_num; - VAPI_ret_t vapi_ret; - IB_MGT_ret_t mgt_ret; - uint8_t hca_index; - osm_log_t *p_log = &p_osmt->log; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_log); - - port_guid = p_osmt->local_port.port_guid; - - OSM_LOG(p_log, OSM_LOG_DEBUG, "Binding to port 0x%" PRIx64 "\n", - cl_ntoh64(port_guid)); - - /* obtain the hca name and port num from the guid */ - OSM_LOG(p_log, OSM_LOG_DEBUG, - "Finding CA and Port that owns port guid 0x%" PRIx64 "\n", - port_guid); - - mgt_ret = - osm_vendor_get_guid_ca_and_port(p_osmt->p_vendor, - port_guid, - &hca_hndl, - &hca_id[0], &hca_index, &port_num); - if (mgt_ret != IB_MGT_OK) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0109: " - "Unable to obtain CA and port (%d).\n"); - status = IB_ERROR; - goto Exit; - } -#define OSMT_MTL_REVERSE_QP1_WELL_KNOWN_Q_KEY 0x80010000 - - strncpy(p_qp_ctx->qp_bind_hndl.hca_id, hca_id, sizeof(hca_id)); - p_qp_ctx->qp_bind_hndl.hca_hndl = hca_hndl; - p_qp_ctx->qp_bind_hndl.port_num = port_num; - p_qp_ctx->qp_bind_hndl.max_outs_sq = 10; - p_qp_ctx->qp_bind_hndl.max_outs_rq = 10; - p_qp_ctx->qp_bind_hndl.qkey = OSMT_MTL_REVERSE_QP1_WELL_KNOWN_Q_KEY; - - vapi_ret = osmt_mtl_init_opened_hca(&p_qp_ctx->qp_bind_hndl); - if (vapi_ret != VAPI_OK) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0114: " - "Error initializing QP.\n"); - status = IB_ERROR; - goto Exit; - } - - /* we use the pre-allocated buffers for send and receive : - send from buf[0] - receive from buf[2] - */ - p_qp_ctx->p_send_buf = - (uint8_t *) p_qp_ctx->qp_bind_hndl.buf_ptr + GRH_LEN; - p_qp_ctx->p_recv_buf = - (uint8_t *) p_qp_ctx->qp_bind_hndl.buf_ptr + 2 * (GRH_LEN + - MAD_BLOCK_SIZE); - - /* Need to clear assigned memory of p_send_buf - before using it to send any data */ - memset(p_qp_ctx->p_send_buf, 0, MAD_BLOCK_SIZE); - - status = IB_SUCCESS; - OSM_LOG(p_log, OSM_LOG_DEBUG, "Initialized QP:0x%X in VAPI Mode\n", - p_qp_ctx->qp_bind_hndl.qp_id); - - OSM_LOG(p_log, OSM_LOG_DEBUG, "Binding to IB_MGT SMI\n"); - - /* we also need a QP0 handle for sending packets */ - mgt_ret = IB_MGT_get_handle(hca_id, port_num, IB_MGT_SMI, - &(p_qp_ctx->ib_mgt_qp0_handle)); - if (IB_MGT_OK != mgt_ret) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0115: " - "Error obtaining IB_MGT handle to SMI\n"); - status = IB_ERROR; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -/* - * Close the QP - */ -void -osmt_unbind_inform_qp(IN osmtest_t * const p_osmt, IN osmt_qp_ctx_t * p_qp_ctx) -{ - osm_log_t *p_log = &p_osmt->log; - - OSM_LOG_ENTER(p_log); - - osmt_mtl_mad_cleanup(&p_qp_ctx->qp_bind_hndl); - - IB_MGT_release_handle(p_qp_ctx->ib_mgt_qp0_handle); - - OSM_LOG(p_log, OSM_LOG_DEBUG, "Unbind QP handles\n"); - OSM_LOG_EXIT(&p_osmt->log); -} - -/* - * Register/Unregister to receive the given InformInfo - * - * Uses the qp context to send the inform info mad. - * Wait for GetResp(InformInfoResp) - * - */ -ib_api_status_t -osmt_reg_unreg_inform_info(IN osmtest_t * p_osmt, - IN osmt_qp_ctx_t * p_qp_ctx, - IN ib_inform_info_t * p_inform_info, - IN uint8_t reg_flag) -{ - ib_sa_mad_t *p_sa_mad = (ib_sa_mad_t *) (p_qp_ctx->p_send_buf); - ib_inform_info_t *p_ii = ib_sa_mad_get_payload_ptr(p_sa_mad); /* SA Payload */ - VAPI_ret_t vapi_ret; - VAPI_wc_desc_t wc_desc; - VAPI_ud_av_hndl_t avh; - static VAPI_wr_id_t wrid = 16198; - osm_log_t *p_log = &p_osmt->log; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - /* init the MAD */ - ib_mad_init_new((ib_mad_t *) p_sa_mad, - IB_MCLASS_SUBN_ADM, - (uint8_t) 2, - IB_MAD_METHOD_SET, cl_hton64(wrid), (ib_net16_t) 0, 0); - wrid++; - p_sa_mad->attr_id = IB_MAD_ATTR_INFORM_INFO; - - /* copy the reference inform info */ - memcpy(p_ii, p_inform_info, sizeof(ib_inform_info_t)); - - if (reg_flag) { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Subscribing InformInfo: Traps from lid:0x%X to 0x%X, trap num :0x%X\n", - p_ii->lid_range_begin, p_ii->lid_range_end, - p_ii->g_or_v.generic.trap_num); - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "UnSubscribing InformInfo: Traps from lid:0x%X to 0x%X\n", - p_ii->lid_range_begin, p_ii->lid_range_end); - } - - /* set the subscribe bit */ - if (reg_flag) { - p_ii->subscribe = 1; - } else { - p_ii->subscribe = 0; - /* - * we need to set the QPN on the mad if we unsubscribe: - * o13-2.1.1 - QPN Field need to be set when unsubscribing. - */ - ib_inform_info_set_qpn(p_ii, - cl_hton32(p_qp_ctx->qp_bind_hndl.qp_id. - qp_num)); - } - - osm_dump_inform_info(&p_osmt->log, p_ii, OSM_LOG_DEBUG); - - /* --------------------- PREP ------------------------- */ - if (osmt_mtl_mad_post_recv_bufs(&p_qp_ctx->qp_bind_hndl, p_qp_ctx->p_recv_buf, 1, /* but we need only one mad at a time */ - GRH_LEN + MAD_BLOCK_SIZE, wrid) != 1) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0120: " - "Error posting recv bufs\n"); - status = IB_ERROR; - goto Exit; - } - OSM_LOG(p_log, OSM_LOG_DEBUG, "Posted recv bufs\n"); - - vapi_ret = - osmt_mtl_create_av(&p_qp_ctx->qp_bind_hndl, - p_osmt->local_port.sm_lid, &avh); - if (vapi_ret != VAPI_OK) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0121: " - "Error Preparing AVH (%s)\n", - VAPI_strerror_sym(vapi_ret)); - status = IB_ERROR; - goto Exit; - } - OSM_LOG(p_log, OSM_LOG_DEBUG, "Prepared AVH\n"); - - if (osm_log_is_active(p_log, OSM_LOG_DEBUG)) { - osm_dump_sa_mad(p_log, (ib_sa_mad_t *) (p_qp_ctx->p_send_buf), - OSM_LOG_DEBUG); -#if 0 - for (i = 56; i < 253; i++) { - if (i % 8 == 0) { - printf("\n %d : ", i); - } - printf("0x%02X ", p_qp_ctx->p_send_buf[i]); - } -#endif - printf("\n"); - } - - /* --------------------- SEND ------------------------- */ - vapi_ret = osmt_mtl_mad_send(&p_qp_ctx->qp_bind_hndl, wrid, p_qp_ctx->p_send_buf, 1, /* SA is QP1 */ - 0, /* SL is 0 */ - OSMT_MTL_REVERSE_QP1_WELL_KNOWN_Q_KEY, - avh); - if (vapi_ret != VAPI_OK) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0122: " - "Error sending mad (%s)\n", - VAPI_strerror_sym(vapi_ret)); - status = IB_ERROR; - goto Exit; - } - - vapi_ret = osmt_mtl_mad_poll4cqe(p_qp_ctx->qp_bind_hndl.hca_hndl, - p_qp_ctx->qp_bind_hndl.sq_cq_hndl, - &wc_desc, 20, 10000, NULL); - if (vapi_ret != VAPI_OK) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0123: " - "Error getting send completion (%s)\n", - VAPI_strerror_sym(vapi_ret)); - status = IB_ERROR; - goto Exit; - } - - if (wc_desc.status != VAPI_SUCCESS) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0124: " - "Error on send completion (%s) (%d)\n", - VAPI_strerror_sym(wc_desc.status), wc_desc.status); - status = IB_ERROR; - goto Exit; - } - OSM_LOG(p_log, OSM_LOG_DEBUG, "Sent MAD\n"); - - /* --------------------- RECV ------------------------- */ - vapi_ret = osmt_mtl_mad_poll4cqe(p_qp_ctx->qp_bind_hndl.hca_hndl, - p_qp_ctx->qp_bind_hndl.rq_cq_hndl, - &wc_desc, 20, 10000, &avh); - if (vapi_ret != VAPI_SUCCESS) { - if (vapi_ret == VAPI_CQ_EMPTY) { - status = IB_TIMEOUT; - } else { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0125: " - "Error receiving mad (%s)\n", - VAPI_strerror_sym(vapi_ret)); - status = IB_ERROR; - } - goto Exit; - } - - /* check to see if successful - by examination of the subscribe bit */ - p_sa_mad = (ib_sa_mad_t *) (p_qp_ctx->p_recv_buf + GRH_LEN); - - if (p_sa_mad->status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "Remote error = %s\n", - ib_get_mad_status_str((ib_mad_t *) p_sa_mad)); - status = IB_REMOTE_ERROR; - goto Exit; - } - - if (p_sa_mad->method != IB_MAD_METHOD_GET_RESP) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Expected IB_MAD_METHOD_GET_RESP but got:(%X)\n", - p_sa_mad->method); - status = IB_REMOTE_ERROR; - goto Exit; - } - - if (p_sa_mad->attr_id != IB_MAD_ATTR_INFORM_INFO) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Expected IB_MAD_ATTR_INFORM_INFO but got:(%X)\n", - cl_ntoh16(p_sa_mad->attr_id)); - status = IB_REMOTE_ERROR; - goto Exit; - } - - p_ii = ib_sa_mad_get_payload_ptr(p_sa_mad); - if (!p_ii->subscribe) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0126: " - "Subscribe/Unsubscribe Failed\n"); - status = IB_REMOTE_ERROR; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -/* - * Send a trap (Subn LID Route) Trap(Notice) through the regular - * connection QP connection (targeted at QP0) - * - * Wait for the trap repress - */ -ib_api_status_t -osmt_send_trap_wait_for_forward(IN osmtest_t * const p_osmt, - IN osmt_qp_ctx_t * p_qp_ctx) -{ - ib_smp_t *p_smp = (ib_smp_t *) (p_qp_ctx->p_send_buf); - ib_mad_notice_attr_t *p_ntc = ib_smp_get_payload_ptr(p_smp); - ib_sa_mad_t *p_sa_mad; - IB_MGT_ret_t mgt_res; - VAPI_ret_t vapi_ret; - VAPI_wc_desc_t wc_desc; - VAPI_ud_av_hndl_t avh; - IB_ud_av_t av; - static VAPI_wr_id_t wrid = 2222; - osm_log_t *p_log = &p_osmt->log; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_log); - - OSM_LOG(p_log, OSM_LOG_INFO, - "Sending Traps to QP0 of SA LID:0x%X\n", - p_osmt->local_port.sm_lid); - - /* init the MAD */ - memset(p_smp, 0, sizeof(ib_smp_t)); - ib_mad_init_new((ib_mad_t *) p_smp, - IB_MCLASS_SUBN_LID, - (uint8_t) 2, - IB_MAD_METHOD_TRAP, cl_hton64(wrid), (ib_net16_t) 0, 0); - - wrid++; - p_smp->attr_id = IB_MAD_ATTR_NOTICE; - - /* prepare the notice */ - p_ntc->generic_type = 0x82; /* generic, type = 2 */ - ib_notice_set_prod_type_ho(p_ntc, 1); - p_ntc->g_or_v.generic.trap_num = cl_hton16(0x26); - p_ntc->issuer_lid = cl_hton16(2); - - /* --------------------- PREP ------------------------- */ - if (osmt_mtl_mad_post_recv_bufs(&p_qp_ctx->qp_bind_hndl, p_qp_ctx->p_recv_buf, 1, /* we need to receive both trap repress and report */ - GRH_LEN + MAD_BLOCK_SIZE, wrid) != 1) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0127: " - "Error posting recv bufs\n"); - status = IB_ERROR; - goto Exit; - } - OSM_LOG(p_log, OSM_LOG_DEBUG, "Posted recv bufs\n"); - - av.dlid = p_osmt->local_port.sm_lid; - av.grh_flag = FALSE; - - /* EZ: returned in HACK: use constants */ - av.static_rate = 0; /* p_mad_addr->static_rate; */ - av.src_path_bits = 1; /* p_mad_addr->path_bits; */ - av.sl = 0; /* p_mad_addr->addr_type.gsi.service_level; */ - - OSM_LOG(p_log, OSM_LOG_DEBUG, - "av.dlid 0x%X, av.static_rate %d, av.path_bits %d\n", - cl_ntoh16(av.dlid), av.static_rate, av.src_path_bits); - - /* send it */ - mgt_res = IB_MGT_send_mad(p_qp_ctx->ib_mgt_qp0_handle, p_smp, /* actual payload */ - &av, /* address vector */ - wrid, /* casting the mad wrapper pointer for err cb */ - p_osmt->opt.transaction_timeout); - if (mgt_res != IB_MGT_OK) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0128: " - "Error sending mad (%d)\n", mgt_res); - status = IB_ERROR; - goto Exit; - } - - vapi_ret = - osmt_mtl_create_av(&p_qp_ctx->qp_bind_hndl, - p_osmt->local_port.sm_lid, &avh); - if (vapi_ret != VAPI_OK) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0129: " - "Error Preparing AVH (%s)\n", - VAPI_strerror_sym(vapi_ret)); - status = IB_ERROR; - goto Exit; - } - OSM_LOG(p_log, OSM_LOG_DEBUG, "Prepared AVH\n"); - - OSM_LOG(p_log, OSM_LOG_DEBUG, "Trap MAD Sent\n"); - - /* --------------------- RECV ------------------------- */ - vapi_ret = osmt_mtl_mad_poll4cqe(p_qp_ctx->qp_bind_hndl.hca_hndl, - p_qp_ctx->qp_bind_hndl.rq_cq_hndl, - &wc_desc, 200, 10000, &avh); - if (vapi_ret != VAPI_SUCCESS) { - if (vapi_ret == VAPI_CQ_EMPTY) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0130: " - "Timeout receiving mad (%s)\n", - VAPI_strerror_sym(vapi_ret)); - status = IB_TIMEOUT; - } else { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0131: " - "Error receiving mad (%s)\n", - VAPI_strerror_sym(vapi_ret)); - status = IB_ERROR; - } - goto Exit; - } - - /* check to see if successful - by examination of the subscribe bit */ - p_sa_mad = (ib_sa_mad_t *) (p_qp_ctx->p_recv_buf + GRH_LEN); - - if (p_sa_mad->method == IB_MAD_METHOD_REPORT) { - if (p_sa_mad->attr_id == IB_MAD_ATTR_NOTICE) { - OSM_LOG(p_log, OSM_LOG_INFO, "Received the Report!\n"); - status = IB_SUCCESS; - } else { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 1020" - "Did not receive a Report(Notice) but attr:%d\n", - cl_ntoh16(p_sa_mad->attr_id)); - status = IB_ERROR; - } - } else { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 1020" - "Received an Unexpected Method:%d\n", p_smp->method); - status = IB_ERROR; - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -/* - * Wait for a trap on QPn - * - */ -ib_api_status_t -osmt_trap_wait(IN osmtest_t * const p_osmt, IN osmt_qp_ctx_t * p_qp_ctx) -{ - ib_smp_t *p_smp = (ib_smp_t *) (p_qp_ctx->p_send_buf); - ib_sa_mad_t *p_sa_mad; - VAPI_ret_t vapi_ret; - VAPI_wc_desc_t wc_desc; - osm_log_t *p_log = &p_osmt->log; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(p_log); - - OSM_LOG(p_log, OSM_LOG_INFO, - "Waiting for Traps under QP:0x%X of SA LID:0x%X\n", - cl_ntoh16(p_osmt->local_port.sm_lid)); - - /* --------------------- RECV ------------------------- */ - vapi_ret = osmt_mtl_mad_poll4cqe(p_qp_ctx->qp_bind_hndl.hca_hndl, - p_qp_ctx->qp_bind_hndl.rq_cq_hndl, - &wc_desc, - // 200, - p_osmt->opt.wait_time * 100, - 10000, NULL); - if (vapi_ret != VAPI_SUCCESS) { - if (vapi_ret == VAPI_CQ_EMPTY) { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0130: " - "Timeout receiving mad (%s)\n", - VAPI_strerror_sym(vapi_ret)); - status = IB_TIMEOUT; - } else { - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0131: " - "Error receiving mad (%s)\n", - VAPI_strerror_sym(vapi_ret)); - status = IB_ERROR; - } - goto Exit; - } - - /* check to see if successful - by examination of the subscribe bit */ - p_sa_mad = (ib_sa_mad_t *) (p_qp_ctx->p_recv_buf + GRH_LEN); - - if (p_sa_mad->method == IB_MAD_METHOD_REPORT) { - if (p_sa_mad->attr_id == IB_MAD_ATTR_NOTICE) { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Received the Report!\n"); - status = IB_SUCCESS; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 1020" - "Did not receive a Report(Notice) but attr:%d\n", - cl_ntoh16(p_sa_mad->attr_id)); - status = IB_ERROR; - } - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 1020" - "Received an Unexpected Method:%d\n", p_smp->method); - status = IB_ERROR; - } - -Exit: - OSM_LOG_EXIT(p_log); - return status; -} - -/* - * Initialize an inform info attribute: - * Catch all traps in the lid range of the p_osmt - * - */ -ib_api_status_t -osmt_init_inform_info(IN osmtest_t * const p_osmt, OUT ib_inform_info_t * p_ii) -{ - - memset(p_ii, 0, sizeof(ib_inform_info_t)); - /* p_ii->lid_range_begin = cl_hton16(1); */ - p_ii->lid_range_begin = 0xFFFF; - p_ii->lid_range_end = cl_hton16(p_osmt->max_lid); - p_ii->is_generic = 1; /* have to choose */ - p_ii->trap_type = 0xFFFF; /* ALL */ - p_ii->g_or_v.generic.trap_num = 0xFFFF; /* ALL */ - p_ii->g_or_v.generic.node_type_lsb = 0xFFFF; /* ALL */ - p_ii->g_or_v.generic.node_type_msb = 0xFF; /* ALL */ - return IB_SUCCESS; -} - -ib_api_status_t -osmt_init_inform_info_by_trap(IN osmtest_t * const p_osmt, - IN ib_net16_t trap_num, - OUT ib_inform_info_t * p_ii) -{ - - memset(p_ii, 0, sizeof(ib_inform_info_t)); - /* p_ii->lid_range_begin = cl_hton16(1); */ - p_ii->lid_range_begin = 0xFFFF; - p_ii->lid_range_end = cl_hton16(p_osmt->max_lid); - p_ii->is_generic = 1; /* have to choose */ - p_ii->trap_type = 0xFFFF; /* ALL */ - p_ii->g_or_v.generic.trap_num = trap_num; /* ALL */ - p_ii->g_or_v.generic.node_type_lsb = 0xFFFF; /* ALL */ - p_ii->g_or_v.generic.node_type_msb = 0xFF; /* ALL */ - return IB_SUCCESS; -} - -/* - * Run a complete inform info test flow: - * - try to unregister inform info (should fail) - * - register an inform info - * - try to unregister inform info (should succeed) - * - register an inform info - * - send a trap - sleep - * - check that a Report(Notice) arrived that match the sent one - * - */ -ib_api_status_t osmt_run_inform_info_flow(IN osmtest_t * const p_osmt) -{ - ib_inform_info_t inform_info; - ib_api_status_t status; - osmt_qp_ctx_t qp_ctx; - - OSM_LOG_ENTER(&p_osmt->log); - - /* bind the QP */ - status = osmt_bind_inform_qp(p_osmt, &qp_ctx); - if (status != IB_SUCCESS) { - goto Exit; - } - - /* init the inform info */ - osmt_init_inform_info(p_osmt, &inform_info); - - /* first try to unsubscribe */ - status = osmt_reg_unreg_inform_info(p_osmt, &qp_ctx, &inform_info, 0); - /* WAS IB_REMOTE_ERROR */ - if (status != IB_REMOTE_ERROR) { - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Error during UnSubscribe: (%s)\n", - ib_get_err_str(status)); - goto Exit; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Expected Failure to UnSubscribe non existing InformInfo\n"); - status = IB_ERROR; - goto Exit; - } - } - - /* send the inform info registration */ - status = osmt_reg_unreg_inform_info(p_osmt, &qp_ctx, &inform_info, 1); - if (status != IB_SUCCESS) { - goto Exit; - } - - /* send a trap through QP0 and wait on QPN */ - status = osmt_send_trap_wait_for_forward(p_osmt, &qp_ctx); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Error during Send Trap and Wait For Report: (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* try to unsubscribe for cleanup */ - status = osmt_reg_unreg_inform_info(p_osmt, &qp_ctx, &inform_info, 0); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Error during UnSubscribe: (%s)\n", - ib_get_err_str(status)); - goto Exit; - } else { - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Remote Error during UnSubscribe\n"); - status = IB_ERROR; - goto Exit; - } - } - -Exit: - osmt_unbind_inform_qp(p_osmt, &qp_ctx); - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -/* - * Run a complete inform info test flow: - * - try to unregister inform info (should fail) - * - register an inform info - * - try to unregister inform info (should succeed) - * - register an inform info - * - send a trap - sleep - * - check that a Report(Notice) arrived that match the sent one - * - */ -ib_api_status_t osmt_run_trap64_65_flow(IN osmtest_t * const p_osmt) -{ - ib_inform_info_t inform_info; - ib_api_status_t status; - osmt_qp_ctx_t qp_ctx; - - OSM_LOG_ENTER(&p_osmt->log); - - /* bind the QP */ - status = osmt_bind_inform_qp(p_osmt, &qp_ctx); - if (status != IB_SUCCESS) { - goto Exit; - } - - /* init the inform info */ - osmt_init_inform_info_by_trap(p_osmt, cl_hton16(64), &inform_info); - - /* send the inform info registration */ - status = osmt_reg_unreg_inform_info(p_osmt, &qp_ctx, &inform_info, 1); - if (status != IB_SUCCESS) { - goto Exit; - } - - /*--------------------- PREP -------------------------*/ - if (osmt_mtl_mad_post_recv_bufs(&qp_ctx.qp_bind_hndl, qp_ctx.p_recv_buf, 1, /* we need to receive the report */ - GRH_LEN + MAD_BLOCK_SIZE, 1) != 1) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0127: " - "Error posting recv bufs for trap 64\n"); - status = IB_ERROR; - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "Posted recv bufs for trap 64\n"); - - /* init the inform info */ - osmt_init_inform_info_by_trap(p_osmt, cl_hton16(65), &inform_info); - - /* send the inform info registration */ - status = osmt_reg_unreg_inform_info(p_osmt, &qp_ctx, &inform_info, 1); - if (status != IB_SUCCESS) { - goto Exit; - } - - /*--------------------- PREP -------------------------*/ - if (osmt_mtl_mad_post_recv_bufs(&qp_ctx.qp_bind_hndl, qp_ctx.p_recv_buf, 1, /* we need to receive the report */ - GRH_LEN + MAD_BLOCK_SIZE, 1) != 1) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0127: " - "Error posting recv bufs for trap 65\n"); - status = IB_ERROR; - goto Exit; - } - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "Posted recv bufs for trap 65\n"); - - /* Sleep for x seconds in order to allow external script trap generation */ -#if 0 - sleep(p_osmt->opt.wait_time); -#endif - - /* wait for a trap on QPN */ - status = osmt_trap_wait(p_osmt, &qp_ctx); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Error during Send Trap and Wait For Report: (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* try to unsubscribe for cleanup */ - status = osmt_reg_unreg_inform_info(p_osmt, &qp_ctx, &inform_info, 0); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Error during UnSubscribe: (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - osmt_unbind_inform_qp(p_osmt, &qp_ctx); - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -#endif /* OSM_VENDOR_INTF_MTL */ diff --git a/branches/opensm_3/user/osmtest/osmt_mtl_regular_qp.c b/branches/opensm_3/user/osmtest/osmt_mtl_regular_qp.c deleted file mode 100644 index f603ade2..00000000 --- a/branches/opensm_3/user/osmtest/osmt_mtl_regular_qp.c +++ /dev/null @@ -1,470 +0,0 @@ -/* - * Copyright (c) 2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#ifdef OSM_VENDOR_INTF_MTL - -/* - Mellanox Confidential and Proprietary - - * - * Copyright (C) Jul. 2001, Mellanox Technologies Ltd. ALL RIGHTS RESERVED. - * - * Except as specifically permitted herein, no portion of the information, - * including but not limited to object code and source code, may be reproduced, - * modified, distributed, republished or otherwise exploited in any form or by - * any means for any purpose without the prior written permission of Mellanox - * Technologies Ltd. Use of software subject to the terms and conditions - * detailed in the file "LICENSE.txt". - * - * End of legal section ...................................................... - * - * osmt_mtl_regular_qp.c - - * Provide Simple Interface for Sending and Receiving MADS through a regular QP - * - * Creation date: - * - * Version: $Id$ - * - * Authors: - * Eitan Zahavi - * - * Changes: - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -/* - * Initialize the QP etc. - * Given in res: port_num, max_outs_sq, max_outs_rq - */ -VAPI_ret_t osmt_mtl_get_qp_resources(IN OUT osmt_mtl_mad_res_t * res) -{ - VAPI_ret_t ret; - VAPI_hca_port_t hca_port_info; - VAPI_qp_init_attr_t qp_init_attr; - VAPI_qp_prop_t qp_prop; - VAPI_cqe_num_t act_num; - - /* Get HCA LID */ - ret = - VAPI_query_hca_port_prop(res->hca_hndl, res->port_num, - &hca_port_info); - VAPI_CHECK_RET; - res->slid = hca_port_info.lid; - - /* Get a PD */ - ret = VAPI_alloc_pd(res->hca_hndl, &(res->pd_hndl)); - VAPI_CHECK_RET; - - /* Create CQ for RQ and SQ *//* TBD - Check we have enough act nums */ - ret = - VAPI_create_cq(res->hca_hndl, res->max_outs_sq + 1, - &(res->sq_cq_hndl), &act_num); - VAPI_CHECK_RET; - ret = - VAPI_create_cq(res->hca_hndl, res->max_outs_rq + 1, - &(res->rq_cq_hndl), &act_num); - VAPI_CHECK_RET; - - /* register event handlers for polling(block mode) internal use */ - /* ret= EVAPI_set_comp_eventh(res->hca_hndl,res->rq_cq_hndl, */ - /* EVAPI_POLL_CQ_UNBLOCK_HANDLER,NULL,&(res->rq_cq_eventh)); */ - /* VAPI_CHECK_RET; */ - /* ret= EVAPI_set_comp_eventh(res->hca_hndl,res->sq_cq_hndl, */ - /* EVAPI_POLL_CQ_UNBLOCK_HANDLER,NULL,&(res->sq_cq_eventh)); */ - /* VAPI_CHECK_RET; */ - - /* Create QP */ - qp_init_attr.cap.max_oust_wr_sq = res->max_outs_sq + 1; - qp_init_attr.cap.max_oust_wr_rq = res->max_outs_rq + 1; - qp_init_attr.cap.max_sg_size_sq = 4; - qp_init_attr.cap.max_sg_size_rq = 4; - - qp_init_attr.pd_hndl = res->pd_hndl; - qp_init_attr.rdd_hndl = 0; - qp_init_attr.rq_cq_hndl = res->rq_cq_hndl; - qp_init_attr.rq_sig_type = VAPI_SIGNAL_ALL_WR; /* That's default for IB */ - qp_init_attr.sq_cq_hndl = res->sq_cq_hndl; - qp_init_attr.sq_sig_type = VAPI_SIGNAL_REQ_WR; - qp_init_attr.ts_type = VAPI_TS_UD; - - ret = - VAPI_create_qp(res->hca_hndl, &qp_init_attr, &(res->qp_hndl), - &qp_prop); - VAPI_CHECK_RET; - res->qp_id.qp_num = qp_prop.qp_num; - - return (VAPI_OK); -} - -VAPI_ret_t osmt_mtl_qp_init(osmt_mtl_mad_res_t * res) -{ - VAPI_ret_t ret; - - VAPI_qp_attr_t qp_attr; - VAPI_qp_attr_mask_t qp_attr_mask; - VAPI_qp_cap_t qp_cap; - - /* - * Change QP to INIT - * - */ - QP_ATTR_MASK_CLR_ALL(qp_attr_mask); - qp_attr.qp_state = VAPI_INIT; - QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_QP_STATE); - qp_attr.pkey_ix = 0; - QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_PKEY_IX); - qp_attr.port = res->port_num; - QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_PORT); - qp_attr.qkey = res->qkey; - QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_QKEY); - - /* If I do not set this mask, I get an error from HH. QPM should catch it */ - ret = - VAPI_modify_qp(res->hca_hndl, res->qp_hndl, &qp_attr, &qp_attr_mask, - &qp_cap); - VAPI_CHECK_RET; - - return (ret); - -} - -VAPI_ret_t osmt_mtl_qp_2_rtr_rts(osmt_mtl_mad_res_t * res) -{ - VAPI_ret_t ret; - - VAPI_qp_attr_t qp_attr; - VAPI_qp_attr_mask_t qp_attr_mask; - VAPI_qp_cap_t qp_cap; - - /* - * Change QP to RTR - * - */ - QP_ATTR_MASK_CLR_ALL(qp_attr_mask); - qp_attr.qp_state = VAPI_RTR; - QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_QP_STATE); - /* qp_attr.rq_psn = 0; */ - /* QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_RQ_PSN); */ - - ret = - VAPI_modify_qp(res->hca_hndl, res->qp_hndl, &qp_attr, &qp_attr_mask, - &qp_cap); - VAPI_CHECK_RET; - - /* - * Change QP to RTS - * - */ - QP_ATTR_MASK_CLR_ALL(qp_attr_mask); - qp_attr.qp_state = VAPI_RTS; - QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_QP_STATE); - qp_attr.sq_psn = 0; - QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_SQ_PSN); - - ret = - VAPI_modify_qp(res->hca_hndl, res->qp_hndl, &qp_attr, &qp_attr_mask, - &qp_cap); - VAPI_CHECK_RET; - - return (ret); -} - -VAPI_ret_t osmt_mtl_mad_create_mr(osmt_mtl_mad_res_t * res) -{ - - VAPI_ret_t ret; - - VAPI_mrw_t mr_in, mr_out; - - res->buf_size = - (MAD_SIZE + GRH_LEN) * (res->max_outs_sq + res->max_outs_rq + 1); - - /* Register single memory address region for all buffers */ - res->buf_ptr = VMALLOC(res->buf_size); - - if (res->buf_ptr == ((VAPI_virt_addr_t) NULL)) { - ret = VAPI_EAGAIN; - VAPI_CHECK_RET; - } - - /* Enable local and remote access to memory region */ - mr_in.acl = VAPI_EN_LOCAL_WRITE | VAPI_EN_REMOTE_WRITE; - mr_in.l_key = 0; - mr_in.pd_hndl = res->pd_hndl; - mr_in.r_key = 0; - mr_in.size = res->buf_size; - ASSERT_VOIDP2UINTN(res->buf_ptr); - mr_in.start = (VAPI_virt_addr_t) (uintn_t) (res->buf_ptr); - mr_in.type = VAPI_MR; - - ret = VAPI_register_mr(res->hca_hndl, &mr_in, &(res->mr_hndl), &mr_out); - VAPI_CHECK_RET; - - res->l_key = mr_out.l_key; - - return (ret); -} - -VAPI_ret_t osmt_mtl_init_opened_hca(osmt_mtl_mad_res_t * res) -{ - VAPI_ret_t ret; - - res->pd_hndl = VAPI_INVAL_HNDL; - res->rq_cq_hndl = VAPI_INVAL_HNDL; - res->sq_cq_hndl = VAPI_INVAL_HNDL; - res->sq_cq_eventh = VAPI_INVAL_HNDL; - res->rq_cq_eventh = VAPI_INVAL_HNDL; - res->qp_hndl = VAPI_INVAL_HNDL; - res->mr_hndl = VAPI_INVAL_HNDL; - - /* - * Create QP - * - */ - ret = osmt_mtl_get_qp_resources(res); - if (ret != VAPI_OK) { - return ret; - } - - /* - * Move to init - * - */ - ret = osmt_mtl_qp_init(res); - if (ret != VAPI_OK) { - return ret; - } - - /* - * Initialize memory regions - * - */ - ret = osmt_mtl_mad_create_mr(res); - if (ret != VAPI_OK) { - return ret; - } - - /* only now move to RTR and RTS */ - ret = osmt_mtl_qp_2_rtr_rts(res); - if (ret != VAPI_OK) { - return ret; - } - - return VAPI_OK; -} - -VAPI_ret_t osmt_mtl_mad_cleanup(osmt_mtl_mad_res_t * res) -{ - if (res->qp_hndl != VAPI_INVAL_HNDL) { - VAPI_destroy_qp(res->hca_hndl, res->qp_hndl); - } - if (res->sq_cq_eventh != VAPI_INVAL_HNDL) { - EVAPI_clear_comp_eventh(res->hca_hndl, res->sq_cq_eventh); - } - if (res->rq_cq_eventh != VAPI_INVAL_HNDL) { - EVAPI_clear_comp_eventh(res->hca_hndl, res->rq_cq_eventh); - } - if (res->rq_cq_hndl != VAPI_INVAL_HNDL) { - VAPI_destroy_cq(res->hca_hndl, res->rq_cq_hndl); - } - if (res->sq_cq_hndl != VAPI_INVAL_HNDL) { - VAPI_destroy_cq(res->hca_hndl, res->sq_cq_hndl); - } - if (res->mr_hndl != VAPI_INVAL_HNDL) { - VAPI_deregister_mr(res->hca_hndl, res->mr_hndl); - } - if (res->pd_hndl != VAPI_INVAL_HNDL) { - VAPI_dealloc_pd(res->hca_hndl, res->pd_hndl); - } -#if 0 - /* open/close of HCA should be done system wide - not per application */ - if (res->hca_hndl != VAPI_INVAL_HNDL) { - VAPI_close_hca(res->hca_hndl); /* TBD: HCA_open/close should be done on a system wide basis */ - } -#endif - return VAPI_OK; -} - -VAPI_ret_t osmt_mtl_create_av(osmt_mtl_mad_res_t * res, int16_t dlid, - VAPI_ud_av_hndl_t * avh_p) -{ - VAPI_ud_av_t av; - VAPI_ret_t ret; - - av.dlid = dlid; - av.port = res->port_num; - av.sl = 0; /* dest->sl; */ - av.src_path_bits = 0; /* dest->ee_dlid.dst_path_bits; */ - av.static_rate = 0; - /* GRH ? */ - av.grh_flag = 0; - - ret = VAPI_create_addr_hndl(res->hca_hndl, res->pd_hndl, &av, avh_p); - if (ret != VAPI_OK) { - MTL_ERROR1("%s: failed VAPI_create_addr_hndl (%s)\n", __func__, - VAPI_strerror_sym(ret)); - return ret; - } - return VAPI_OK; -} - -VAPI_ret_t osmt_mtl_mad_send(osmt_mtl_mad_res_t * res, VAPI_wr_id_t id, - void *mad, VAPI_qp_num_t dest_qp, IB_sl_t sl, - u_int32_t dest_qkey, VAPI_ud_av_hndl_t avh) -{ - VAPI_sr_desc_t sr; - VAPI_sg_lst_entry_t sg_entry; - VAPI_ret_t ret; - - /* building SEND request */ - sr.opcode = VAPI_SEND; - sr.remote_ah = avh; - sr.remote_qp = dest_qp; - sr.remote_qkey = dest_qkey; - - sr.id = id; - sr.set_se = FALSE; - sr.fence = FALSE; - sr.comp_type = VAPI_SIGNALED; - sr.sg_lst_len = 1; - sr.sg_lst_p = &sg_entry; - ASSERT_VOIDP2UINTN(mad); - sg_entry.addr = (VAPI_virt_addr_t) (uintn_t) (mad); - sg_entry.len = MAD_SIZE; - sg_entry.lkey = res->l_key; - - ret = VAPI_post_sr(res->hca_hndl, res->qp_hndl, &sr); - if (ret != VAPI_OK) { - MTL_ERROR1(__FUNCTION__ ": failed VAPI_post_sr (%s)\n", - VAPI_strerror_sym(ret)); - return ret; - } - - return VAPI_OK; -} - -int osmt_mtl_mad_post_recv_bufs(osmt_mtl_mad_res_t * res, void *buf_array, - u_int32_t num_o_bufs, u_int32_t size, - VAPI_wr_id_t start_id) -{ - uint32_t i; - void *cur_buf; - VAPI_rr_desc_t rr; - VAPI_sg_lst_entry_t sg_entry; - VAPI_ret_t ret; - - rr.opcode = VAPI_RECEIVE; - rr.comp_type = VAPI_SIGNALED; /* All with CQE (IB compliant) */ - rr.sg_lst_len = 1; /* single buffers */ - rr.sg_lst_p = &sg_entry; - sg_entry.lkey = res->l_key; - cur_buf = buf_array; - for (i = 0; i < num_o_bufs; i++) { - rr.id = start_id + i; /* WQE id used is the index to buffers ptr array */ - ASSERT_VOIDP2UINTN(cur_buf); - sg_entry.addr = (VAPI_virt_addr_t) (uintn_t) cur_buf; - sg_entry.len = size; - memset(cur_buf, 0x00, size); /* fill with 0 */ - ret = VAPI_post_rr(res->hca_hndl, res->qp_hndl, &rr); - if (ret != VAPI_OK) { - MTL_ERROR1(__FUNCTION__ - ": failed posting RQ WQE (%s)\n", - VAPI_strerror_sym(ret)); - return i; - } - MTL_DEBUG4(__FUNCTION__ ": posted buf at %p\n", cur_buf); - cur_buf += size; - } - - return i; /* num of buffers posted */ -} - -VAPI_ret_t osmt_mtl_mad_poll4cqe(VAPI_hca_hndl_t hca, VAPI_cq_hndl_t cq, - VAPI_wc_desc_t * wc_desc_p, - u_int32_t max_poll, u_int32_t poll_sleep, - VAPI_ud_av_hndl_t * avh_p) -{ - VAPI_ret_t ret = VAPI_CQ_EMPTY; - u_int32_t poll_cnt = 0; - - /* wait for something to arrive */ - while ((ret == VAPI_CQ_EMPTY) && (poll_cnt < max_poll)) { - ret = VAPI_poll_cq(hca, cq, wc_desc_p); - /* don't sleep if we already succeeded) */ - if (ret != VAPI_CQ_EMPTY) { - break; - } - usleep(poll_sleep); - poll_cnt++; - } - - /* if passed an AVH to destory - do it */ - if (avh_p != NULL) { - VAPI_destroy_addr_hndl(hca, *avh_p); - } - - if ((poll_cnt == max_poll) && (ret == VAPI_CQ_EMPTY)) { - MTL_DEBUG1(__FUNCTION__ - ": Failed to get completion on wq after %d polls.\n", - max_poll); - return VAPI_CQ_EMPTY; - } - - if (ret != VAPI_OK) { - MTL_DEBUG1(__FUNCTION__ - ": VAPI_poll_cq failed with ret=%s on sq_cq\n", - mtl_strerror_sym(ret)); - return ret; - } - - if (wc_desc_p->status != VAPI_SUCCESS) { - MTL_DEBUG1(__FUNCTION__ ": completion error (%d) detected\n", - wc_desc_p->status); - } - - return VAPI_OK; -} - -#endif /* OSM_VENDOR_INTF_MTL */ diff --git a/branches/opensm_3/user/osmtest/osmt_multicast.c b/branches/opensm_3/user/osmtest/osmt_multicast.c deleted file mode 100644 index ed8577c2..00000000 --- a/branches/opensm_3/user/osmtest/osmt_multicast.c +++ /dev/null @@ -1,2575 +0,0 @@ -/* - * Copyright (c) 2006-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005,2008 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of Multicast Member testing flow.. - * - */ - -#ifndef __WIN__ -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include "osmtest.h" - -static void __osmt_print_all_multicast_records(IN osmtest_t * const p_osmt) -{ - uint32_t i; - ib_api_status_t status; - osmv_query_req_t req; - osmv_user_query_t user; - osmtest_req_context_t context; - ib_member_rec_t *mcast_record; - - memset(&context, 0, sizeof(context)); - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - - user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; - user.attr_offset = ib_get_attr_offset(sizeof(*mcast_record)); - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = 1; - req.flags = OSM_SA_FLAGS_SYNC; - context.p_osmt = p_osmt; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - - /* UnTrusted (SMKey of 0) - get the multicast groups */ - status = osmv_query_sa(p_osmt->h_bind, &req); - - if (status != IB_SUCCESS || context.result.status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B5: " - "Failed getting the multicast groups records - %s/%s\n", - ib_get_err_str(status), - ib_get_err_str(context.result.status)); - return; - } - - osm_log(&p_osmt->log, OSM_LOG_INFO, - "\n |------------------------------------------|" - "\n | Remaining Multicast Groups |" - "\n |------------------------------------------|\n"); - - for (i = 0; i < context.result.result_cnt; i++) { - mcast_record = - osmv_get_query_mc_rec(context.result.p_result_madw, i); - osm_dump_mc_record(&p_osmt->log, mcast_record, OSM_LOG_INFO); - } - - /* Trusted - now get the multicast group members */ - req.sm_key = OSM_DEFAULT_SM_KEY; - status = osmv_query_sa(p_osmt->h_bind, &req); - - if (status != IB_SUCCESS || context.result.status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B6: " - "Failed getting the multicast group members records - %s/%s\n", - ib_get_err_str(status), - ib_get_err_str(context.result.status)); - return; - } - - osm_log(&p_osmt->log, OSM_LOG_INFO, - "\n |--------------------------------------------------|" - "\n | Remaining Multicast Group Members |" - "\n |--------------------------------------------------|\n"); - - for (i = 0; i < context.result.result_cnt; i++) { - mcast_record = - osmv_get_query_mc_rec(context.result.p_result_madw, i); - osm_dump_mc_record(&p_osmt->log, mcast_record, OSM_LOG_INFO); - } - -} - -static cl_status_t -__match_mgids(IN const void *const p_object, IN void *context) -{ - ib_gid_t *p_mgid_context = (ib_gid_t *) context; - ib_gid_t *p_mgid_list_item = (ib_gid_t *) p_object; - int32_t count; - - count = memcmp(p_mgid_context, p_mgid_list_item, sizeof(ib_gid_t)); - if (count == 0) - return CL_SUCCESS; - else - return CL_NOT_FOUND; -} - -ib_api_status_t osmt_query_mcast(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - osmtest_req_context_t context; - ib_member_rec_t *p_rec; - uint32_t i, num_recs = 0; - cl_list_t mgids_list; - cl_list_t *p_mgids_list; - cl_list_iterator_t p_mgids_res; - cl_status_t cl_status; - cl_map_item_t *p_item, *p_next_item; - osmtest_mgrp_t *p_mgrp; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Do a blocking query for all Multicast Records in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - - context.p_osmt = p_osmt; - user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; - user.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t)); - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - - status = osmv_query_sa(p_osmt->h_bind, &req); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0203: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0264: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s.\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - goto Exit; - } - - /* ok we have got something */ - /* First Delete the old MGID Table */ - p_next_item = cl_qmap_head(&p_osmt->exp_subn.mgrp_mlid_tbl); - while (p_next_item != cl_qmap_end(&p_osmt->exp_subn.mgrp_mlid_tbl)) { - p_item = p_next_item; - p_next_item = cl_qmap_next(p_item); - cl_qmap_remove_item(&p_osmt->exp_subn.mgrp_mlid_tbl, p_item); - free(p_item); - } - - cl_list_construct(&mgids_list); - cl_list_init(&mgids_list, num_recs); - p_mgids_list = &mgids_list; - num_recs = context.result.result_cnt; - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", - num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = osmv_get_query_result(context.result.p_result_madw, i); - p_mgids_res = - cl_list_find_from_head(p_mgids_list, __match_mgids, - &(p_rec->mgid)); - /* If returns iterator other than end of list, same mgid exists already */ - if (p_mgids_res != cl_list_end(p_mgids_list)) { - char gid_str[INET6_ADDRSTRLEN]; - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0265: " - "MCG MGIDs are the same - invalid MGID : %s\n", - inet_ntop(AF_INET6, p_rec->mgid.raw, gid_str, - sizeof gid_str)); - status = IB_ERROR; - goto Exit; - - } - osm_dump_mc_record(&p_osmt->log, p_rec, OSM_LOG_VERBOSE); - cl_status = cl_list_insert_head(p_mgids_list, &(p_rec->mgid)); - if (cl_status) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0205: " - "Could not add MGID to cl_list\n"); - status = IB_ERROR; - goto Exit; - } - p_mgrp = (osmtest_mgrp_t *) malloc(sizeof(*p_mgrp)); - if (!p_mgrp) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0204: " - "Could not allocate new MCG\n"); - status = IB_ERROR; - goto Exit; - } - memcpy(&p_mgrp->mcmember_rec, p_rec, - sizeof(p_mgrp->mcmember_rec)); - cl_qmap_insert(&p_osmt->exp_subn.mgrp_mlid_tbl, - cl_ntoh16(p_rec->mlid), &p_mgrp->map_item); - } - -Exit: - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/* given a multicast request send and wait for response. */ -ib_api_status_t -osmt_send_mcast_request(IN osmtest_t * const p_osmt, - IN uint8_t is_set, - IN ib_member_rec_t * p_mc_req, - IN uint64_t comp_mask, OUT ib_sa_mad_t * p_res) -{ - osmtest_req_context_t context; - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Do a blocking query for this record in the subnet. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&context, 0, sizeof(context)); - memset(p_res, 0, sizeof(ib_sa_mad_t)); - - context.p_osmt = p_osmt; - - user.p_attr = p_mc_req; - user.comp_mask = comp_mask; - - if (is_set == 1) - req.query_type = OSMV_QUERY_UD_MULTICAST_SET; - else if (is_set == 0) - req.query_type = OSMV_QUERY_UD_MULTICAST_DELETE; - else if (is_set == 0xee) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Set USER DEFINED QUERY\n"); - req.query_type = OSMV_QUERY_USER_DEFINED; - user.method = IB_MAD_METHOD_GET; - user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; - user.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t)); - } else if (is_set == 0xff) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Set USER DEFINED QUERY\n"); - req.query_type = OSMV_QUERY_USER_DEFINED; - user.method = IB_MAD_METHOD_SET; - user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; - user.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t)); - } - - /* TODO : Check the validity of all user fields in order to use - OSMV_QUERY_USER_DEFINED - p_user_query = ( osmv_user_query_t * ) p_query_req->p_query_input; - if (p_user_query->method) sa_mad_data.method = p_user_query->method; - sa_mad_data.attr_offset = p_user_query->attr_offset; - sa_mad_data.attr_id = p_user_query->attr_id; - sa_mad_data.comp_mask = p_user_query->comp_mask; - sa_mad_data.p_attr = p_user_query->p_attr; - */ - - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - - status = osmv_query_sa(p_osmt->h_bind, &req); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0206: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - /* ok it worked */ - memcpy(p_res, osm_madw_get_mad_ptr(context.result.p_result_madw), - sizeof(ib_sa_mad_t)); - - status = context.result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0224: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -void osmt_init_mc_query_rec(IN osmtest_t * const p_osmt, - IN OUT ib_member_rec_t * p_mc_req) -{ - /* use default values so we can change only what we want later */ - memset(p_mc_req, 0, sizeof(ib_member_rec_t)); - - /* we leave the MGID to the user */ - memcpy(&p_mc_req->port_gid.unicast.interface_id, - &p_osmt->local_port.port_guid, - sizeof(p_osmt->local_port.port_guid)); - - /* use our own subnet prefix: */ - p_mc_req->port_gid.unicast.prefix = CL_HTON64(0xFE80000000000000ULL); - - /* ib_net32_t qkey; */ - /* ib_net16_t mlid; - we keep it zero for upper level to decide. */ - /* uint8_t mtu; - keep it zero means - anything you have please. */ - /* uint8_t tclass; can leave as zero for now (between subnets) */ - /* ib_net16_t pkey; leave as zero */ - p_mc_req->rate = IB_LINK_WIDTH_ACTIVE_4X; - /* uint8_t pkt_life; zero means greater than zero ... */ - /* ib_net32_t sl_flow_hop; keep it all zeros */ - /* we want to use a link local scope: 0x02 */ - p_mc_req->scope_state = ib_member_set_scope_state(0x02, 0); -} - -/*********************************************************************** - * UD Multicast testing flow: - * o15.0.1.3: - * - Request new MCG with not enough components in comp_mask : - * ERR_INSUFFICIENT_COMPONENTS - * o15.0.1.8: - * - Request a join with irrelevant RATE and get a ERR_INVALID_REQ - * o15.0.1.4: - * - Create an MGID by asking for a join with MGID = 0 - * providing P_Key, Q_Key, SL, FlowLabel, Tclass. - * o15.0.1.5: - * - Check the returned MGID is valid. (p 804) - * o15.0.1.6: - * - Create a new MCG with valid requested MGID. - * - Try to create a new MCG with invalid MGID : get back ERR_REQ_INVALID - * - Try again with MGID prefix = 0xA01B (maybe 0x1BA0 little or big ?) - * - Try to create again the already created group: ERR_REQ_INVALID - * o15.0.1.7 - implicitlly checked during the prev steps. - * o15.0.1.9 - * - Create MCG with Invalid JoinState.FullMember != 1 : get ERR_REQ_INVALID - * o15.0.1.10 - can't check on a single client . - * o15.0.1.11: - * - Try to join into a MGID that exists with JoinState=SendOnlyMember - - * see that it updates JoinState. What is the routing change? - * - We can not check simple join since we have only one tester (for now) - * o15.0.1.12: - * - The last join should have a special treatment in the SA (sender only) - * but what is it ? - * o15.0.1.13: - * - Try joining with wrong rate - ERR_REQ_INVALID - * o15.0.1.14: - * - Try partial delete - actually updating the join state. check it. - * - Register by InformInfo flow to receive trap 67 on MCG delete. - * - Try full delete (JoinState and should be 0) - * - Wait for trap 67. - * - Try joining (not full mem) again to see the group was deleted. - * (should fail - o15.0.1.13) - * o15.0.1.15: - * - Try deletion of the IPoIB MCG and get: ERR_REQ_INVALID - * o15.0.1.16: - * - Try GetTable with PortGUID wildcarded and get back some groups. - ***********************************************************************/ - -/* The following macro can be used only within the osmt_run_mcast_flow() function */ -#define IS_IPOIB_MGID(p_mgid) \ - ( !memcmp(&osm_ipoib_good_mgid, (p_mgid), sizeof(osm_ipoib_good_mgid)) || \ - !memcmp(&osm_ts_ipoib_good_mgid, (p_mgid), sizeof(osm_ts_ipoib_good_mgid)) ) - -ib_api_status_t osmt_run_mcast_flow(IN osmtest_t * const p_osmt) -{ - char gid_str[INET6_ADDRSTRLEN]; - char gid_str2[INET6_ADDRSTRLEN]; - ib_api_status_t status; - ib_member_rec_t mc_req_rec; - union { - ib_sa_mad_t sa_mad; - ib_member_rec_t mcmr; - } res; - ib_sa_mad_t *sa_mad; - ib_member_rec_t *p_mc_res; - uint64_t comp_mask = 0; - ib_net64_t remote_port_guid = 0x0; - cl_qmap_t *p_mgrp_mlid_tbl; - osmtest_mgrp_t *p_mgrp; - ib_gid_t special_mgid, tmp_mgid, proxy_mgid; - ib_net16_t invalid_mlid = 0x0; - ib_net16_t max_mlid = cl_hton16(0xFFFE), tmp_mlid; - int start_cnt = 0, cnt, middle_cnt = 0, end_cnt = 0; - int start_ipoib_cnt = 0, end_ipoib_cnt = 0; - int mcg_outside_test_cnt = 0, fail_to_delete_mcg = 0; - osmtest_req_context_t context; - ib_node_record_t *p_rec; - uint32_t num_recs = 0, i; - uint8_t mtu_phys = 0, rate_phys = 0; - cl_map_t test_created_mlids; /* List of all mlids created in this test */ - boolean_t got_error = FALSE; - - static ib_gid_t good_mgid = { - { - 0xFF, 0x12, 0xA0, 0x1C, - 0xFE, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x12, 0x34, 0x56, 0x78} - }; - static ib_gid_t osm_ipoib_mgid = { - { - 0xff, /* multicast field */ - 0x12, /* scope */ - 0x40, 0x1b, /* IPv4 signature */ - 0xff, 0xff, /* 16 bits of P_Key (to be filled in) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */ - 0xff, 0xff, 0xff, 0xee, /* 32 bit IPv4 broadcast address */ - }, - }; - static ib_gid_t osm_ts_ipoib_good_mgid = { - { - 0xff, /* multicast field */ - 0x12, /* non-permanent bit,scope */ - 0x40, 0x1b, /* IPv4 signature */ - 0xff, 0xff, /* 16 bits of P_Key (to be filled in) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */ - 0x00, 0x00, 0x00, 0x01, /* 32 bit IPv4 broadcast address */ - }, - }; - static ib_gid_t osm_ipoib_good_mgid = { - { - 0xff, /* multicast field */ - 0x12, /* non-permanent bit,scope */ - 0x40, 0x1b, /* IPv4 signature */ - 0xff, 0xff, /* 16 bits of P_Key (to be filled in) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */ - 0xff, 0xff, 0xff, 0xff, /* 32 bit IPv4 broadcast address */ - }, - }; - static ib_gid_t osm_link_local_mgid = { - { - 0xFF, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01}, - }; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "GetTable of all current MCGs...\n"); - status = osmt_query_mcast(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 2FF " - "GetTable of all records has failed!\n"); - goto Exit; - } - - /* Initialize the test_created_mgrps map */ - cl_map_construct(&test_created_mlids); - cl_map_init(&test_created_mlids, 1000); - - p_mgrp_mlid_tbl = &p_osmt->exp_subn.mgrp_mlid_tbl; - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - - sa_mad = &res.sa_mad; - p_mc_res = ib_sa_mad_get_payload_ptr(sa_mad); - - /* Only when we are on single mode check flow - do the count comparison, otherwise skip */ - if (p_osmt->opt.mmode == 1 || p_osmt->opt.mmode == 3) { - start_cnt = cl_qmap_count(p_mgrp_mlid_tbl); - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(start): " - "Number of MC Records found in SA DB is %d\n", - start_cnt); - } - - /* This flow is being added due to bug discovered using SilverStorm stack - - The bug was initializing MCast with MTU & RATE min values that do - not match the subnet capability, even though that OpenSM - reponds with the correct value it does not store it in the MCG. - We want the check a join request to already existing group (ipoib) - without using MTU or RATE then getting response from OpenSM with - the correct values then join again with them and get IB_SUCCESS - all the way - */ - - /* First validate IPoIB exist in the SA DB */ - p_mgrp = (osmtest_mgrp_t *) cl_qmap_head(p_mgrp_mlid_tbl); - /* scan all available multicast groups in the DB and fill in the table */ - while (p_mgrp != (osmtest_mgrp_t *) cl_qmap_end(p_mgrp_mlid_tbl)) { - /* search for ipoib mgid */ - if (IS_IPOIB_MGID(&p_mgrp->mcmember_rec.mgid)) - start_ipoib_cnt++; - else { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Non-IPoIB MC Groups exist: mgid=%s\n", - inet_ntop(AF_INET6, - p_mgrp->mcmember_rec.mgid.raw, - gid_str, sizeof gid_str)); - mcg_outside_test_cnt++; - } - - p_mgrp = (osmtest_mgrp_t *) cl_qmap_next(&p_mgrp->map_item); - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Found %d non-IPoIB MC Groups\n", mcg_outside_test_cnt); - - if (start_ipoib_cnt) { - /* o15-0.2.4 - Check a join request to already created MCG */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Found IPoIB MC Group, so we run SilverStorm Bug Flow...\n"); - /* Try to join first like IPoIB of SilverStorm */ - memcpy(&mc_req_rec.mgid, &osm_ipoib_good_mgid, - sizeof(ib_gid_t)); - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, - IB_MC_REC_STATE_FULL_MEMBER); - comp_mask = - IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_JOIN_STATE; - - status = osmt_send_mcast_request(p_osmt, 0xff, /* User Defined query Set */ - &mc_req_rec, comp_mask, - sa_mad); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Joining an existing IPoIB multicast group\n"); - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Sent Join request with :\n\t\tport_gid=%s, mgid=%s\n" - "\t\tjoin state= 0x%x, response is : %s\n", - inet_ntop(AF_INET6, mc_req_rec.port_gid.raw, - gid_str, sizeof gid_str), - inet_ntop(AF_INET6, mc_req_rec.mgid.raw, - gid_str2, sizeof gid_str2), - (mc_req_rec.scope_state & 0x0F), - ib_get_err_str(status)); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B3: " - "Failed joining existing IPoIB MCGroup - got %s\n", - ib_get_err_str(status)); - goto Exit; - } - /* Check MTU & Rate Value and resend with SA suggested values */ - - /* Prepare the mc_req_rec for the rest of the flow */ - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - /* - We simulate the same situation as in SilverStorm - a response with the - exact RATE & MTU as the SA responded with. Actually the query - has included some more fields but we know that problem was - genereated by the RATE - */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Received attributes of MCG : \n\t\tMTU=0x%02X, RATE=0x%02X\n", - p_mc_res->mtu, p_mc_res->rate); - - mc_req_rec.mtu = p_mc_res->mtu; - mc_req_rec.rate = p_mc_res->rate; - /* Set feasible mtu & rate that will allow check the - exact statement of OpenSM */ - mtu_phys = p_mc_res->mtu; - rate_phys = p_mc_res->rate; - - memcpy(&mc_req_rec.mgid, &osm_ipoib_good_mgid, - sizeof(ib_gid_t)); - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, - IB_MC_REC_STATE_FULL_MEMBER); - comp_mask = - IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_MTU_SEL | - IB_MCR_COMPMASK_MTU | IB_MCR_COMPMASK_RATE_SEL | - IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Sending attributes of MCG : \n\t\tMTU=0x%02X, RATE=0x%02X\n", - mc_req_rec.mtu, mc_req_rec.rate); - status = osmt_send_mcast_request(p_osmt, 0xff, /* User Defined query */ - &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Sent Join request using response values, response is : %s\n", - ib_get_err_str(status)); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EF: " - "Query as Full Member of already existing " - "ipoib group gid %s has failed\n", - inet_ntop(AF_INET6, mc_req_rec.mgid.raw, - gid_str, sizeof gid_str)); - goto Exit; - } - /* We do not want to leave the MCG since its IPoIB */ - } - - /**************************************************************************/ - /* Check Get with invalid mlid */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Get with invalid mlid...\n"); - /* Request Get */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - mc_req_rec.mlid = invalid_mlid; - comp_mask = IB_MCR_COMPMASK_MLID; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 0xee, /* User Defined query Get */ - &mc_req_rec, comp_mask, sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 2E0 " - "SubnAdmGet with invalid mlid 0x%x succeeded\n", - cl_ntoh16(mc_req_rec.mlid)); - status = IB_ERROR; - goto Exit; - } - - /* Prepare the mc_req_rec for the rest of the flow */ - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - /**************************************************************************/ - /* Check Get with invalid port guid */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Get with invalid port guid (0x0) but valid interface ID : 0x%" - PRIx64 "...\n", - cl_ntoh64(mc_req_rec.port_gid.unicast.interface_id)); - - /* Request Get */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - memset(&mc_req_rec.port_gid.unicast.interface_id, 0, - sizeof(ib_net64_t)); - comp_mask = IB_MCR_COMPMASK_GID; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 0xee, /* User Defined query Get */ - &mc_req_rec, comp_mask, sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 2E4 " - "SubnAdmGet with invalid port guid succeeded\n"); - status = IB_ERROR; - goto Exit; - } - - /* Prepare the mc_req_rec for the rest of the flow */ - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - /**************************************************************************/ - - /* o15.0.1.3: */ - /* - Request Join with insufficient comp_mask */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with insufficient comp mask qkey & pkey (o15.0.1.3)...\n"); - - /* no MGID */ - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - /* IB_MCR_COMPMASK_QKEY | */ - /* IB_MCR_COMPMASK_PKEY | intentionaly missed to raise the error */ - IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - ((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) != - IB_SA_MAD_STATUS_INSUF_COMPS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EE: " - "Expectedd REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with insufficient comp mask - sl (15.0.1.3)...\n"); - - /* no MGID */ - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - comp_mask = - IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | - /* IB_MCR_COMPMASK_SL | */ - IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - ((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) != - IB_SA_MAD_STATUS_INSUF_COMPS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02ED: " - "Expectedd REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - /* no MGID */ - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - - mc_req_rec.mgid.raw[15] = 0x01; - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with insufficient comp mask - flow label (o15.0.1.3)...\n"); - - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - comp_mask = - IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | - /* IB_MCR_COMPMASK_FLOW | intentionaly missed to raise the error */ - IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - ((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) != - IB_SA_MAD_STATUS_INSUF_COMPS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EC: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with insufficient comp mask - tclass (o15.0.1.3)...\n"); - - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - comp_mask = - IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | - IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | - /* IB_MCR_COMPMASK_TCLASS | Intentionally missed to raise an error */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - ((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) != - IB_SA_MAD_STATUS_INSUF_COMPS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EA: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with insufficient comp mask - tclass qkey (o15.0.1.3)...\n"); - - /* no MGID */ - /* memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); */ - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - /* IB_MCR_COMPMASK_QKEY | intentionaly missed to raise the error */ - IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | - IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | - /* IB_MCR_COMPMASK_TCLASS | intentionaly missed to raise the error */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - ((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) != - IB_SA_MAD_STATUS_INSUF_COMPS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E9: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* o15.0.1.8: */ - /* - Request join with irrelevant RATE : get a ERR_INSUFFICIENT_COMPONENTS */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with unrealistic rate (o15.0.1.8)...\n"); - - /* impossible requested rate */ - mc_req_rec.rate = - IB_LINK_WIDTH_ACTIVE_12X | IB_PATH_SELECTOR_GREATER_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0207: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Check Valid value which is unreasonable now */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with unrealistic rate 120GB (o15.0.1.8)...\n"); - - /* impossible requested rate */ - mc_req_rec.rate = - IB_PATH_RECORD_RATE_120_GBS | IB_PATH_SELECTOR_GREATER_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0208: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Check Valid value which is unreasonable now */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with less than min rate 2.5GB (o15.0.1.8)...\n"); - - /* impossible requested rate */ - mc_req_rec.rate = - IB_PATH_RECORD_RATE_2_5_GBS | IB_PATH_SELECTOR_LESS_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AB: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Checking above max value of MTU which is impossible */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with unrealistic mtu : \n\t\tmore than 4096 -" - " max (o15.0.1.8)...\n"); - - /* impossible requested mtu */ - mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_GREATER_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AC: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Checking below min value of MTU which is impossible */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with unrealistic mtu : \n\t\tless than 256 -" - " min (o15.0.1.8)...\n"); - - /* impossible requested mtu */ - mc_req_rec.mtu = IB_MTU_LEN_256 | IB_PATH_SELECTOR_LESS_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AD: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with unrealistic mtu (o15.0.1.8)...\n"); - - /* impossible requested mtu */ - mc_req_rec.mtu = 0x6 | IB_PATH_SELECTOR_GREATER_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AE: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } -#if 0 - /* Currently PacketLifeTime isn't checked in opensm */ - /* Check PacketLifeTime as 0 */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Create with unrealistic packet life value less than 0 (o15.0.1.8)...\n"); - - /* impossible requested packet life */ - mc_req_rec.pkt_life = 0 | IB_PATH_SELECTOR_LESS_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_LIFE | IB_MCR_COMPMASK_LIFE_SEL; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AF: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } -#endif - - /* o15.0.1.4: */ - /* - Create an MGID by asking for a join with MGID = 0 */ - /* providing P_Key, Q_Key, SL, FlowLabel, Tclass. */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Create given MGID=0 skip service level (o15.0.1.4)...\n"); - - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - - /* no MGID */ - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - comp_mask = - IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | - /* IB_MCR_COMPMASK_SL | Intentionally missed */ - IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - ((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) != - IB_SA_MAD_STATUS_INSUF_COMPS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A8: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Check that no same MCG in the SMDB */ - status = osmt_query_mcast(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AA: " - "Could not get all MC Records in subnet, got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Only when we are on single mode check flow - do the count comparison, otherwise skip */ - if (p_osmt->opt.mmode == 1 || p_osmt->opt.mmode == 3) { - middle_cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl); - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(post false create): " - "Number of MC Records found in SA DB is %d\n", - middle_cnt); - if (middle_cnt != start_cnt) - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Got different number of records stored in SA DB (before any creation)\n" - "Instead of %d got %d\n", start_cnt, - middle_cnt); - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Create given MGID=0 skip Qkey and Pkey (o15.0.1.4)...\n"); - - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - - /* no MGID */ - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - /* IB_MCR_COMPMASK_QKEY | */ - /* IB_MCR_COMPMASK_PKEY | Intentionally missed */ - IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - ((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) != - IB_SA_MAD_STATUS_INSUF_COMPS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A7: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Bad Query o15.0.1.4 */ - - status = osmt_query_mcast(p_osmt); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Create given MGID=0 skip TClass (o15.0.1.4)...\n"); - - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - - /* no MGID */ - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - comp_mask = - IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | - IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | - /* IB_MCR_COMPMASK_TCLASS | Intentionally missed */ - /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR || - ((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) != - IB_SA_MAD_STATUS_INSUF_COMPS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A6: " - "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Create given MGID=0 valid Set several options :\n\t\t" - "First above min RATE, Second less than max RATE\n\t\t" - "Third above min MTU, Second less than max MTU\n\t\t" - "Fifth exact MTU & RATE feasible, Sixth exact RATE feasible\n\t\t" - "Seventh exact MTU feasible (o15.0.1.4)...\n"); - - /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */ - - mc_req_rec.rate = - IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A5: " - "Failed to create MCG for MGID=0 with higher than minimum RATE - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */ - - mc_req_rec.rate = - IB_LINK_WIDTH_ACTIVE_12X | IB_PATH_SELECTOR_LESS_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0211: " - "Failed to create MCG for MGID=0 with less than highest RATE - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */ - - mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_LESS_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0238: " - "Failed to create MCG for MGID=0 with less than highest MTU - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */ - mc_req_rec.mtu = IB_MTU_LEN_256 | IB_PATH_SELECTOR_GREATER_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0239: " - "Failed to create MCG for MGID=0 with higher than lowest MTU - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */ - /* Using Exact feasible MTU & RATE */ - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Using Exact feasible MTU & RATE: " - "MTU = 0x%02X, RATE = 0x%02X\n", mtu_phys, rate_phys); - - mc_req_rec.mtu = mtu_phys; - mc_req_rec.rate = rate_phys; - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | - IB_MCR_COMPMASK_MTU | - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0240: " - "Failed to create MCG for MGID=0 with exact MTU & RATE - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */ - /* Using Exact feasible RATE */ - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Using Exact feasible RATE: 0x%02X\n", rate_phys); - - mc_req_rec.rate = rate_phys; - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0241: " - "Failed to create MCG for MGID=0 with exact RATE - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */ - /* Using Exact feasible MTU */ - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Using Exact feasible MTU: 0x%02X\n", mtu_phys); - - mc_req_rec.mtu = mtu_phys; - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0242: " - "Failed to create MCG for MGID=0 with exact MTU - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* o15.0.1.5: */ - /* - Check the returned MGID is valid. (p 804) */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Validating resulting MGID (o15.0.1.5)...\n"); - /* prefix 0xFF1 Scope 0xA01B */ - /* Since we did not directly specified SCOPE in comp mask - we should get the comp mask that is link-local scope */ - if ((p_mc_res->mgid.multicast.header[0] != 0xFF) || - (p_mc_res->mgid.multicast.header[1] != 0x12) || - (p_mc_res->mgid.multicast.raw_group_id[0] != 0xA0) || - (p_mc_res->mgid.multicast.raw_group_id[1] != 0x1B)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0209: " - "Validating MGID failed. MGID:%s\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str)); - status = IB_ERROR; - goto Exit; - } - - /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */ - /* Using feasible GREATER_THAN 0 packet lifitime */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Create given MGID=0 (o15.0.1.4)...\n"); - - status = osmt_query_mcast(p_osmt); - - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - - /* no MGID */ - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - mc_req_rec.pkt_life = 0 | IB_PATH_SELECTOR_GREATER_THAN << 6; - - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_LIFE | IB_MCR_COMPMASK_LIFE_SEL; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0210: " - "Failed to create MCG for MGID=0 - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* o15.0.1.6: */ - /* - Create a new MCG with valid requested MGID. */ - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - mc_req_rec.mgid = good_mgid; - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Create given valid MGID=%s (o15.0.1.6)...\n", - inet_ntop(AF_INET6, mc_req_rec.mgid.raw, gid_str, - sizeof gid_str)); - - /* Before creation, need to check that this group doesn't exist */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Verifying that MCGroup with this MGID doesn't exist by trying to Join it (o15.0.1.13)...\n"); - - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_NON_MEMBER); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, /* join */ - &mc_req_rec, comp_mask, sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0301: " - "Tried joining group that shouldn't have existed - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Set State to full member to allow group creation */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Now creating group with given valid MGID=%s (o15.0.1.6)...\n", - inet_ntop(AF_INET6, mc_req_rec.mgid.raw, gid_str, - sizeof gid_str)); - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0211: " - "Failed to create MCG for MGID=%s (o15.0.1.6) - got %s/%s\n", - inet_ntop(AF_INET6, good_mgid.raw, gid_str, - sizeof gid_str), ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Validating resulting MGID (o15.0.1.6)...\n"); - /* prefix 0xFF1 Scope 0xA01B */ - if ((p_mc_res->mgid.multicast.header[0] != 0xFF) || (p_mc_res->mgid.multicast.header[1] != 0x12) || /* HACK hardcoded scope = 0x02 */ - (p_mc_res->mgid.multicast.raw_group_id[0] != 0xA0) || - (p_mc_res->mgid.multicast.raw_group_id[1] != 0x1C)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0212: " - "Validating MGID failed. MGID:%s\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str)); - status = IB_ERROR; - goto Exit; - } - - /* - Try to create a new MCG with invalid MGID : get back ERR_REQ_INVALID */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking BAD MGID=0xFA..... (o15.0.1.6)...\n"); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - mc_req_rec.mgid.raw[0] = 0xFA; - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0213: " - "Failed to recognize MGID error for MGID=0xFA - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* - Try again with MGID prefix = 0xA01B (maybe 0x1BA0 little or big ?) */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking BAD MGID=0xFF12A01B..... with link-local scope (o15.0.1.6)...\n"); - - mc_req_rec.mgid.raw[0] = 0xFF; - mc_req_rec.mgid.raw[3] = 0x1B; - comp_mask = comp_mask | IB_MCR_COMPMASK_SCOPE; - mc_req_rec.scope_state = mc_req_rec.scope_state & 0x2F; /* local scope */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0214: " - "Failed to recognize MGID error for A01B with link-local bit (status %s) (rem status %s)\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Change the mgid prefix - get back ERR_REQ_INVALID */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking BAD MGID PREFIX=0xEF... (o15.0.1.6)...\n"); - - mc_req_rec.mgid = good_mgid; - mc_req_rec.mgid.raw[0] = 0xEF; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0215: " - "Failed to recognize MGID PREFIX error for MGID=0xEF - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Change the scope to reserved - get back VALID REQ */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking local scope with full member \n\t\tand valid mgid %s" - " ... (o15.0.1.6)...\n", - inet_ntop(AF_INET6, mc_req_rec.mgid.raw, gid_str, - sizeof gid_str)); - - mc_req_rec.mgid = good_mgid; - mc_req_rec.mgid.raw[1] = 0x1F; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0216: " - "Failed to create MCG for MGID=%s - got %s/%s\n", - inet_ntop(AF_INET6, good_mgid.raw, gid_str, - sizeof gid_str), ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* Change the flags to invalid value 0x2 - get back INVALID REQ */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking invalid flags=0xFF 22 ... (o15.0.1.6)...\n"); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - mc_req_rec.mgid = good_mgid; - mc_req_rec.mgid.raw[1] = 0x22; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0217: " - "Failed to recognize create with invalid flags value 0x2 - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Change the MGID to link local MGID - get back VALID REQ */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking link local MGID 0xFF02:0:0:0:0:0:0:1 (o15.0.1.6)...\n"); - - mc_req_rec.mgid = osm_link_local_mgid; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0218: " - "Failed to create MCG for MGID=0xFF02:0:0:0:0:0:0:1 - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* o15.0.1.7 - implicitlly checked during the prev steps. */ - /* o15.0.1.8 - implicitlly checked during the prev steps. */ - - /* o15.0.1.9 */ - /* - Create MCG with Invalid JoinState.FullMember != 1 : get ERR_REQ_INVALID */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking new MGID with invalid join state (o15.0.1.9)...\n"); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - mc_req_rec.mgid = good_mgid; - mc_req_rec.mgid.raw[12] = 0xFF; - mc_req_rec.scope_state = 0x22; /* link-local scope, non-member state */ - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0219: " - "Failed to recognize create with JoinState != FullMember - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Lets try a valid join scope state */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking new MGID with valid join state (o15.0.1.9)...\n"); - - mc_req_rec.mgid = good_mgid; - mc_req_rec.scope_state = 0x23; /* link-local scope, non member and full member */ - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0220: " - "Failed to create MCG with valid join state 0x3 - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* Lets try another invalid join scope state */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking new MGID with invalid join state (o15.0.1.9)...\n"); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - /* We have created a new MCG so now we need different mgid when cresting group otherwise it will be counted as join request . */ - mc_req_rec.mgid = good_mgid; - mc_req_rec.mgid.raw[12] = 0xFC; - mc_req_rec.scope_state = 0x24; /* link-local scope, send only member */ - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0221: " - "Failed to recognize create with JoinState != FullMember - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Lets try another valid join scope state */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking new MGID creation with valid join state (o15.0.2.3)...\n"); - - mc_req_rec.mgid = good_mgid; - mc_req_rec.mgid.raw[12] = 0xFB; - memcpy(&special_mgid, &mc_req_rec.mgid, sizeof(ib_gid_t)); - mc_req_rec.scope_state = 0x2F; /* link-local scope, Full member with all other bits turned on */ - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0222: " - "Failed to create MCG with valid join state 0xF - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str, - sizeof gid_str), cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res); - - /* o15.0.1.10 - can't check on a single client .-- obsolete - - checked by SilverStorm bug o15-0.2.4, never the less recheck */ - /* o15-0.2.4 - Check a join request to already created MCG */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "Check o15-0.2.4 statement...\n"); - /* Try to join */ - memcpy(&mc_req_rec.mgid, &p_mc_res->mgid, sizeof(ib_gid_t)); - /* Request Join */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_NON_MEMBER); - comp_mask = - IB_MCR_COMPMASK_MGID | - IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_JOIN_STATE; - - status = osmt_send_mcast_request(p_osmt, 0x1, /* SubnAdmSet */ - &mc_req_rec, comp_mask, sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CC: " - "Failed to join MCG with valid req, returned status = %s\n", - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - if ((p_mc_res->scope_state & 0x7) != 0x7) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D0: " - "Validating JoinState update failed. " - "Expected 0x27 got 0x%02X\n", p_mc_res->scope_state); - status = IB_ERROR; - goto Exit; - } - - /* o15.0.1.11: */ - /* - Try to join into a MGID that exists with JoinState=SendOnlyMember - */ - /* see that it updates JoinState. What is the routing change? */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Retry of existing MGID - See JoinState update (o15.0.1.11)...\n"); - - mc_req_rec.mgid = good_mgid; - - /* first, make sure that the group exists */ - mc_req_rec.scope_state = 0x21; - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CD: " - "Failed to create/join as full member - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - mc_req_rec.scope_state = 0x22; /* link-local scope, non-member */ - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D1: " - "Failed to update existing MGID - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Validating Join State update with NonMember (o15.0.1.11)...\n"); - - if (p_mc_res->scope_state != 0x23) { /* scope is LSB */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CE: " - "Validating JoinState update failed. Expected 0x23 got: 0x%02X\n", - p_mc_res->scope_state); - status = IB_ERROR; - goto Exit; - } - - /* Try delete current join state then update it with another value */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking JoinState update request should return 0x22 (o15.0.1.11)...\n"); - - mc_req_rec.rate = - IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6; - mc_req_rec.mgid = good_mgid; - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Partially delete JoinState (o15.0.1.14)...\n"); - - /* link-local scope, both non-member bits, - so we should not be able to delete) */ - mc_req_rec.scope_state = 0x26; - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CF: " - "Expected to fail partially update JoinState, " - "but got %s\n", ib_get_err_str(status)); - status = IB_ERROR; - goto Exit; - } - - /* link-local scope, NonMember bit, the FullMember bit should stay */ - mc_req_rec.scope_state = 0x22; - status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D3: " - "Failed to partially update JoinState : %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - if (p_mc_res->scope_state != 0x21) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D4: " - "Failed to partially update JoinState : " - "JoinState = 0x%02X, expected 0x%02X\n", - p_mc_res->scope_state, 0x21); - status = IB_ERROR; - goto Exit; - } - - /* So far successfully delete state - Now change it */ - mc_req_rec.mgid = good_mgid; - mc_req_rec.scope_state = 0x24; /* link-local scope, send only member */ - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C0: " - "Failed to update existing MCG - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Validating Join State update with Send Only Member (o15.0.1.11)...\n"); - - if (p_mc_res->scope_state != 0x25) { /* scope is MSB */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C1: " - "Validating JoinState update failed. Expected 0x25 got: 0x%02X\n", - p_mc_res->scope_state); - status = IB_ERROR; - goto Exit; - } - /* Now try to update value of join state */ - mc_req_rec.scope_state = 0x21; /* link-local scope, full member */ - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C2: " - "Failed to update existing MGID - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Validating Join State update with Full Member\n\t\t" - "to an existing 0x5 state MCG (o15.0.1.11)...\n"); - - if (p_mc_res->scope_state != 0x25) { /* scope is LSB */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C3: " - "Validating JoinState update failed. Expected 0x25 got: 0x%02X\n", - p_mc_res->scope_state); - status = IB_ERROR; - goto Exit; - } - - /* Now try to update value of join state */ - mc_req_rec.scope_state = 0x22; /* link-local scope,non member */ - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C4: " - "Failed to update existing MGID - got %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Validating Join State update with Non Member\n\t\t" - "to an existing 0x5 state MCG (o15.0.1.11)...\n"); - - if (p_mc_res->scope_state != 0x27) { /* scope is LSB */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C5: " - "Validating JoinState update failed. Expected 0x27 got: 0x%02X\n", - p_mc_res->scope_state); - status = IB_ERROR; - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "DEBUG - Current scope_state value : 0x%02X...\n", - p_mc_res->scope_state); - - /* - We can not check simple join since we have only one tester (for now) */ - - /* o15.0.1.12: Not Supported */ - /* - The SendOnlyNonMem join should have a special treatment in the - SA but what is it ? */ - - /* o15.0.1.13: */ - /* - Try joining with rate that does not exist in any MCG - - ERR_REQ_INVALID */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking BAD RATE when connecting to existing MGID (o15.0.1.13)...\n"); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - mc_req_rec.mgid = good_mgid; - mc_req_rec.rate = - IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_LESS_THAN << 6; - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C6: " - "Failed to catch BAD RATE joining an existing MGID: %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Try MTU that does not exist in any MCG */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking BAD MTU (higher than max) when connecting to " - "existing MGID (o15.0.1.13)...\n"); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - mc_req_rec.mgid = osm_ipoib_mgid; - mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_GREATER_THAN << 6; - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C7: " - "Failed to catch BAD RATE (higher than max) joining an existing MGID: %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Try another MTU that does not exist in any MCG */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking BAD MTU (less than min) when connecting " - "to existing MGID (o15.0.1.13)...\n"); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - mc_req_rec.mgid = osm_ipoib_mgid; - mc_req_rec.mtu = IB_MTU_LEN_256 | IB_PATH_SELECTOR_LESS_THAN << 6; - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C8: " - "Failed to catch BAD RATE (less than min) joining an existing MGID: %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* o15.0.1.14: */ - /* - Try partial delete - actually updating the join state. check it. */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking partial JoinState delete request - removing NonMember (o15.0.1.14)...\n"); - - mc_req_rec.rate = - IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6; - mc_req_rec.mgid = good_mgid; - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE; - /* link-local scope, non member (so we should not be able to delete) */ - /* but the NonMember bit should be gone */ - mc_req_rec.scope_state = 0x22; - - status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C9: " - "Fail to partially update JoinState during delete: %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Validating Join State removal of Non Member bit (o15.0.1.14)...\n"); - if (p_mc_res->scope_state != 0x25) { /* scope is MSB - now only the full member & send only member have left */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CA: " - "Validating JoinState update failed. Expected 0x25 got: 0x%02X\n", - p_mc_res->scope_state); - status = IB_ERROR; - goto Exit; - } - - /* Now use the same scope_state and delete all JoinState - leave multicast group since state is 0x0 */ - - mc_req_rec.scope_state = 0x25; - status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CB: " - "Failed to update JoinState during delete: %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Validating Join State update remove (o15.0.1.14)...\n"); - - if (p_mc_res->scope_state != 0x25) { /* scope is MSB - now only 0x0 so port is removed from MCG */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BF: " - "Validating JoinState update failed. Expected 0x25 got: 0x%02X\n", - p_mc_res->scope_state); - status = IB_ERROR; - goto Exit; - } - - /* - Try joining (not full mem) again to see the group was deleted. (should fail) */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Delete by trying to Join deleted group (o15.0.1.13)...\n"); - - mc_req_rec.scope_state = 0x22; /* use non member - so if no group fail */ - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, /* join */ - &mc_req_rec, comp_mask, sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status != IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BC: " - "Succeeded Joining Deleted Group: %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* - Try deletion of the IPoIB MCG and get: ERR_REQ_INVALID */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking BAD Delete of Mgid membership (no prev join) (o15.0.1.15)...\n"); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - mc_req_rec.mgid = osm_ipoib_mgid; - mc_req_rec.rate = - IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6; - mc_req_rec.scope_state = 0x21; /* delete full member */ - - status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */ - &mc_req_rec, comp_mask, sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BD: " - "Failed to catch BAD delete from IPoIB: %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* Prepare another MCG for the following tests : */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Create given MGID=%s\n\t\t(o15.0.1.4)...\n", - inet_ntop(AF_INET6, osm_ipoib_mgid.raw, gid_str, - sizeof gid_str)); - - mc_req_rec.mgid = good_mgid; - mc_req_rec.mgid.raw[12] = 0xAA; - mc_req_rec.pkt_life = 0 | IB_PATH_SELECTOR_GREATER_THAN << 6; - mc_req_rec.scope_state = 0x21; /* Full memeber */ - comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_LIFE | IB_MCR_COMPMASK_LIFE_SEL; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BE: " - "Failed to create MCG for %s - got %s/%s\n", - inet_ntop(AF_INET6, good_mgid.raw, gid_str, - sizeof gid_str), ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - - /* - Try delete with valid join state */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Full Delete of a group (o15.0.1.14)...\n"); - mc_req_rec.scope_state = 0x21; /* the FullMember is the current JoinState */ - status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) - goto Exit; - - /* o15.0.1.15: */ - /* - Try deletion of the IPoIB MCG and get: ERR_REQ_INVALID */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking BAD Delete of IPoIB membership (no prev join) (o15.0.1.15)...\n"); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - mc_req_rec.mgid = osm_ipoib_mgid; - mc_req_rec.rate = - IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6; - mc_req_rec.scope_state = 0x21; /* delete full member */ - - status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */ - &mc_req_rec, comp_mask, sa_mad); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if ((status != IB_REMOTE_ERROR) || - (sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0223: " - "Failed to catch BAD delete from IPoIB: %s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /**************************************************************************/ - /* Checking join with invalid MTU */ - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Join with unrealistic mtu : \n" - "\t\tFirst create new MCG than try to join it \n" - "\t\twith unrealistic MTU greater than 4096 (o15.0.1.8)...\n"); - - /* First create new mgrp */ - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - mc_req_rec.mtu = IB_MTU_LEN_1024 | IB_PATH_SELECTOR_EXACTLY << 6; - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EB: " - "Failed to create new mgrp\n"); - goto Exit; - } - memcpy(&tmp_mgid, &p_mc_res->mgid, sizeof(ib_gid_t)); - osm_dump_mc_record(&p_osmt->log, p_mc_res, OSM_LOG_INFO); - /* tmp_mtu = p_mc_res->mtu & 0x3F; */ - - /* impossible requested mtu always greater than exist in MCG */ - mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_GREATER_THAN << 6; - memcpy(&mc_req_rec.mgid, &tmp_mgid, sizeof(ib_gid_t)); - ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER); - comp_mask = - IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_JOIN_STATE | - IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask, - sa_mad); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E4: " - "Expected REMOTE ERROR got:%s/%s\n", - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - /* - Try GetTable with PortGUID wildcarded and get back some groups. */ - status = osmt_query_mcast(p_osmt); - cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl); - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(Before checking Max MCG creation): " - "Number of MC Records found in SA DB is %d\n", cnt); - - /**************************************************************************/ - /* Checking join on behalf of remote port gid */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "Checking Proxy Join...\n"); - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all NodeRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_NODE_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E5: " - "osmtest_get_all_recs failed on getting all node records(%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Populate the database with the received records. - */ - num_recs = context.result.result_cnt; - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_node_rec(context.result.p_result_madw, i); - if (p_rec->node_info.port_guid != p_osmt->local_port.port_guid - && p_rec->node_info.node_type == IB_NODE_TYPE_CA) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "remote port_guid = 0x%" PRIx64 "\n", - cl_ntoh64(p_rec->node_info.port_guid)); - - remote_port_guid = p_rec->node_info.port_guid; - i = num_recs; - break; - } - } - - if (remote_port_guid != 0x0) { - ib_member_set_join_state(&mc_req_rec, - IB_MC_REC_STATE_FULL_MEMBER); - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - mc_req_rec.port_gid.unicast.interface_id = remote_port_guid; - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS; /* all above are required */ - - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, - comp_mask, sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B4: " - "Could not join on behalf of remote port 0x%016" - PRIx64 " remote status: %s\n", - cl_ntoh64(remote_port_guid), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - memcpy(&proxy_mgid, &p_mc_res->mgid, sizeof(ib_gid_t)); - - /* First try a bad deletion then good one */ - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Trying deletion of remote port with local port guid\n"); - - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - ib_member_set_join_state(&mc_req_rec, - IB_MC_REC_STATE_FULL_MEMBER); - comp_mask = - IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_JOIN_STATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - - status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */ - &mc_req_rec, - comp_mask, sa_mad); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A9: " - "Successful deletion of remote port guid with local one MGID : " - "%s, Got : %s/%s\n", - inet_ntop(AF_INET6, - p_mgrp->mcmember_rec.mgid.raw, - gid_str, sizeof gid_str), - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - status = IB_ERROR; - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Trying deletion of remote port with the right port guid\n"); - - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - ib_member_set_join_state(&mc_req_rec, - IB_MC_REC_STATE_FULL_MEMBER); - mc_req_rec.mgid = proxy_mgid; - mc_req_rec.port_gid.unicast.interface_id = remote_port_guid; - comp_mask = - IB_MCR_COMPMASK_MGID | - IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_JOIN_STATE; - status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */ - &mc_req_rec, - comp_mask, sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B0: " - "Failed to delete mgid with remote port guid MGID : " - "%s, Got : %s/%s\n", - inet_ntop(AF_INET6, - p_mgrp->mcmember_rec.mgid.raw, - gid_str, sizeof gid_str), - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) sa_mad)); - goto Exit; - } - } else - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Could not check proxy join since could not found remote port, different from local port\n"); - - /* prepare init for next check */ - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - - /**************************************************************************/ - if (p_osmt->opt.mmode > 2) { - /* Check invalid Join with max mlid which is more than the - Mellanox switches support 0xC000+0x1000 = 0xd000 */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Checking Creation of Maximum avaliable Groups (MulticastFDBCap)...\n"); - tmp_mlid = cl_ntoh16(max_mlid) - cnt; - - while (tmp_mlid > 0) { - uint16_t cur_mlid = 0; - - /* Request Set */ - ib_member_set_join_state(&mc_req_rec, - IB_MC_REC_STATE_FULL_MEMBER); - /* Good Flow - mgid is 0 while giving all required fields for - join : P_Key, Q_Key, SL, FlowLabel, Tclass */ - - mc_req_rec.rate = - IB_LINK_WIDTH_ACTIVE_1X | - IB_PATH_SELECTOR_GREATER_THAN << 6; - mc_req_rec.mlid = max_mlid; - memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); - comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */ - IB_MCR_COMPMASK_MLID; - status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, - comp_mask, sa_mad); - if (status == IB_SUCCESS) { - cur_mlid = cl_ntoh16(p_mc_res->mlid); - /* Save the mlid created in test_created_mlids map */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Created MGID:%s MLID:0x%04X\n", - inet_ntop(AF_INET6, p_mc_res->mgid.raw, - gid_str, sizeof gid_str), - cl_ntoh16(p_mc_res->mlid)); - cl_map_insert(&test_created_mlids, - cl_ntoh16(p_mc_res->mlid), - p_mc_res); - } else if (cur_mlid > cl_ntoh16(max_mlid)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 2E1 " - "Successful Join with greater mlid than switches support (MulticastFDBCap) 0x%04X\n", - cur_mlid); - status = IB_ERROR; - osm_dump_mc_record(&p_osmt->log, p_mc_res, - OSM_LOG_VERBOSE); - goto Exit; - } else if ((sa_mad->status & IB_SMP_STATUS_MASK) == - IB_SA_MAD_STATUS_NO_RESOURCES) - /* You can quietly exit the loop since no available mlid in SA DB - i.e. reached the maximum valid avalable mlid */ - break; - tmp_mlid--; - } - } - - /* Prepare the mc_req_rec for the rest of the flow */ - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - - /**************************************************************************/ - /* o15.0.1.16: */ - /* - Try GetTable with PortGUID wildcarded and get back some groups. */ - - status = osmt_query_mcast(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B1: " - "Failed to query multicast groups: %s\n", - ib_get_err_str(status)); - goto Exit; - } - - cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl); - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(Before Deletion of all MCG): " - "Number of MC Records found in SA DB is %d\n", cnt); - - /* Delete all MCG that are not of IPoIB */ - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Cleanup all MCG that are not IPoIB...\n"); - - p_mgrp_mlid_tbl = &p_osmt->exp_subn.mgrp_mlid_tbl; - p_mgrp = (osmtest_mgrp_t *) cl_qmap_head(p_mgrp_mlid_tbl); - /* scan all available multicast groups in the DB and fill in the table */ - while (p_mgrp != (osmtest_mgrp_t *) cl_qmap_end(p_mgrp_mlid_tbl)) { - /* Only if different from IPoIB Mgid try to delete */ - if (!IS_IPOIB_MGID(&p_mgrp->mcmember_rec.mgid)) { - osmt_init_mc_query_rec(p_osmt, &mc_req_rec); - mc_req_rec.mgid = p_mgrp->mcmember_rec.mgid; - - /* o15-0.1.4 - need to specify the oppsite state for a valid delete */ - if (!memcmp(&special_mgid, &p_mgrp->mcmember_rec.mgid, - sizeof(special_mgid))) - mc_req_rec.scope_state = 0x2F; - else - mc_req_rec.scope_state = 0x21; - comp_mask = - IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | - IB_MCR_COMPMASK_JOIN_STATE; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Sending request to delete MGID : %s" - ", scope_state : 0x%02X\n", - inet_ntop(AF_INET6, mc_req_rec.mgid.raw, - gid_str, sizeof gid_str), - mc_req_rec.scope_state); - status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */ - &mc_req_rec, comp_mask, - sa_mad); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 02FF: Failed to delete MGID : %s" - " ,\n\t\t it is not our MCG, Status : %s/%s\n", - inet_ntop(AF_INET6, - p_mgrp->mcmember_rec.mgid.raw, - gid_str, sizeof gid_str), - ib_get_err_str(status), - ib_get_mad_status_str((ib_mad_t *) - sa_mad)); - fail_to_delete_mcg++; - } - } else - end_ipoib_cnt++; - p_mgrp = (osmtest_mgrp_t *) cl_qmap_next(&p_mgrp->map_item); - } - - status = osmt_query_mcast(p_osmt); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B2 " - "GetTable of all records has failed - got %s\n", - ib_get_err_str(status)); - goto Exit; - } - - /* If we are in single mode check flow - need to make sure all the multicast groups - that are left are not ones created during the flow. - */ - if (p_osmt->opt.mmode == 1 || p_osmt->opt.mmode == 3) { - end_cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "Status of MC Records in SA DB during the test flow:\n" " Beginning of test\n" " Unrelated to the test: %d\n" " IPoIB MC Records : %d\n" " Total : %d\n" " End of test\n" " Failed to delete : %d\n" " IPoIB MC Records : %d\n" " Total : %d\n", mcg_outside_test_cnt, /* Non-IPoIB that existed at the beginning */ - start_ipoib_cnt, /* IPoIB records */ - start_cnt, /* Total: IPoIB and MC Records unrelated to the test */ - fail_to_delete_mcg, /* Failed to delete at the end */ - end_ipoib_cnt, /* IPoIB records */ - end_cnt); /* Total MC Records at the end */ - - /* when we compare num of MCG we should consider an outside source which create other MCGs */ - if ((end_cnt - fail_to_delete_mcg - end_ipoib_cnt) != - (start_cnt - mcg_outside_test_cnt - start_ipoib_cnt)) { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Got different number of non-IPoIB records stored in SA DB\n\t\t" - "at Start got %d, at End got %d (IPoIB groups only)\n", - (start_cnt - mcg_outside_test_cnt - - start_ipoib_cnt), - (end_cnt - fail_to_delete_mcg - end_ipoib_cnt)); - } - - p_mgrp_mlid_tbl = &p_osmt->exp_subn.mgrp_mlid_tbl; - p_mgrp = (osmtest_mgrp_t *) cl_qmap_head(p_mgrp_mlid_tbl); - while (p_mgrp != - (osmtest_mgrp_t *) cl_qmap_end(p_mgrp_mlid_tbl)) { - uint16_t mlid = - (uint16_t) cl_qmap_key((cl_map_item_t *) p_mgrp); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Found MLID:0x%04X\n", mlid); - /* Check if the mlid is in the test_created_mlids. If TRUE, then we - didn't delete a MCgroup that was created in this flow. */ - if (cl_map_get(&test_created_mlids, mlid) != NULL) { - /* This means that we still have an mgrp that we created!! */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02FE: " - "Wasn't able to erase mgrp with MGID:%s" - " MLID:0x%04X\n", - inet_ntop(AF_INET6, - p_mgrp->mcmember_rec.mgid.raw, - gid_str, sizeof gid_str), - mlid); - got_error = TRUE; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Still exists %s MGID:%s\n", - (IS_IPOIB_MGID - (&p_mgrp->mcmember_rec. - mgid)) ? "IPoIB" : "non-IPoIB", - inet_ntop(AF_INET6, - p_mgrp->mcmember_rec.mgid.raw, - gid_str, sizeof gid_str)); - } - p_mgrp = - (osmtest_mgrp_t *) cl_qmap_next(&p_mgrp->map_item); - } - - if (got_error) { - __osmt_print_all_multicast_records(p_osmt); - status = IB_ERROR; - } - } -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return status; -} diff --git a/branches/opensm_3/user/osmtest/osmt_service.c b/branches/opensm_3/user/osmtest/osmt_service.c deleted file mode 100644 index 9921c26f..00000000 --- a/branches/opensm_3/user/osmtest/osmt_service.c +++ /dev/null @@ -1,1587 +0,0 @@ -/* - * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of service records testing flow.. - * Top level is osmt_run_service_records_flow: - * osmt_register_service - * osmt_get_service_by_name - * osmt_get_all_services - * osmt_delete_service_by_name - * - */ - -#ifndef __WIN__ -#include -#else -#include -#endif -#include -#include -#include -#include -#include "osmtest.h" - - -ib_api_status_t -osmt_register_service(IN osmtest_t * const p_osmt, - IN ib_net64_t service_id, - IN ib_net16_t service_pkey, - IN ib_net32_t service_lease, - IN uint8_t service_key_lsb, IN char *service_name) -{ - osmv_query_req_t req; - osmv_user_query_t user; - osmtest_req_context_t context; - ib_service_record_t svc_rec; - osm_log_t *p_log = &p_osmt->log; - ib_api_status_t status; - - OSM_LOG_ENTER(p_log); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Registering service: name: %s id: 0x%" PRIx64 "\n", - service_name, cl_ntoh64(service_id)); - - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - memset(&user, 0, sizeof(user)); - memset(&svc_rec, 0, sizeof(svc_rec)); - - /* set the new service record fields */ - svc_rec.service_id = service_id; - svc_rec.service_pkey = service_pkey; - svc_rec.service_gid.unicast.prefix = 0; - svc_rec.service_gid.unicast.interface_id = p_osmt->local_port.port_guid; - svc_rec.service_lease = service_lease; - memset(&svc_rec.service_key, 0, 16 * sizeof(uint8_t)); - svc_rec.service_key[0] = service_key_lsb; - memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name)); - memcpy(svc_rec.service_name, service_name, - (strlen(service_name) + 1) * sizeof(char)); - - /* prepare the data used for this query */ - /* sa_mad_data.method = IB_MAD_METHOD_SET; */ - /* sa_mad_data.sm_key = 0; */ - - context.p_osmt = p_osmt; - req.query_context = &context; - req.query_type = OSMV_QUERY_USER_DEFINED; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.flags = OSM_SA_FLAGS_SYNC; - req.sm_key = 0; - req.timeout_ms = p_osmt->opt.transaction_timeout; - - user.method = IB_MAD_METHOD_SET; - user.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - if (ib_pkey_is_invalid(service_pkey)) { - /* if given an invalid service_pkey - don't turn the PKEY compmask on */ - user.comp_mask = IB_SR_COMPMASK_SID | - IB_SR_COMPMASK_SGID | - IB_SR_COMPMASK_SLEASE | - IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME; - } else { - user.comp_mask = IB_SR_COMPMASK_SID | - IB_SR_COMPMASK_SGID | - IB_SR_COMPMASK_SPKEY | - IB_SR_COMPMASK_SLEASE | - IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME; - } - user.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); - user.p_attr = &svc_rec; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A01: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A02: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - } - goto Exit; - } - -Exit: - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -ib_api_status_t -osmt_register_service_with_full_key(IN osmtest_t * const p_osmt, - IN ib_net64_t service_id, - IN ib_net16_t service_pkey, - IN ib_net32_t service_lease, - IN uint8_t * service_key, - IN char *service_name) -{ - osmv_query_req_t req; - osmv_user_query_t user; - osmtest_req_context_t context; - ib_service_record_t svc_rec, *p_rec; - osm_log_t *p_log = &p_osmt->log; - ib_api_status_t status; - uint8_t i, skey[16]; - - OSM_LOG_ENTER(p_log); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Registering service: name: %s id: 0x%" PRIx64 "\n", - service_name, cl_ntoh64(service_id)); - - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - memset(&user, 0, sizeof(user)); - memset(&svc_rec, 0, sizeof(svc_rec)); - - /* set the new service record fields */ - svc_rec.service_id = service_id; - svc_rec.service_pkey = service_pkey; - svc_rec.service_gid.unicast.prefix = 0; - svc_rec.service_gid.unicast.interface_id = p_osmt->local_port.port_guid; - svc_rec.service_lease = service_lease; - memset(&svc_rec.service_key, 0, 16 * sizeof(uint8_t)); - memcpy(svc_rec.service_key, service_key, 16 * sizeof(uint8_t)); - memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name)); - memset(skey, 0, 16 * sizeof(uint8_t)); - memcpy(svc_rec.service_name, service_name, - (strlen(service_name) + 1) * sizeof(char)); - - /* prepare the data used for this query */ - /* sa_mad_data.method = IB_MAD_METHOD_SET; */ - /* sa_mad_data.sm_key = 0; */ - - context.p_osmt = p_osmt; - req.query_context = &context; - req.query_type = OSMV_QUERY_USER_DEFINED; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.flags = OSM_SA_FLAGS_SYNC; - req.sm_key = 0; - req.timeout_ms = p_osmt->opt.transaction_timeout; - - user.method = IB_MAD_METHOD_SET; - user.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - if (ib_pkey_is_invalid(service_pkey)) { - /* if given an invalid service_pkey - don't turn the PKEY compmask on */ - user.comp_mask = IB_SR_COMPMASK_SID | - IB_SR_COMPMASK_SGID | - IB_SR_COMPMASK_SLEASE | - IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME; - } else { - user.comp_mask = IB_SR_COMPMASK_SID | - IB_SR_COMPMASK_SGID | - IB_SR_COMPMASK_SPKEY | - IB_SR_COMPMASK_SLEASE | - IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME; - } - user.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); - user.p_attr = &svc_rec; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A03: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A04: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - } - goto Exit; - } - - /* Check service key on context to see if match */ - p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Comparing service key...\n" "return key is:\n"); - for (i = 0; i <= 15; i++) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "service_key sent[%u] = %u, service_key returned[%u] = %u\n", - i, service_key[i], i, p_rec->service_key[i]); - } - /* since c15-0.1.14 not supported all key association queries should bring in return zero in service key */ - if (memcmp(skey, p_rec->service_key, 16 * sizeof(uint8_t)) != 0) { - status = IB_REMOTE_ERROR; - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A33: " - "Data mismatch in service_key\n"); - goto Exit; - } - -Exit: - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -ib_api_status_t -osmt_register_service_with_data(IN osmtest_t * const p_osmt, - IN ib_net64_t service_id, - IN ib_net16_t service_pkey, - IN ib_net32_t service_lease, - IN uint8_t service_key_lsb, - IN uint8_t * service_data8, - IN ib_net16_t * service_data16, - IN ib_net32_t * service_data32, - IN ib_net64_t * service_data64, - IN char *service_name) -{ - osmv_query_req_t req; - osmv_user_query_t user; - osmtest_req_context_t context; - ib_service_record_t svc_rec, *p_rec; - osm_log_t *p_log = &p_osmt->log; - ib_api_status_t status; - /* ib_service_record_t* p_rec; */ - - OSM_LOG_ENTER(p_log); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Registering service: name: %s id: 0x%" PRIx64 "\n", - service_name, cl_ntoh64(service_id)); - - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - memset(&user, 0, sizeof(user)); - memset(&svc_rec, 0, sizeof(svc_rec)); - - /* set the new service record fields */ - svc_rec.service_id = service_id; - svc_rec.service_pkey = service_pkey; - svc_rec.service_gid.unicast.prefix = 0; - svc_rec.service_gid.unicast.interface_id = p_osmt->local_port.port_guid; - svc_rec.service_lease = service_lease; - memset(&svc_rec.service_key, 0, 16 * sizeof(uint8_t)); - svc_rec.service_key[0] = service_key_lsb; - - /* Copy data to service_data arrays */ - memcpy(svc_rec.service_data8, service_data8, 16 * sizeof(uint8_t)); - memcpy(svc_rec.service_data16, service_data16, 8 * sizeof(ib_net16_t)); - memcpy(svc_rec.service_data32, service_data32, 4 * sizeof(ib_net32_t)); - memcpy(svc_rec.service_data64, service_data64, 2 * sizeof(ib_net64_t)); - - memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name)); - memcpy(svc_rec.service_name, service_name, - (strlen(service_name) + 1) * sizeof(char)); - - /* prepare the data used for this query */ - /* sa_mad_data.method = IB_MAD_METHOD_SET; */ - /* sa_mad_data.sm_key = 0; */ - - context.p_osmt = p_osmt; - req.query_context = &context; - req.query_type = OSMV_QUERY_USER_DEFINED; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.flags = OSM_SA_FLAGS_SYNC; - req.sm_key = 0; - req.timeout_ms = p_osmt->opt.transaction_timeout; - - user.method = IB_MAD_METHOD_SET; - user.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - if (ib_pkey_is_invalid(service_pkey)) { - /* if given an invalid service_pkey - don't turn the PKEY compmask on */ - user.comp_mask = IB_SR_COMPMASK_SID | - IB_SR_COMPMASK_SGID | - IB_SR_COMPMASK_SLEASE | - IB_SR_COMPMASK_SKEY | - IB_SR_COMPMASK_SNAME | - IB_SR_COMPMASK_SDATA8_0 | - IB_SR_COMPMASK_SDATA8_1 | - IB_SR_COMPMASK_SDATA16_0 | - IB_SR_COMPMASK_SDATA16_1 | - IB_SR_COMPMASK_SDATA32_0 | - IB_SR_COMPMASK_SDATA32_1 | - IB_SR_COMPMASK_SDATA64_0 | IB_SR_COMPMASK_SDATA64_1; - } else { - user.comp_mask = IB_SR_COMPMASK_SID | - IB_SR_COMPMASK_SGID | - IB_SR_COMPMASK_SPKEY | - IB_SR_COMPMASK_SLEASE | - IB_SR_COMPMASK_SKEY | - IB_SR_COMPMASK_SNAME | - IB_SR_COMPMASK_SDATA8_0 | - IB_SR_COMPMASK_SDATA8_1 | - IB_SR_COMPMASK_SDATA16_0 | - IB_SR_COMPMASK_SDATA16_1 | - IB_SR_COMPMASK_SDATA32_0 | - IB_SR_COMPMASK_SDATA32_1 | - IB_SR_COMPMASK_SDATA64_0 | IB_SR_COMPMASK_SDATA64_1; - } - user.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); - user.p_attr = &svc_rec; - - /* Dump to Service Data b4 send */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Dumping service data b4 send\n"); - osm_dump_service_record(&p_osmt->log, &svc_rec, OSM_LOG_VERBOSE); - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A05: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A06: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - } - goto Exit; - } - - /* Check data on context to see if match */ - p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Comparing service data...\n"); - if (memcmp(service_data8, p_rec->service_data8, 16 * sizeof(uint8_t)) != - 0 - || memcmp(service_data16, p_rec->service_data16, - 8 * sizeof(uint16_t)) != 0 - || memcmp(service_data32, p_rec->service_data32, - 4 * sizeof(uint32_t)) != 0 - || memcmp(service_data64, p_rec->service_data64, - 2 * sizeof(uint64_t)) != 0) { - status = IB_REMOTE_ERROR; - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Data mismatch in service_data8\n"); - goto Exit; - } - -Exit: - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -ib_api_status_t -osmt_get_service_by_id_and_name(IN osmtest_t * const p_osmt, - IN uint32_t rec_num, - IN ib_net64_t sid, - IN char *sr_name, - OUT ib_service_record_t * p_out_rec) -{ - - ib_api_status_t status = IB_SUCCESS; - osmtest_req_context_t context; - osmv_query_req_t req; - ib_service_record_t svc_rec, *p_rec; - uint32_t num_recs = 0; - osmv_user_query_t user; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting service record: id: 0x%016" PRIx64 - " and name: %s\n", cl_ntoh64(sid), sr_name); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - - context.p_osmt = p_osmt; - - /* prepare the data used for this query */ - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.sm_key = 0; - - memset(&svc_rec, 0, sizeof(svc_rec)); - memset(&user, 0, sizeof(user)); - /* set the new service record fields */ - memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name)); - memcpy(svc_rec.service_name, sr_name, - (strlen(sr_name) + 1) * sizeof(char)); - svc_rec.service_id = sid; - req.p_query_input = &user; - - user.method = IB_MAD_METHOD_GET; - user.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - user.comp_mask = IB_SR_COMPMASK_SID | IB_SR_COMPMASK_SNAME; - user.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); - user.p_attr = &svc_rec; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A07: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - num_recs = context.result.result_cnt; - - if (status != IB_SUCCESS) { - char mad_stat_err[256]; - - /* If the failure is due to IB_SA_MAD_STATUS_NO_RECORDS and rec_num is 0, - then this is fine */ - if (status == IB_REMOTE_ERROR) - strcpy(mad_stat_err, - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - else - strcpy(mad_stat_err, ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR && - !strcmp(mad_stat_err, "IB_SA_MAD_STATUS_NO_RECORDS") && - rec_num == 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "IS EXPECTED ERROR ^^^^\n"); - status = IB_SUCCESS; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A08: " - "Query failed: %s (%s)\n", - ib_get_err_str(status), mad_stat_err); - goto Exit; - } - } - - if (rec_num && num_recs != rec_num) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Unmatched number of records: expected: %d, received: %d\n", - rec_num, num_recs); - status = IB_REMOTE_ERROR; - goto Exit; - } - - p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0); - *p_out_rec = *p_rec; - - if (num_recs) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Found service record: name: %s id: 0x%016" PRIx64 "\n", - p_rec->service_name, cl_ntoh64(p_rec->service_id)); - - osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_DEBUG); - } - -Exit: - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Expected and found %d records\n", rec_num); - - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -ib_api_status_t -osmt_get_service_by_id(IN osmtest_t * const p_osmt, - IN uint32_t rec_num, - IN ib_net64_t sid, OUT ib_service_record_t * p_out_rec) -{ - - ib_api_status_t status = IB_SUCCESS; - osmtest_req_context_t context; - osmv_query_req_t req; - ib_service_record_t svc_rec, *p_rec; - uint32_t num_recs = 0; - osmv_user_query_t user; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting service record: id: 0x%016" PRIx64 "\n", - cl_ntoh64(sid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - - context.p_osmt = p_osmt; - - /* prepare the data used for this query */ - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.sm_key = 0; - - memset(&svc_rec, 0, sizeof(svc_rec)); - memset(&user, 0, sizeof(user)); - /* set the new service record fields */ - svc_rec.service_id = sid; - req.p_query_input = &user; - - user.method = IB_MAD_METHOD_GET; - user.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - user.comp_mask = IB_SR_COMPMASK_SID; - user.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); - user.p_attr = &svc_rec; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A09: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - num_recs = context.result.result_cnt; - - if (status != IB_SUCCESS) { - char mad_stat_err[256]; - - /* If the failure is due to IB_SA_MAD_STATUS_NO_RECORDS and rec_num is 0, - then this is fine */ - if (status == IB_REMOTE_ERROR) - strcpy(mad_stat_err, - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - else - strcpy(mad_stat_err, ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR && - !strcmp(mad_stat_err, "IB_SA_MAD_STATUS_NO_RECORDS") && - rec_num == 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "IS EXPECTED ERROR ^^^^\n"); - status = IB_SUCCESS; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0A: " - "Query failed: %s (%s)\n", - ib_get_err_str(status), mad_stat_err); - goto Exit; - } - } - - if (rec_num && num_recs != rec_num) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0B: " - "Unmatched number of records: expected: %d received: %d\n", - rec_num, num_recs); - status = IB_REMOTE_ERROR; - goto Exit; - } - - p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0); - *p_out_rec = *p_rec; - - if (num_recs) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Found service record: name: %s id: 0x%016" PRIx64 "\n", - p_rec->service_name, cl_ntoh64(p_rec->service_id)); - - osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_DEBUG); - } - -Exit: - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Expected and found %d records\n", rec_num); - - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -ib_api_status_t -osmt_get_service_by_name_and_key(IN osmtest_t * const p_osmt, - IN char *sr_name, - IN uint32_t rec_num, - IN uint8_t * skey, - OUT ib_service_record_t * p_out_rec) -{ - - ib_api_status_t status = IB_SUCCESS; - osmtest_req_context_t context; - osmv_query_req_t req; - ib_service_record_t svc_rec, *p_rec; - uint32_t num_recs = 0, i; - osmv_user_query_t user; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting service record: name: %s and key: " - "0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", - sr_name, skey[0], skey[1], skey[2], skey[3], skey[4], skey[5], - skey[6], skey[7], skey[8], skey[9], skey[10], skey[11], - skey[12], skey[13], skey[14], skey[15]); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - - context.p_osmt = p_osmt; - - /* prepare the data used for this query */ - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.sm_key = 0; - - memset(&svc_rec, 0, sizeof(svc_rec)); - memset(&user, 0, sizeof(user)); - /* set the new service record fields */ - memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name)); - memcpy(svc_rec.service_name, sr_name, - (strlen(sr_name) + 1) * sizeof(char)); - for (i = 0; i <= 15; i++) - svc_rec.service_key[i] = skey[i]; - - req.p_query_input = &user; - - user.method = IB_MAD_METHOD_GET; - user.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - user.comp_mask = IB_SR_COMPMASK_SNAME | IB_SR_COMPMASK_SKEY; - user.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); - user.p_attr = &svc_rec; - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0C: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - num_recs = context.result.result_cnt; - - if (status != IB_SUCCESS) { - char mad_stat_err[256]; - - /* If the failure is due to IB_SA_MAD_STATUS_NO_RECORDS and rec_num is 0, - then this is fine */ - if (status == IB_REMOTE_ERROR) - strcpy(mad_stat_err, - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - else - strcpy(mad_stat_err, ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR && - !strcmp(mad_stat_err, "IB_SA_MAD_STATUS_NO_RECORDS") && - rec_num == 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "IS EXPECTED ERROR ^^^^\n"); - status = IB_SUCCESS; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0D: " - "Query failed:%s (%s)\n", - ib_get_err_str(status), mad_stat_err); - goto Exit; - } - } - - if (rec_num && num_recs != rec_num) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Unmatched number of records: expected: %d, received: %d\n", - rec_num, num_recs); - status = IB_REMOTE_ERROR; - goto Exit; - } - - p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0); - *p_out_rec = *p_rec; - - if (num_recs) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Found service record: name: %s id: 0x%016" PRIx64 "\n", - sr_name, cl_ntoh64(p_rec->service_id)); - - osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_DEBUG); - } - -Exit: - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Expected and found %d records\n", rec_num); - - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -ib_api_status_t -osmt_get_service_by_name(IN osmtest_t * const p_osmt, - IN char *sr_name, - IN uint32_t rec_num, - OUT ib_service_record_t * p_out_rec) -{ - - ib_api_status_t status = IB_SUCCESS; - osmtest_req_context_t context; - osmv_query_req_t req; - ib_service_record_t *p_rec; - ib_svc_name_t service_name; - uint32_t num_recs = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting service record: name: %s\n", sr_name); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - - context.p_osmt = p_osmt; - - /* prepare the data used for this query */ - req.query_type = OSMV_QUERY_SVC_REC_BY_NAME; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.sm_key = 0; - - memset(service_name, 0, sizeof(service_name)); - memcpy(service_name, sr_name, (strlen(sr_name) + 1) * sizeof(char)); - req.p_query_input = service_name; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0E: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - num_recs = context.result.result_cnt; - - if (status != IB_SUCCESS) { - char mad_stat_err[256]; - - /* If the failure is due to IB_SA_MAD_STATUS_NO_RECORDS and rec_num is 0, - then this is fine */ - if (status == IB_REMOTE_ERROR) - strcpy(mad_stat_err, - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - else - strcpy(mad_stat_err, ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR && - !strcmp(mad_stat_err, "IB_SA_MAD_STATUS_NO_RECORDS") && - rec_num == 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "IS EXPECTED ERROR ^^^^\n"); - status = IB_SUCCESS; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0F: " - "Query failed: %s (%s)\n", - ib_get_err_str(status), mad_stat_err); - goto Exit; - } - } - - if (rec_num && num_recs != rec_num) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A10: " - "Unmatched number of records: expected: %d, received: %d\n", - rec_num, num_recs); - status = IB_REMOTE_ERROR; - goto Exit; - } - - p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0); - *p_out_rec = *p_rec; - - if (num_recs) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Found service record: name: %s id: 0x%016" PRIx64 "\n", - sr_name, cl_ntoh64(p_rec->service_id)); - - osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_DEBUG); - } - -Exit: - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Expected and found %d records\n", rec_num); - - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -#ifdef VENDOR_RMPP_SUPPORT -ib_api_status_t -osmt_get_all_services_and_check_names(IN osmtest_t * const p_osmt, - IN ib_svc_name_t * - const p_valid_service_names_arr, - IN uint8_t num_of_valid_names, - OUT uint32_t * num_services) -{ - ib_api_status_t status = IB_SUCCESS; - osmtest_req_context_t context; - osmv_query_req_t req; - ib_service_record_t *p_rec; - uint32_t num_recs = 0, i, j; - uint8_t *p_checked_names; - - OSM_LOG_ENTER(&p_osmt->log); - - /* Prepare tracker for the checked names */ - p_checked_names = - (uint8_t *) malloc(sizeof(uint8_t) * num_of_valid_names); - for (j = 0; j < num_of_valid_names; j++) { - p_checked_names[j] = 0; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Getting all service records\n"); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - - context.p_osmt = p_osmt; - - req.query_type = OSMV_QUERY_ALL_SVC_RECS; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A12: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - - if (status != IB_SUCCESS) { - if (status != IB_INVALID_PARAMETER) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A13: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - } - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - } - goto Exit; - } - - num_recs = context.result.result_cnt; - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Received %u records\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, i); - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Found service record: name: %s id: 0x%016" PRIx64 "\n", - p_rec->service_name, cl_ntoh64(p_rec->service_id)); - osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_VERBOSE); - for (j = 0; j < num_of_valid_names; j++) { - /* If the service names exist in the record, mark it as checked (1) */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "-I- Comparing source name : >%s<, with record name : >%s<, idx : %d\n", - p_valid_service_names_arr[j], - p_rec->service_name, p_checked_names[j]); - if (strcmp - ((char *)p_valid_service_names_arr[j], - (char *)p_rec->service_name) == 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "-I- The service %s is valid\n", - p_valid_service_names_arr[j]); - p_checked_names[j] = 1; - break; - } - } - } - /* Check that all service names have been identified */ - for (j = 0; j < num_of_valid_names; j++) - if (p_checked_names[j] == 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A14: " - "Missing valid service: name: %s\n", - p_valid_service_names_arr[j]); - status = IB_ERROR; - goto Exit; - } - *num_services = num_recs; - -Exit: - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return status; -} -#endif - -ib_api_status_t -osmt_delete_service_by_name(IN osmtest_t * const p_osmt, - IN uint8_t IsServiceExist, - IN char *sr_name, IN uint32_t rec_num) -{ - osmv_query_req_t req; - osmv_user_query_t user; - osmtest_req_context_t context; - ib_service_record_t svc_rec; - ib_api_status_t status; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Trying to Delete service name: %s\n", sr_name); - - memset(&svc_rec, 0, sizeof(svc_rec)); - - status = osmt_get_service_by_name(p_osmt, sr_name, rec_num, &svc_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A15: " - "Failed to get service: name: %s\n", sr_name); - goto ExitNoDel; - } - - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - memset(&user, 0, sizeof(user)); - - /* set the new service record fields */ - memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name)); - memcpy(svc_rec.service_name, sr_name, - (strlen(sr_name) + 1) * sizeof(char)); - - /* prepare the data used for this query */ - context.p_osmt = p_osmt; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.query_context = &context; - req.query_type = OSMV_QUERY_USER_DEFINED; /* basically a don't care here */ - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.flags = OSM_SA_FLAGS_SYNC; - req.sm_key = 0; - - user.method = IB_MAD_METHOD_DELETE; - user.attr_id = IB_MAD_ATTR_SERVICE_RECORD; - user.comp_mask = IB_SR_COMPMASK_SNAME; - user.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); - user.p_attr = &svc_rec; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A16: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - if (IsServiceExist) { - /* If IsServiceExist = 1 then we should succeed here */ - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A17: " - "ib_query failed (%s)\n", - ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 4A18: Remote error = %s\n", - ib_get_mad_status_str - (osm_madw_get_mad_ptr - (context.result.p_result_madw))); - } - } - } else { - /* If IsServiceExist = 0 then we should fail here */ - if (status == IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A19: " - "Succeeded to delete service: %s which " - "shouldn't exist", sr_name); - status = IB_ERROR; - } else { - /* The deletion should have failed, since the service_name - shouldn't exist. */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "IS EXPECTED ERROR ^^^^\n"); - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Failed to delete service_name: %s\n", sr_name); - status = IB_SUCCESS; - } - } - -Exit: - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - -ExitNoDel: - OSM_LOG_EXIT(&p_osmt->log); - return status; -} - -/* - * Run a complete service records flow: - * - register a service - * - register a service (with a lease period) - * - get a service by name - * - get all services / must be 2 - * - delete a service - * - get all services / must be 1 - * - wait for the lease to expire - * - get all services / must be 0 - * - get / set service by data - */ -ib_api_status_t osmt_run_service_records_flow(IN osmtest_t * const p_osmt) -{ - ib_service_record_t srv_rec; - ib_api_status_t status; - uint8_t instance, i; - uint8_t service_data8[16], service_key[16]; - ib_net16_t service_data16[8]; - ib_net32_t service_data32[4]; - ib_net64_t service_data64[2]; - uint64_t pid = getpid(); - uint64_t id[7]; - /* We use up to seven service names - we use the extra for bad flow */ - ib_svc_name_t service_name[7]; -#ifdef VENDOR_RMPP_SUPPORT - /* This array contain only the valid names after registering vs SM */ - ib_svc_name_t service_valid_names[3]; - uint32_t num_recs = 0; -#endif - - OSM_LOG_ENTER(&p_osmt->log); - - /* Init Service names */ - for (i = 0; i < 7; i++) { -#ifdef __WIN__ - uint64_t rand_val = rand() - (uint64_t) i; -#else - uint64_t rand_val = random() - (uint64_t) i; -#endif - id[i] = abs((int)(pid - rand_val)); - /* Just to be unique any place on any host */ - sprintf((char *)(service_name[i]), - "osmt.srvc.%" PRIu64 ".%" PRIu64, rand_val, pid); - /*printf("-I- Service Name is : %s, ID is : 0x%" PRIx64 "\n",service_name[i],id[i]); */ - } - - status = osmt_register_service(p_osmt, cl_ntoh64(id[0]), /* IN ib_net64_t service_id, */ - IB_DEFAULT_PKEY, /* IN ib_net16_t service_pkey, */ - 0xFFFFFFFF, /* IN ib_net32_t service_lease, */ - 11, /* IN uint8_t service_key_lsb, */ - (char *)service_name[0] /* IN char *service_name */ - ); - if (status != IB_SUCCESS) { - goto Exit; - } - - status = osmt_register_service(p_osmt, cl_ntoh64(id[1]), /* IN ib_net64_t service_id, */ - IB_DEFAULT_PKEY, /* IN ib_net16_t service_pkey, */ - cl_hton32(0x00000004), /* IN ib_net32_t service_lease, */ - 11, /* IN uint8_t service_key_lsb, */ - (char *)service_name[1] /* IN char *service_name */ - ); - if (status != IB_SUCCESS) { - goto Exit; - } - - status = osmt_register_service(p_osmt, cl_ntoh64(id[2]), /* IN ib_net64_t service_id, */ - 0, /* IN ib_net16_t service_pkey, */ - 0xFFFFFFFF, /* IN ib_net32_t service_lease, */ - 11, /* Remove Service Record IN uint8_t service_key_lsb, */ - (char *)service_name[2] /* IN char *service_name */ - ); - - if (status != IB_SUCCESS) { - goto Exit; - } - - /* Generate 2 instances of service record with consecutive data */ - for (instance = 0; instance < 2; instance++) { - /* First, clear all arrays */ - memset(service_data8, 0, 16 * sizeof(uint8_t)); - memset(service_data16, 0, 8 * sizeof(uint16_t)); - memset(service_data32, 0, 4 * sizeof(uint32_t)); - memset(service_data64, 0, 2 * sizeof(uint64_t)); - service_data8[instance] = instance + 1; - service_data16[instance] = cl_hton16(instance + 2); - service_data32[instance] = cl_hton32(instance + 3); - service_data64[instance] = cl_hton64(instance + 4); - status = osmt_register_service_with_data(p_osmt, cl_ntoh64(id[3]), /* IN ib_net64_t service_id, */ - IB_DEFAULT_PKEY, /* IN ib_net16_t service_pkey, */ - cl_ntoh32(10), /* IN ib_net32_t service_lease, */ - 12, /* IN uint8_t service_key_lsb, */ - service_data8, service_data16, service_data32, service_data64, /* service data structures */ - (char *)service_name[3] /* IN char *service_name */ - ); - - if (status != IB_SUCCESS) { - goto Exit; - } - - } - - /* Trying to create service with zero key */ - memset(service_key, 0, 16 * sizeof(uint8_t)); - status = osmt_register_service_with_full_key(p_osmt, cl_ntoh64(id[5]), /* IN ib_net64_t service_id, */ - 0, /* IN ib_net16_t service_pkey, */ - 0xFFFFFFFF, /* IN ib_net32_t service_lease, */ - service_key, /* full service_key, */ - (char *)service_name[5] /* IN char *service_name */ - ); - - if (status != IB_SUCCESS) { - goto Exit; - } - - /* Now update it with Unique key and different service name */ - for (i = 0; i <= 15; i++) { - service_key[i] = i + 1; - } - status = osmt_register_service_with_full_key(p_osmt, cl_ntoh64(id[5]), /* IN ib_net64_t service_id, */ - 0, /* IN ib_net16_t service_pkey, */ - 0xFFFFFFFF, /* IN ib_net32_t service_lease, */ - service_key, /* full service_key, */ - (char *)service_name[6] /* IN char *service_name */ - ); - if (status != IB_SUCCESS) { - goto Exit; - } - - /* Let OpenSM handle it */ - usleep(100); - - /* Make sure service_name[0] exists */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[0], 1, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1A: " - "Fail to find service: name: %s\n", - (char *)service_name[0]); - status = IB_ERROR; - goto Exit; - } - - /* Make sure service_name[1] exists */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[1], 1, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1B: " - "Fail to find service: name: %s\n", - (char *)service_name[1]); - status = IB_ERROR; - goto Exit; - } - - /* Make sure service_name[2] exists */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[2], 1, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1C: " - "Fail to find service: name: %s\n", - (char *)service_name[2]); - status = IB_ERROR; - goto Exit; - } - - /* Make sure service_name[3] exists. */ - /* After 10 seconds the service should not exist: service_lease = 10 */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[3], 1, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1D: " - "Fail to find service: name: %s\n", - (char *)service_name[3]); - status = IB_ERROR; - goto Exit; - } - - sleep(10); - - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[3], 0, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1E: " - "Found service: name: %s that should have been " - "deleted due to service lease expiring\n", - (char *)service_name[3]); - status = IB_ERROR; - goto Exit; - } - - /* Check that for service: id[5] only one record exists */ - status = osmt_get_service_by_id(p_osmt, 1, cl_ntoh64(id[5]), &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1F: " - "Found number of records != 1 for " - "service: id: 0x%016" PRIx64 "\n", id[5]); - status = IB_ERROR; - goto Exit; - } - - /* Bad Flow of Get with invalid Service ID: id[6] */ - status = osmt_get_service_by_id(p_osmt, 0, cl_ntoh64(id[6]), &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A20: " - "Found service: id: 0x%016" PRIx64 " " - "that is invalid\n", id[6]); - status = IB_ERROR; - goto Exit; - } - - /* Check by both id and service name: id[0], service_name[0] */ - status = osmt_get_service_by_id_and_name(p_osmt, 1, cl_ntoh64(id[0]), - (char *)service_name[0], - &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A21: " - "Fail to find service: id: 0x%016" PRIx64 " " - "name: %s\n", id[0], (char *)service_name[0]); - status = IB_ERROR; - goto Exit; - } - - /* Check by both id and service name: id[5], service_name[6] */ - status = osmt_get_service_by_id_and_name(p_osmt, 1, cl_ntoh64(id[5]), - (char *)service_name[6], - &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A22: " - "Fail to find service: id: 0x%016" PRIx64 " " - "name: %s\n", id[5], (char *)service_name[6]); - status = IB_ERROR; - goto Exit; - } - - /* Bad Flow of Get with invalid name(service_name[3]) and valid ID(id[0]) */ - status = osmt_get_service_by_id_and_name(p_osmt, 0, cl_ntoh64(id[0]), - (char *)service_name[3], - &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A23: " - "Found service: id: 0x%016" PRIx64 - "name: %s which is an invalid service\n", - id[0], (char *)service_name[3]); - status = IB_ERROR; - goto Exit; - } - - /* Bad Flow of Get with unmatched name(service_name[5]) and id(id[3]) (both valid) */ - status = osmt_get_service_by_id_and_name(p_osmt, 0, cl_ntoh64(id[3]), - (char *)service_name[5], - &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A24: " - "Found service: id: 0x%016" PRIx64 - "name: %s which is an invalid service\n", - id[3], (char *)service_name[5]); - status = IB_ERROR; - goto Exit; - } - - /* Bad Flow of Get with service name that doesn't exist (service_name[4]) */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[4], 0, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A25: " - "Found service: name: %s that shouldn't exist\n", - (char *)service_name[4]); - status = IB_ERROR; - goto Exit; - } - - /* Bad Flow : Check that getting service_name[5] brings no records since another service - has been updated with the same ID (service_name[6] */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[5], 0, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A26: " - "Found service: name: %s which is an " - "invalid service\n", (char *)service_name[5]); - status = IB_ERROR; - goto Exit; - } - - /* Check that getting service_name[6] by name ONLY is valid, - since we do not support key&name association, also trusted queries */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[6], 1, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A27: " - "Fail to find service: name: %s\n", - (char *)service_name[6]); - status = IB_ERROR; - goto Exit; - } - - /* Test Service Key */ - memset(service_key, 0, 16 * sizeof(uint8_t)); - - /* Check for service_name[5] with service_key=0 - the service shouldn't - exist with this name. */ - status = osmt_get_service_by_name_and_key(p_osmt, - (char *)service_name[5], - 0, service_key, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A28: " - "Found service: name: %s key:0 which is an " - "invalid service (wrong name)\n", - (char *)service_name[5]); - status = IB_ERROR; - goto Exit; - } - - /* Check for service_name[6] with service_key=0 - the service should - exist with different key. */ - status = osmt_get_service_by_name_and_key(p_osmt, - (char *)service_name[6], - 0, service_key, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A29: " - "Found service: name: %s key: 0 which is an " - "invalid service (wrong service_key)\n", - (char *)service_name[6]); - status = IB_ERROR; - goto Exit; - } - - /* check for service_name[6] with the correct service_key */ - for (i = 0; i <= 15; i++) - service_key[i] = i + 1; - status = osmt_get_service_by_name_and_key(p_osmt, - (char *)service_name[6], - 1, service_key, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2A: " - "Fail to find service: name: %s with " - "correct service key\n", (char *)service_name[6]); - status = IB_ERROR; - goto Exit; - } -#ifdef VENDOR_RMPP_SUPPORT - /* These ar the only service_names which are valid */ - memcpy(&service_valid_names[0], &service_name[0], sizeof(uint8_t) * 64); - memcpy(&service_valid_names[1], &service_name[2], sizeof(uint8_t) * 64); - memcpy(&service_valid_names[2], &service_name[6], sizeof(uint8_t) * 64); - - status = - osmt_get_all_services_and_check_names(p_osmt, service_valid_names, - 3, &num_recs); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2B: " - "Fail to find all services that should exist\n"); - status = IB_ERROR; - goto Exit; - } -#endif - - /* Delete service_name[0] */ - status = osmt_delete_service_by_name(p_osmt, 1, - (char *)service_name[0], 1); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2C: " - "Fail to delete service: name: %s\n", - (char *)service_name[0]); - status = IB_ERROR; - goto Exit; - } - - /* Make sure deletion of service_name[0] succeeded */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[0], 0, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2D: " - "Found service: name: %s that was deleted\n", - (char *)service_name[0]); - status = IB_ERROR; - goto Exit; - } - - /* Make sure service_name[1] doesn't exist (expired service lease) */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[1], 0, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2E: " - "Found service: name: %s that should have expired\n", - (char *)service_name[1]); - status = IB_ERROR; - goto Exit; - } - - /* Make sure service_name[2] exists */ - status = osmt_get_service_by_name(p_osmt, - (char *)service_name[2], 1, &srv_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2F: " - "Fail to find service: name: %s\n", - (char *)service_name[2]); - status = IB_ERROR; - goto Exit; - } - - /* Bad Flow - try to delete non-existent service_name[5] */ - status = osmt_delete_service_by_name(p_osmt, 0, - (char *)service_name[5], 0); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A30: " - "Succeed to delete non-existent service: name: %s\n", - (char *)service_name[5]); - status = IB_ERROR; - goto Exit; - } - - /* Delete service_name[2] */ - status = osmt_delete_service_by_name(p_osmt, 1, - (char *)service_name[2], 1); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A31: " - "Fail to delete service: name: %s\n", - (char *)service_name[2]); - status = IB_ERROR; - goto Exit; - } - - /* Delete service_name[6] */ - status = osmt_delete_service_by_name(p_osmt, 1, - (char *)service_name[6], 1); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A32: " - "Failed to delete service name: %s\n", - (char *)service_name[6]); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return status; -} diff --git a/branches/opensm_3/user/osmtest/osmt_slvl_vl_arb.c b/branches/opensm_3/user/osmtest/osmt_slvl_vl_arb.c deleted file mode 100644 index e82e7d8d..00000000 --- a/branches/opensm_3/user/osmtest/osmt_slvl_vl_arb.c +++ /dev/null @@ -1,526 +0,0 @@ -/* - * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* - * Abstract: - * Implementation of SLtoVL and VL Arbitration testing flow.. - * Top level is osmt_run_slvl_and_vlarb_records_flow: - * osmt_query_all_ports_vl_arb - * osmt_query_all_ports_slvl_map - * - */ - -#ifndef __WIN__ -#include -#endif -#include -#include -#include -#include -#include "osmtest.h" - -static ib_api_status_t -osmtest_write_vl_arb_table(IN osmtest_t * const p_osmt, - IN FILE * fh, - IN const ib_vl_arb_table_record_t * const p_rec) -{ - int result, i; - cl_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - result = fprintf(fh, - "VL_ARBITRATION_TABLE\n" - "lid 0x%X\n" - "port_num 0x%X\n" - "block 0x%X\n", - cl_ntoh16(p_rec->lid), - p_rec->port_num, p_rec->block_num); - - fprintf(fh, " "); - for (i = 0; i < 32; i++) - fprintf(fh, "| %-2u ", i); - fprintf(fh, "|\nVL: "); - - for (i = 0; i < 32; i++) - fprintf(fh, "|0x%02X", p_rec->vl_arb_tbl.vl_entry[i].vl); - fprintf(fh, "|\nWEIGHT:"); - - for (i = 0; i < 32; i++) - fprintf(fh, "|0x%02X", p_rec->vl_arb_tbl.vl_entry[i].weight); - fprintf(fh, "|\nEND\n\n"); - - /* Exit: */ - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * GET A SINGLE PORT INFO BY NODE LID AND PORT NUMBER - **********************************************************************/ -ib_api_status_t -osmt_query_vl_arb(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN uint8_t const port_num, - IN uint8_t const block_num, IN FILE * fh) -{ - osmtest_req_context_t context; - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_vl_arb_table_record_t record, *p_rec; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Getting VL_Arbitration Table for port with LID 0x%X Num:0x%X\n", - cl_ntoh16(lid), port_num); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&context, 0, sizeof(context)); - - context.p_osmt = p_osmt; - - record.lid = lid; - record.port_num = port_num; - record.block_num = block_num; - user.p_attr = &record; - - req.query_type = OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0405: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0466: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - } - goto Exit; - } - - /* ok it worked */ - p_rec = osmv_get_query_result(context.result.p_result_madw, 0); - if (fh) { - osmtest_write_vl_arb_table(p_osmt, fh, p_rec); - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmt_query_all_ports_vl_arb(IN osmtest_t * const p_osmt, IN FILE * fh) -{ - cl_status_t status = CL_SUCCESS; - cl_qmap_t *p_tbl; - port_t *p_src_port; - uint8_t block, anyErr = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Obtaining ALL Ports VL Arbitration Tables\n"); - - /* - * Go over all ports that exist in the subnet - * get the relevant VLarbs - */ - - p_tbl = &p_osmt->exp_subn.port_key_tbl; - - p_src_port = (port_t *) cl_qmap_head(p_tbl); - - while (p_src_port != (port_t *) cl_qmap_end(p_tbl)) { - - /* HACK we use capability_mask to know diff a CA port from switch port */ - if (p_src_port->rec.port_info.capability_mask) { - /* this is an hca port */ - for (block = 1; block <= 4; block++) { - /* NOTE to comply we must set port number to 0 and the SA should figure it out */ - /* since it is a CA port */ - status = - osmt_query_vl_arb(p_osmt, - p_src_port->rec.lid, 0, - block, fh); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0467: " - "Failed to get Lid:0x%X Port:0x%X (%s)\n", - cl_ntoh16(p_src_port->rec.lid), - 0, ib_get_err_str(status)); - anyErr = 1; - } - } - } else { - /* this is a switch port */ - for (block = 1; block <= 4; block++) { - status = - osmt_query_vl_arb(p_osmt, - p_src_port->rec.lid, - p_src_port->rec.port_num, - block, fh); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0468: " - "Failed to get Lid:0x%X Port:0x%X (%s)\n", - cl_ntoh16(p_src_port->rec.lid), - p_src_port->rec.port_num, - ib_get_err_str(status)); - anyErr = 1; - } - } - } - - p_src_port = (port_t *) cl_qmap_next(&p_src_port->map_item); - } - - OSM_LOG_EXIT(&p_osmt->log); - if (anyErr) { - status = IB_ERROR; - } - return (status); -} - -/******************************************************************************* - SLtoVL -*******************************************************************************/ -static ib_api_status_t -osmtest_write_slvl_map_table(IN osmtest_t * const p_osmt, - IN FILE * fh, - IN const ib_slvl_table_record_t * const p_rec) -{ - int result, i; - cl_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - result = fprintf(fh, - "SLtoVL_MAP_TABLE\n" - "lid 0x%X\n" - "in_port_num 0x%X\n" - "out_port_num 0x%X\n", - cl_ntoh16(p_rec->lid), - p_rec->in_port_num, p_rec->out_port_num); - - fprintf(fh, "SL:"); - for (i = 0; i < 16; i++) - fprintf(fh, "| %-2u ", i); - fprintf(fh, "|\nVL:"); - - for (i = 0; i < 16; i++) - fprintf(fh, "| 0x%01X ", - ib_slvl_table_get(&p_rec->slvl_tbl, (uint8_t) i)); - fprintf(fh, "|\nEND\n\n"); - - /* Exit: */ - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * GET A SINGLE PORT INFO BY NODE LID AND PORT NUMBER - **********************************************************************/ -ib_api_status_t -osmt_query_slvl_map(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN uint8_t const out_port_num, - IN uint8_t const in_port_num, IN FILE * fh) -{ - osmtest_req_context_t context; - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_slvl_table_record_t record, *p_rec; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Getting SLtoVL Map Table for out-port with LID 0x%X Num:0x%X from In-Port:0x%X\n", - cl_ntoh16(lid), out_port_num, in_port_num); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&context, 0, sizeof(context)); - - context.p_osmt = p_osmt; - - record.lid = lid; - record.in_port_num = in_port_num; - record.out_port_num = out_port_num; - user.p_attr = &record; - - req.query_type = OSMV_QUERY_SLVL_BY_LID_AND_PORTS; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0469: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0470: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - } - goto Exit; - } - - /* ok it worked */ - p_rec = osmv_get_query_result(context.result.p_result_madw, 0); - if (fh) { - osmtest_write_slvl_map_table(p_osmt, fh, p_rec); - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmt_query_all_ports_slvl_map(IN osmtest_t * const p_osmt, IN FILE * fh) -{ - cl_status_t status = CL_SUCCESS; - cl_qmap_t *p_tbl; - port_t *p_src_port; - uint8_t in_port, anyErr = 0, num_ports; - node_t *p_node; - const cl_qmap_t *p_node_tbl; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Go over all ports that exist in the subnet - * get the relevant SLtoVLs - */ - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Obtaining ALL Ports (to other ports) SLtoVL Maps\n"); - - p_tbl = &p_osmt->exp_subn.port_key_tbl; - p_node_tbl = &p_osmt->exp_subn.node_lid_tbl; - - p_src_port = (port_t *) cl_qmap_head(p_tbl); - - while (p_src_port != (port_t *) cl_qmap_end(p_tbl)) { - - /* HACK we use capability_mask to know diff a CA port from switch port */ - if (p_src_port->rec.port_info.capability_mask) { - /* this is an hca port */ - /* NOTE to comply we must set port number to 0 and the SA should figure it out */ - /* since it is a CA port */ - status = - osmt_query_slvl_map(p_osmt, p_src_port->rec.lid, 0, - 0, fh); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0471: " - "Failed to get Lid:0x%X In-Port:0x%X Out-Port:0x%X(%s)\n", - cl_ntoh16(p_src_port->rec.lid), 0, 0, - ib_get_err_str(status)); - anyErr = 1; - } - } else { - /* this is a switch port */ - /* get the node */ - p_node = - (node_t *) cl_qmap_get(p_node_tbl, - p_src_port->rec.lid); - if (p_node == (node_t *) cl_qmap_end(p_node_tbl)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0472: " - "Failed to get Node by Lid:0x%X\n", - p_src_port->rec.lid); - goto Exit; - } - - num_ports = p_node->rec.node_info.num_ports; - - for (in_port = 1; in_port <= num_ports; in_port++) { - status = - osmt_query_slvl_map(p_osmt, - p_src_port->rec.lid, - p_src_port->rec. - port_num, in_port, fh); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0473: " - "Failed to get Lid:0x%X In-Port:0x%X Out-Port:0x%X (%s)\n", - cl_ntoh16(p_src_port->rec.lid), - p_src_port->rec.port_num, - in_port, - ib_get_err_str(status)); - anyErr = 1; - } - } - } - - p_src_port = (port_t *) cl_qmap_next(&p_src_port->map_item); - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - if (anyErr) { - status = IB_ERROR; - } - return (status); -} - -/* - * Run a vl arbitration queries and sl2vl maps queries flow: - * Good flow: - * - for each physical port on the network - obtain the VL Arb - * - for each CA physical port obtain its SLtoVL Map - * - for each SW physical port (out) obtain the SLtoVL Map to each other port - * BAD flow: - * - Try get with multiple results - * - Try gettable - * - Try providing non existing port - */ -ib_api_status_t -osmt_run_slvl_and_vlarb_records_flow(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status; - FILE *fh; - ib_net16_t test_lid; - uint8_t lmc; - - OSM_LOG_ENTER(&p_osmt->log); - - fh = fopen("qos.txt", "w"); - - /* go over all ports in the subnet */ - status = osmt_query_all_ports_vl_arb(p_osmt, fh); - if (status != IB_SUCCESS) { - goto Exit; - } - - status = osmt_query_all_ports_slvl_map(p_osmt, fh); - if (status != IB_SUCCESS) { - goto Exit; - } - - /* If LMC > 0, test non base LID SA QoS Record requests */ - status = - osmtest_get_local_port_lmc(p_osmt, p_osmt->local_port.lid, &lmc); - if (status != IB_SUCCESS) - goto Exit; - - if (lmc != 0) { - test_lid = cl_ntoh16(p_osmt->local_port.lid + 1); - - status = osmt_query_vl_arb(p_osmt, test_lid, 0, 1, NULL); - if (status != IB_SUCCESS) - goto Exit; - - status = osmt_query_slvl_map(p_osmt, test_lid, 0, 0, NULL); - if (status != IB_SUCCESS) - goto Exit; - } - -Exit: - fclose(fh); - OSM_LOG_EXIT(&p_osmt->log); - return status; -} diff --git a/branches/opensm_3/user/osmtest/osmtest.c b/branches/opensm_3/user/osmtest/osmtest.c deleted file mode 100644 index 4c03370c..00000000 --- a/branches/opensm_3/user/osmtest/osmtest.c +++ /dev/null @@ -1,7410 +0,0 @@ -/* - * Copyright (c) 2006-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. - * Copyright (c) 2009 HNR Consulting. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -/* TODO : Check why we dont free the cl_qmap_items we store when reading DB */ - -/* - * Abstract: - * Implementation of osmtest_t. - * This object represents the OSMTest Test object. - * - */ - -#include -#include -#include -#include -#include -#include "osmtest.h" - -#define POOL_MIN_ITEMS 64 -#define MAX_LOCAL_IBPORTS 64 - -typedef struct _osmtest_sm_info_rec { - ib_net64_t sm_guid; - ib_net16_t lid; - uint8_t priority; - uint8_t sm_state; -} osmtest_sm_info_rec_t; - -typedef struct _osmtest_inform_info { - boolean_t subscribe; - ib_net32_t qpn; - ib_net16_t trap; -} osmtest_inform_info_t; - -typedef struct _osmtest_inform_info_rec { - ib_gid_t subscriber_gid; - ib_net16_t subscriber_enum; -} osmtest_inform_info_rec_t; - -typedef enum _osmtest_token_val { - OSMTEST_TOKEN_COMMENT = 0, - OSMTEST_TOKEN_END, - OSMTEST_TOKEN_DEFINE_NODE, - OSMTEST_TOKEN_DEFINE_PORT, - OSMTEST_TOKEN_DEFINE_PATH, - OSMTEST_TOKEN_DEFINE_LINK, - OSMTEST_TOKEN_LID, - OSMTEST_TOKEN_BASE_VERSION, - OSMTEST_TOKEN_CLASS_VERSION, - OSMTEST_TOKEN_NODE_TYPE, - OSMTEST_TOKEN_NUM_PORTS, - OSMTEST_TOKEN_SYS_GUID, - OSMTEST_TOKEN_NODE_GUID, - OSMTEST_TOKEN_PORT_GUID, - OSMTEST_TOKEN_PARTITION_CAP, - OSMTEST_TOKEN_DEVICE_ID, - OSMTEST_TOKEN_REVISION, - OSMTEST_TOKEN_PORT_NUM, - OSMTEST_TOKEN_VENDOR_ID, - OSMTEST_TOKEN_DGID, - OSMTEST_TOKEN_SGID, - OSMTEST_TOKEN_DLID, - OSMTEST_TOKEN_SLID, - OSMTEST_TOKEN_HOP_FLOW_RAW, - OSMTEST_TOKEN_TCLASS, - OSMTEST_TOKEN_NUM_PATH, - OSMTEST_TOKEN_PKEY, - OSMTEST_TOKEN_SL, - OSMTEST_TOKEN_RATE, - OSMTEST_TOKEN_PKT_LIFE, - OSMTEST_TOKEN_PREFERENCE, - OSMTEST_TOKEN_MKEY, - OSMTEST_TOKEN_SUBN_PREF, - OSMTEST_TOKEN_BASE_LID, - OSMTEST_TOKEN_SM_BASE_LID, - OSMTEST_TOKEN_CAP_MASK, - OSMTEST_TOKEN_DIAG_CODE, - OSMTEST_TOKEN_MKEY_LEASE_PER, - OSMTEST_TOKEN_LOC_PORT_NUM, - OSMTEST_TOKEN_LINK_WID_EN, - OSMTEST_TOKEN_LINK_WID_SUP, - OSMTEST_TOKEN_LINK_WID_ACT, - OSMTEST_TOKEN_LINK_SPEED_SUP, - OSMTEST_TOKEN_PORT_STATE, - OSMTEST_TOKEN_STATE_INFO2, - OSMTEST_TOKEN_MKEY_PROT_BITS, - OSMTEST_TOKEN_LMC, - OSMTEST_TOKEN_LINK_SPEED, - OSMTEST_TOKEN_MTU_SMSL, - OSMTEST_TOKEN_VL_CAP, - OSMTEST_TOKEN_VL_HIGH_LIMIT, - OSMTEST_TOKEN_VL_ARB_HIGH_CAP, - OSMTEST_TOKEN_VL_ARB_LOW_CAP, - OSMTEST_TOKEN_MTU_CAP, - OSMTEST_TOKEN_VL_STALL_LIFE, - OSMTEST_TOKEN_VL_ENFORCE, - OSMTEST_TOKEN_MKEY_VIOL, - OSMTEST_TOKEN_PKEY_VIOL, - OSMTEST_TOKEN_QKEY_VIOL, - OSMTEST_TOKEN_GUID_CAP, - OSMTEST_TOKEN_SUBN_TIMEOUT, - OSMTEST_TOKEN_RESP_TIME_VAL, - OSMTEST_TOKEN_ERR_THRESHOLD, - OSMTEST_TOKEN_MTU, - OSMTEST_TOKEN_FROMLID, - OSMTEST_TOKEN_FROMPORTNUM, - OSMTEST_TOKEN_TOPORTNUM, - OSMTEST_TOKEN_TOLID, - OSMTEST_TOKEN_UNKNOWN -} osmtest_token_val_t; - -typedef struct _osmtest_token { - osmtest_token_val_t val; - size_t str_size; - const char *str; -} osmtest_token_t; - -const osmtest_token_t token_array[] = { - {OSMTEST_TOKEN_COMMENT, 1, "#"}, - {OSMTEST_TOKEN_END, 3, "END"}, - {OSMTEST_TOKEN_DEFINE_NODE, 11, "DEFINE_NODE"}, - {OSMTEST_TOKEN_DEFINE_PORT, 11, "DEFINE_PORT"}, - {OSMTEST_TOKEN_DEFINE_PATH, 11, "DEFINE_PATH"}, - {OSMTEST_TOKEN_DEFINE_LINK, 11, "DEFINE_LINK"}, - {OSMTEST_TOKEN_LID, 3, "LID"}, - {OSMTEST_TOKEN_BASE_VERSION, 12, "BASE_VERSION"}, - {OSMTEST_TOKEN_CLASS_VERSION, 13, "CLASS_VERSION"}, - {OSMTEST_TOKEN_NODE_TYPE, 9, "NODE_TYPE"}, - {OSMTEST_TOKEN_NUM_PORTS, 9, "NUM_PORTS"}, - {OSMTEST_TOKEN_SYS_GUID, 8, "SYS_GUID"}, - {OSMTEST_TOKEN_NODE_GUID, 9, "NODE_GUID"}, - {OSMTEST_TOKEN_PORT_GUID, 9, "PORT_GUID"}, - {OSMTEST_TOKEN_PARTITION_CAP, 13, "PARTITION_CAP"}, - {OSMTEST_TOKEN_DEVICE_ID, 9, "DEVICE_ID"}, - {OSMTEST_TOKEN_REVISION, 8, "REVISION"}, - {OSMTEST_TOKEN_PORT_NUM, 8, "PORT_NUM"}, - {OSMTEST_TOKEN_VENDOR_ID, 9, "VENDOR_ID"}, - {OSMTEST_TOKEN_DGID, 4, "DGID"}, - {OSMTEST_TOKEN_SGID, 4, "SGID"}, - {OSMTEST_TOKEN_DLID, 4, "DLID"}, - {OSMTEST_TOKEN_SLID, 4, "SLID"}, - {OSMTEST_TOKEN_HOP_FLOW_RAW, 12, "HOP_FLOW_RAW"}, - {OSMTEST_TOKEN_TCLASS, 6, "TCLASS"}, - {OSMTEST_TOKEN_NUM_PATH, 8, "NUM_PATH"}, - {OSMTEST_TOKEN_PKEY, 4, "PKEY"}, - {OSMTEST_TOKEN_SL, 2, "SL"}, - {OSMTEST_TOKEN_RATE, 4, "RATE"}, - {OSMTEST_TOKEN_PKT_LIFE, 8, "PKT_LIFE"}, - {OSMTEST_TOKEN_PREFERENCE, 10, "PREFERENCE"}, - {OSMTEST_TOKEN_MKEY, 4, "M_KEY"}, - {OSMTEST_TOKEN_SUBN_PREF, 13, "SUBNET_PREFIX"}, - {OSMTEST_TOKEN_BASE_LID, 8, "BASE_LID"}, - {OSMTEST_TOKEN_SM_BASE_LID, 18, "MASTER_SM_BASE_LID"}, - {OSMTEST_TOKEN_CAP_MASK, 15, "CAPABILITY_MASK"}, - {OSMTEST_TOKEN_DIAG_CODE, 9, "DIAG_CODE"}, - {OSMTEST_TOKEN_MKEY_LEASE_PER, 18, "m_key_lease_period"}, - {OSMTEST_TOKEN_LOC_PORT_NUM, 14, "local_port_num"}, - {OSMTEST_TOKEN_LINK_WID_EN, 18, "link_width_enabled"}, - {OSMTEST_TOKEN_LINK_WID_SUP, 20, "link_width_supported"}, - {OSMTEST_TOKEN_LINK_WID_ACT, 17, "link_width_active"}, - {OSMTEST_TOKEN_LINK_SPEED_SUP, 20, "link_speed_supported"}, - {OSMTEST_TOKEN_PORT_STATE, 10, "port_state"}, - {OSMTEST_TOKEN_STATE_INFO2, 10, "state_info2"}, - {OSMTEST_TOKEN_MKEY_PROT_BITS, 3, "mpb"}, - {OSMTEST_TOKEN_LMC, 3, "lmc"}, - {OSMTEST_TOKEN_LINK_SPEED, 10, "link_speed"}, - {OSMTEST_TOKEN_MTU_SMSL, 8, "mtu_smsl"}, - {OSMTEST_TOKEN_VL_CAP, 6, "vl_cap"}, - {OSMTEST_TOKEN_VL_HIGH_LIMIT, 13, "vl_high_limit"}, - {OSMTEST_TOKEN_VL_ARB_HIGH_CAP, 15, "vl_arb_high_cap"}, - {OSMTEST_TOKEN_VL_ARB_LOW_CAP, 14, "vl_arb_low_cap"}, - {OSMTEST_TOKEN_MTU_CAP, 7, "mtu_cap"}, - {OSMTEST_TOKEN_VL_STALL_LIFE, 13, "vl_stall_life"}, - {OSMTEST_TOKEN_VL_ENFORCE, 10, "vl_enforce"}, - {OSMTEST_TOKEN_MKEY_VIOL, 16, "m_key_violations"}, - {OSMTEST_TOKEN_PKEY_VIOL, 16, "p_key_violations"}, - {OSMTEST_TOKEN_QKEY_VIOL, 16, "q_key_violations"}, - {OSMTEST_TOKEN_GUID_CAP, 8, "guid_cap"}, - {OSMTEST_TOKEN_SUBN_TIMEOUT, 14, "subnet_timeout"}, - {OSMTEST_TOKEN_RESP_TIME_VAL, 15, "resp_time_value"}, - {OSMTEST_TOKEN_ERR_THRESHOLD, 15, "error_threshold"}, - {OSMTEST_TOKEN_MTU, 3, "MTU"}, /* must be after the other mtu... tokens. */ - {OSMTEST_TOKEN_FROMLID, 8, "from_lid"}, - {OSMTEST_TOKEN_FROMPORTNUM, 13, "from_port_num"}, - {OSMTEST_TOKEN_TOPORTNUM, 11, "to_port_num"}, - {OSMTEST_TOKEN_TOLID, 6, "to_lid"}, - {OSMTEST_TOKEN_UNKNOWN, 0, ""} /* must be last entry */ -}; - -#define IB_MAD_STATUS_CLASS_MASK (CL_HTON16(0xFF00)) - -static const char ib_mad_status_str_busy[] = "IB_MAD_STATUS_BUSY"; -static const char ib_mad_status_str_redirect[] = "IB_MAD_STATUS_REDIRECT"; -static const char ib_mad_status_str_unsup_class_ver[] = - "IB_MAD_STATUS_UNSUP_CLASS_VER"; -static const char ib_mad_status_str_unsup_method[] = - "IB_MAD_STATUS_UNSUP_METHOD"; -static const char ib_mad_status_str_unsup_method_attr[] = - "IB_MAD_STATUS_UNSUP_METHOD_ATTR"; -static const char ib_mad_status_str_invalid_field[] = - "IB_MAD_STATUS_INVALID_FIELD"; -static const char ib_mad_status_str_no_resources[] = - "IB_SA_MAD_STATUS_NO_RESOURCES"; -static const char ib_mad_status_str_req_invalid[] = - "IB_SA_MAD_STATUS_REQ_INVALID"; -static const char ib_mad_status_str_no_records[] = - "IB_SA_MAD_STATUS_NO_RECORDS"; -static const char ib_mad_status_str_too_many_records[] = - "IB_SA_MAD_STATUS_TOO_MANY_RECORDS"; -static const char ib_mad_status_str_invalid_gid[] = - "IB_SA_MAD_STATUS_INVALID_GID"; -static const char ib_mad_status_str_insuf_comps[] = - "IB_SA_MAD_STATUS_INSUF_COMPS"; -static const char generic_or_str[] = " | "; - -const char *ib_get_mad_status_str(IN const ib_mad_t * const p_mad) -{ - static char line[512]; - uint32_t offset = 0; - ib_net16_t status; - boolean_t first = TRUE; - - line[offset] = '\0'; - - status = (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - - if (status == 0) { - strcat(&line[offset], "IB_SUCCESS"); - return (line); - } - - if (status & IB_MAD_STATUS_BUSY) { - strcat(&line[offset], ib_mad_status_str_busy); - offset += sizeof(ib_mad_status_str_busy); - } - if (status & IB_MAD_STATUS_REDIRECT) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_redirect); - offset += sizeof(ib_mad_status_str_redirect) - 1; - } - if ((status & IB_MAD_STATUS_INVALID_FIELD) == - IB_MAD_STATUS_UNSUP_CLASS_VER) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_unsup_class_ver); - offset += sizeof(ib_mad_status_str_unsup_class_ver) - 1; - } - if ((status & IB_MAD_STATUS_INVALID_FIELD) == - IB_MAD_STATUS_UNSUP_METHOD) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_unsup_method); - offset += sizeof(ib_mad_status_str_unsup_method) - 1; - } - if ((status & IB_MAD_STATUS_INVALID_FIELD) == - IB_MAD_STATUS_UNSUP_METHOD_ATTR) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_unsup_method_attr); - offset += sizeof(ib_mad_status_str_unsup_method_attr) - 1; - } - if ((status & IB_MAD_STATUS_INVALID_FIELD) == - IB_MAD_STATUS_INVALID_FIELD) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_invalid_field); - offset += sizeof(ib_mad_status_str_invalid_field) - 1; - } - if ((status & IB_MAD_STATUS_CLASS_MASK) == - IB_SA_MAD_STATUS_NO_RESOURCES) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_no_resources); - offset += sizeof(ib_mad_status_str_no_resources) - 1; - } - if ((status & IB_MAD_STATUS_CLASS_MASK) == IB_SA_MAD_STATUS_REQ_INVALID) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_req_invalid); - offset += sizeof(ib_mad_status_str_req_invalid) - 1; - } - if ((status & IB_MAD_STATUS_CLASS_MASK) == IB_SA_MAD_STATUS_NO_RECORDS) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_no_records); - offset += sizeof(ib_mad_status_str_no_records) - 1; - } - if ((status & IB_MAD_STATUS_CLASS_MASK) == - IB_SA_MAD_STATUS_TOO_MANY_RECORDS) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_too_many_records); - offset += sizeof(ib_mad_status_str_too_many_records) - 1; - } - if ((status & IB_MAD_STATUS_CLASS_MASK) == IB_SA_MAD_STATUS_INVALID_GID) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_invalid_gid); - offset += sizeof(ib_mad_status_str_invalid_gid) - 1; - } - if ((status & IB_MAD_STATUS_CLASS_MASK) == IB_SA_MAD_STATUS_INSUF_COMPS) { - if (!first) { - strcat(&line[offset], generic_or_str); - offset += sizeof(generic_or_str) - 1; - } - first = FALSE; - strcat(&line[offset], ib_mad_status_str_insuf_comps); - offset += sizeof(ib_mad_status_str_insuf_comps) - 1; - } - - return (line); -} - -void subnet_construct(IN subnet_t * const p_subn) -{ - cl_qmap_init(&p_subn->link_tbl); - cl_qmap_init(&p_subn->node_lid_tbl); - cl_qmap_init(&p_subn->node_guid_tbl); - cl_qmap_init(&p_subn->mgrp_mlid_tbl); - - /* NO WAY TO HAVE UNIQUE PORT BY LID OR GUID */ - /* cl_qmap_init( &p_subn->port_lid_tbl ); */ - /* cl_qmap_init( &p_subn->port_guid_tbl ); */ - - /* port key is a lid and num pair */ - cl_qmap_init(&p_subn->port_key_tbl); - cl_qmap_init(&p_subn->path_tbl); -} - -cl_status_t subnet_init(IN subnet_t * const p_subn) -{ - cl_status_t status = IB_SUCCESS; - - subnet_construct(p_subn); - - return (status); -} - -void osmtest_construct(IN osmtest_t * const p_osmt) -{ - memset(p_osmt, 0, sizeof(*p_osmt)); - osm_log_construct(&p_osmt->log); - subnet_construct(&p_osmt->exp_subn); -} - -void osmtest_destroy(IN osmtest_t * const p_osmt) -{ - cl_map_item_t *p_item, *p_next_item; - - /* Currently there is a problem with IBAL exit flow - memory overrun, - so bypass vendor deletion - it will be cleaned by the Windows OS */ -#ifndef __WIN__ - if (p_osmt->p_vendor) - osm_vendor_delete(&p_osmt->p_vendor); -#endif - - cl_qpool_destroy(&p_osmt->port_pool); - cl_qpool_destroy(&p_osmt->node_pool); - - /* destroy the qmap tables */ - p_next_item = cl_qmap_head(&p_osmt->exp_subn.link_tbl); - while (p_next_item != cl_qmap_end(&p_osmt->exp_subn.link_tbl)) { - p_item = p_next_item; - p_next_item = cl_qmap_next(p_item); - free(p_item); - } - p_next_item = cl_qmap_head(&p_osmt->exp_subn.mgrp_mlid_tbl); - while (p_next_item != cl_qmap_end(&p_osmt->exp_subn.mgrp_mlid_tbl)) { - p_item = p_next_item; - p_next_item = cl_qmap_next(p_item); - free(p_item); - } - p_next_item = cl_qmap_head(&p_osmt->exp_subn.node_guid_tbl); - while (p_next_item != cl_qmap_end(&p_osmt->exp_subn.node_guid_tbl)) { - p_item = p_next_item; - p_next_item = cl_qmap_next(p_item); - free(p_item); - } - - p_next_item = cl_qmap_head(&p_osmt->exp_subn.node_lid_tbl); - while (p_next_item != cl_qmap_end(&p_osmt->exp_subn.node_lid_tbl)) { - p_item = p_next_item; - p_next_item = cl_qmap_next(p_item); - free(p_item); - } - - p_next_item = cl_qmap_head(&p_osmt->exp_subn.path_tbl); - while (p_next_item != cl_qmap_end(&p_osmt->exp_subn.path_tbl)) { - p_item = p_next_item; - p_next_item = cl_qmap_next(p_item); - free(p_item); - } - p_next_item = cl_qmap_head(&p_osmt->exp_subn.port_key_tbl); - while (p_next_item != cl_qmap_end(&p_osmt->exp_subn.port_key_tbl)) { - p_item = p_next_item; - p_next_item = cl_qmap_next(p_item); - free(p_item); - } - - osm_log_destroy(&p_osmt->log); -} - -ib_api_status_t -osmtest_init(IN osmtest_t * const p_osmt, - IN const osmtest_opt_t * const p_opt, - IN const osm_log_level_t log_flags) -{ - ib_api_status_t status; - - /* Can't use log macros here, since we're initializing the log. */ - osmtest_construct(p_osmt); - - status = osm_log_init_v2(&p_osmt->log, p_opt->force_log_flush, - 0x0001, p_opt->log_file, 0, TRUE); - if (status != IB_SUCCESS) - return (status); - - /* but we do not want any extra stuff here */ - osm_log_set_level(&p_osmt->log, log_flags); - - OSM_LOG(&p_osmt->log, OSM_LOG_FUNCS, "[\n"); - - p_osmt->opt = *p_opt; - - status = cl_qpool_init(&p_osmt->node_pool, POOL_MIN_ITEMS, 0, - POOL_MIN_ITEMS, sizeof(node_t), NULL, NULL, - NULL); - CL_ASSERT(status == CL_SUCCESS); - - status = cl_qpool_init(&p_osmt->port_pool, POOL_MIN_ITEMS, 0, - POOL_MIN_ITEMS, sizeof(port_t), NULL, NULL, - NULL); - CL_ASSERT(status == CL_SUCCESS); - - p_osmt->p_vendor = osm_vendor_new(&p_osmt->log, - p_opt->transaction_timeout); - - if (p_osmt->p_vendor == NULL) { - status = IB_INSUFFICIENT_RESOURCES; - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0001: " - "Unable to allocate vendor object"); - status = IB_ERROR; - goto Exit; - } - - osm_mad_pool_construct(&p_osmt->mad_pool); - status = osm_mad_pool_init(&p_osmt->mad_pool); - if (status != IB_SUCCESS) - goto Exit; - -Exit: - OSM_LOG(&p_osmt->log, OSM_LOG_FUNCS, "]\n"); - return (status); -} - -void osmtest_query_res_cb(IN osmv_query_res_t * p_rec) -{ - osmtest_req_context_t *const p_ctxt = - (osmtest_req_context_t *) p_rec->query_context; - osmtest_t *const p_osmt = p_ctxt->p_osmt; - - OSM_LOG_ENTER(&p_osmt->log); - - p_ctxt->result = *p_rec; - - if (p_rec->status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0003: " - "Error on query (%s)\n", ib_get_err_str(p_rec->status)); - } - - OSM_LOG_EXIT(&p_osmt->log); -} - -ib_api_status_t -osmtest_get_all_recs(IN osmtest_t * const p_osmt, - IN ib_net16_t const attr_id, - IN size_t const attr_size, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "Getting all %s records\n", - ib_get_sa_attr_str(attr_id)); - - /* - * Do a blocking query for all records in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - - p_context->p_osmt = p_osmt; - user.attr_id = attr_id; - user.attr_offset = ib_get_attr_offset((uint16_t) (attr_size >> 3)); - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0004: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0064: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (p_context->result. - p_result_madw))); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t osmtest_validate_sa_class_port_info(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_query_req_t req; - ib_class_port_info_t *p_cpi; - osmtest_req_context_t context; - osmtest_req_context_t *p_context = &context; - ib_sa_mad_t *p_resp_sa_madp; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Getting ClassPortInfo\n"); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - - p_context->p_osmt = p_osmt; - req.query_type = OSMV_QUERY_CLASS_PORT_INFO; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = 0; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0065: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0070: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (p_context->result. - p_result_madw))); - } - goto Exit; - } - - /* ok we got it so please print it out */ - p_resp_sa_madp = - (ib_sa_mad_t *) osm_madw_get_mad_ptr(context.result.p_result_madw); - p_cpi = - (ib_class_port_info_t *) ib_sa_mad_get_payload_ptr(p_resp_sa_madp); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "\n-----------------------------\n" - "SA Class Port Info:\n" - " base_ver:%u\n" - " class_ver:%u\n" - " cap_mask:0x%X\n" - " cap_mask2:0x%X\n" - " resp_time_val:0x%X\n" - "-----------------------------\n", - p_cpi->base_ver, p_cpi->class_ver, cl_ntoh16(p_cpi->cap_mask), - ib_class_cap_mask2(p_cpi), ib_class_resp_time_val(p_cpi)); - -Exit: -#if 0 - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } -#endif - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t -osmtest_get_node_rec(IN osmtest_t * const p_osmt, - IN ib_net64_t const node_guid, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_node_record_t record; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting node record for 0x%016" PRIx64 "\n", - cl_ntoh64(node_guid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.node_info.node_guid = node_guid; - - p_context->p_osmt = p_osmt; - user.comp_mask = IB_NR_COMPMASK_NODEGUID; - user.attr_id = IB_MAD_ATTR_NODE_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0071: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0072: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (p_context->result. - p_result_madw))); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * Get a node record by node LID - **********************************************************************/ -ib_api_status_t -osmtest_get_node_rec_by_lid(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_node_record_t record; - ib_mad_t *p_mad; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting node record for LID 0x%02X\n", cl_ntoh16(lid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = lid; - - p_context->p_osmt = p_osmt; - user.comp_mask = IB_NR_COMPMASK_LID; - user.attr_id = IB_MAD_ATTR_NODE_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0073: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0074: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_get_path_rec_by_guid_pair(IN osmtest_t * const p_osmt, - IN ib_net64_t sguid, - IN ib_net64_t dguid, - IN osmtest_req_context_t * p_context) -{ - cl_status_t status = IB_SUCCESS; - osmv_query_req_t req; - osmv_guid_pair_t guid_pair; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&req, 0, sizeof(req)); - memset(p_context, 0, sizeof(*p_context)); - - p_context->p_osmt = p_osmt; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - - req.query_type = OSMV_QUERY_PATH_REC_BY_PORT_GUIDS; - - guid_pair.dest_guid = dguid; - guid_pair.src_guid = sguid; - - req.p_query_input = &guid_pair; - req.sm_key = 0; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Query for path from 0x%" PRIx64 " to 0x%" PRIx64 "\n", - sguid, dguid); - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0063: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = (*p_context).result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0066: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - ((*p_context).result. - p_result_madw))); - } - goto Exit; - } - -Exit: - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_get_path_rec_by_gid_pair(IN osmtest_t * const p_osmt, - IN ib_gid_t sgid, - IN ib_gid_t dgid, - IN osmtest_req_context_t * p_context) -{ - cl_status_t status = IB_SUCCESS; - osmv_query_req_t req; - osmv_gid_pair_t gid_pair; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&req, 0, sizeof(req)); - memset(p_context, 0, sizeof(*p_context)); - - p_context->p_osmt = p_osmt; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - - req.query_type = OSMV_QUERY_PATH_REC_BY_GIDS; - - gid_pair.dest_gid = dgid; - gid_pair.src_gid = sgid; - - req.p_query_input = &gid_pair; - req.sm_key = 0; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Query for path from 0x%016" PRIx64 " 0x%016" PRIx64 - " to 0x%016" PRIx64 " 0x%016" PRIx64 "\n", sgid.unicast.prefix, - sgid.unicast.interface_id, dgid.unicast.prefix, - dgid.unicast.interface_id); - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 006A: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = (*p_context).result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 006B: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - ((*p_context).result. - p_result_madw))); - } - goto Exit; - } - -Exit: - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) -static ib_api_status_t -osmtest_get_multipath_rec(IN osmtest_t * const p_osmt, - IN osmv_multipath_req_t * p_request, - IN osmtest_req_context_t * p_context) -{ - cl_status_t status = IB_SUCCESS; - osmv_query_req_t req; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - - p_context->p_osmt = p_osmt; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - - req.query_type = OSMV_QUERY_MULTIPATH_REC; - - req.p_query_input = p_request; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0068: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0069: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (p_context->result. - p_result_madw))); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} -#endif - -ib_api_status_t -osmtest_get_port_rec(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_portinfo_record_t record; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Getting PortInfoRecord for port with LID 0x%X\n", - cl_ntoh16(lid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = lid; - - p_context->p_osmt = p_osmt; - user.comp_mask = IB_PIR_COMPMASK_LID; - user.attr_id = IB_MAD_ATTR_PORTINFO_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0075: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0076: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (p_context->result. - p_result_madw))); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t -osmtest_get_port_rec_by_num(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN uint8_t const port_num, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_portinfo_record_t record; - ib_mad_t *p_mad; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Getting PortInfoRecord for port with LID 0x%X Num:0x%X\n", - cl_ntoh16(lid), port_num); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = lid; - record.port_num = port_num; - user.p_attr = &record; - - p_context->p_osmt = p_osmt; - - req.query_type = OSMV_QUERY_PORT_REC_BY_LID_AND_NUM; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0077: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0078: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t -osmtest_stress_port_recs_large(IN osmtest_t * const p_osmt, - OUT uint32_t * const p_num_recs, - OUT uint32_t * const p_num_queries) -{ - osmtest_req_context_t context; - ib_portinfo_record_t *p_rec; - uint32_t i; - cl_status_t status; - uint32_t num_recs = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - /* - * Do a blocking query for all PortInfoRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_PORTINFO_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0006: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Populate the database with the received records. - */ - num_recs = context.result.result_cnt; - *p_num_recs += num_recs; - ++*p_num_queries; - - if (osm_log_is_active(&p_osmt->log, OSM_LOG_VERBOSE)) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Received %u records\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_portinfo_rec(context.result. - p_result_madw, i); - osm_dump_portinfo_record(&p_osmt->log, p_rec, - OSM_LOG_VERBOSE); - } - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t -osmtest_stress_node_recs_large(IN osmtest_t * const p_osmt, - OUT uint32_t * const p_num_recs, - OUT uint32_t * const p_num_queries) -{ - osmtest_req_context_t context; - ib_node_record_t *p_rec; - uint32_t i; - cl_status_t status; - uint32_t num_recs = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all NodeRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_NODE_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0007: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Populate the database with the received records. - */ - num_recs = context.result.result_cnt; - *p_num_recs += num_recs; - ++*p_num_queries; - - if (osm_log_is_active(&p_osmt->log, OSM_LOG_VERBOSE)) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Received %u records\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_node_rec(context.result. - p_result_madw, i); - osm_dump_node_record(&p_osmt->log, p_rec, - OSM_LOG_VERBOSE); - } - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t -osmtest_stress_path_recs_large(IN osmtest_t * const p_osmt, - OUT uint32_t * const p_num_recs, - OUT uint32_t * const p_num_queries) -{ - osmtest_req_context_t context; - ib_path_rec_t *p_rec; - uint32_t i; - cl_status_t status; - uint32_t num_recs = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all PathRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_PATH_RECORD, - sizeof(*p_rec), &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0008: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Populate the database with the received records. - */ - num_recs = context.result.result_cnt; - *p_num_recs += num_recs; - ++*p_num_queries; - - if (osm_log_is_active(&p_osmt->log, OSM_LOG_VERBOSE)) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Received %u records\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_path_rec(context.result. - p_result_madw, i); - osm_dump_path_record(&p_osmt->log, p_rec, - OSM_LOG_VERBOSE); - } - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t -osmtest_stress_path_recs_by_guid(IN osmtest_t * const p_osmt, - OUT uint32_t * const p_num_recs, - OUT uint32_t * const p_num_queries) -{ - osmtest_req_context_t context; - ib_path_rec_t *p_rec; - uint32_t i; - cl_status_t status = IB_SUCCESS; - uint32_t num_recs = 0; - node_t *p_src_node, *p_dst_node; - cl_qmap_t *p_tbl; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - context.p_osmt = p_osmt; - - p_tbl = &p_osmt->exp_subn.node_guid_tbl; - - p_src_node = (node_t *) cl_qmap_head(p_tbl); - - /* - * Go over all nodes that exist in the subnet - * for each pair that are not switch nodes get the path record - */ - while (p_src_node != (node_t *) cl_qmap_end(p_tbl)) { - p_dst_node = (node_t *) cl_qmap_head(p_tbl); - - while (p_dst_node != (node_t *) cl_qmap_end(p_tbl)) { - /* - * Do a blocking query for CA to CA Path Record - */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Source : guid = 0x%" PRIx64 " type = %d" - "Target : guid = 0x%" PRIx64 " type = %d\n", - cl_ntoh64(p_src_node->rec.node_info.port_guid), - p_src_node->rec.node_info.node_type, - cl_ntoh64(p_dst_node->rec.node_info.port_guid), - p_dst_node->rec.node_info.node_type); - - if (p_src_node->rec.node_info.node_type == - IB_NODE_TYPE_CA - && p_dst_node->rec.node_info.node_type == - IB_NODE_TYPE_CA) { - status = - osmtest_get_path_rec_by_guid_pair(p_osmt, - p_src_node-> - rec. - node_info. - port_guid, - p_dst_node-> - rec. - node_info. - port_guid, - &context); - - /* In a case of TIMEOUT you still can try sending but cant count, maybe its a temporary issue */ - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0009: " - "osmtest_get_path_rec_by_guid_pair failed (%s)\n", - ib_get_err_str(status)); - if (status != IB_TIMEOUT) - goto Exit; - } else { - /* we might have received several records */ - num_recs = context.result.result_cnt; - /* - * Populate the database with the received records. - */ - *p_num_recs += num_recs; - ++*p_num_queries; - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Received %u records\n", num_recs); - /* Dont waste time if not VERBOSE and above */ - if (p_osmt->log.level & OSM_LOG_VERBOSE) { - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_path_rec - (context.result. - p_result_madw, i); - osm_dump_path_record - (&p_osmt->log, - p_rec, - OSM_LOG_VERBOSE); - } - } - } - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result. - p_result_madw); - context.result.p_result_madw = NULL; - } - } - /* next one please */ - p_dst_node = - (node_t *) cl_qmap_next(&p_dst_node->map_item); - } - - p_src_node = (node_t *) cl_qmap_next(&p_src_node->map_item); - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t -osmtest_stress_port_recs_small(IN osmtest_t * const p_osmt, - OUT uint32_t * const p_num_recs, - OUT uint32_t * const p_num_queries) -{ - osmtest_req_context_t context; - ib_portinfo_record_t *p_rec; - uint32_t i; - cl_status_t status; - uint32_t num_recs = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for our own PortInfoRecord in the subnet. - */ - status = osmtest_get_port_rec(p_osmt, - cl_ntoh16(p_osmt->local_port.lid), - &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0010: " - "osmtest_get_port_rec failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Populate the database with the received records. - */ - num_recs = context.result.result_cnt; - *p_num_recs += num_recs; - ++*p_num_queries; - - if (osm_log_is_active(&p_osmt->log, OSM_LOG_VERBOSE)) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Received %u records\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_portinfo_rec(context.result. - p_result_madw, i); - osm_dump_portinfo_record(&p_osmt->log, p_rec, - OSM_LOG_VERBOSE); - } - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t -osmtest_get_local_port_lmc(IN osmtest_t * const p_osmt, - IN ib_net16_t lid, OUT uint8_t * const p_lmc) -{ - osmtest_req_context_t context; - ib_portinfo_record_t *p_rec; - uint32_t i; - cl_status_t status; - uint32_t num_recs = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for our own PortInfoRecord in the subnet. - */ - status = osmtest_get_port_rec(p_osmt, cl_ntoh16(lid), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 001A: " - "osmtest_get_port_rec failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - num_recs = context.result.result_cnt; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_portinfo_rec(context.result.p_result_madw, - i); - osm_dump_portinfo_record(&p_osmt->log, p_rec, OSM_LOG_VERBOSE); - if (p_lmc) { - *p_lmc = ib_port_info_get_lmc(&p_rec->port_info); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "LMC %d\n", *p_lmc); - } - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * Use a wrong SM_Key in a simple port query and report success if - * failed. - **********************************************************************/ -ib_api_status_t osmtest_wrong_sm_key_ignored(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_portinfo_record_t record; - osmtest_req_context_t context; - osmtest_req_context_t *p_context = &context; - uint8_t port_num = 1; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "Trying PortInfoRecord for port with LID 0x%X Num:0x%X\n", - p_osmt->local_port.sm_lid, port_num); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = p_osmt->local_port.sm_lid; - record.port_num = port_num; - user.p_attr = &record; - - p_context->p_osmt = p_osmt; - - req.query_type = OSMV_QUERY_PORT_REC_BY_LID_AND_NUM; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 9999; - context.result.p_result_madw = NULL; - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmv_query_sa(p_osmt->h_bind, &req); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - /* since we use a wrong sm_key we should get a timeout */ - if (status != IB_TIMEOUT) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0011: " - "Did not get a timeout but got (%s)\n", - ib_get_err_str(status)); - if (status == IB_SUCCESS) { - /* assign some error value to status, since IB_SUCCESS is a bad rc */ - status = IB_ERROR; - } - goto Exit; - } else { - status = IB_SUCCESS; - } - -Exit: - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_write_port_info(IN osmtest_t * const p_osmt, - IN FILE * fh, - IN const ib_portinfo_record_t * const p_rec) -{ - int result; - cl_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - result = fprintf(fh, - "DEFINE_PORT\n" - "lid 0x%X\n" - "port_num 0x%X\n" - "m_key 0x%016" PRIx64 "\n" - "subnet_prefix 0x%016" PRIx64 "\n" - "base_lid 0x%X\n" - "master_sm_base_lid 0x%X\n" - "capability_mask 0x%X\n" - "diag_code 0x%X\n" - "m_key_lease_period 0x%X\n" - "local_port_num 0x%X\n" - "link_width_enabled 0x%X\n" - "link_width_supported 0x%X\n" - "link_width_active 0x%X\n" - "link_speed_supported 0x%X\n" - "port_state %s\n" - "state_info2 0x%X\n" - "mpb 0x%X\n" - "lmc 0x%X\n" - "link_speed 0x%X\n" - "mtu_smsl 0x%X\n" - "vl_cap 0x%X\n" - "vl_high_limit 0x%X\n" - "vl_arb_high_cap 0x%X\n" - "vl_arb_low_cap 0x%X\n" - "mtu_cap 0x%X\n" - "vl_stall_life 0x%X\n" - "vl_enforce 0x%X\n" - "m_key_violations 0x%X\n" - "p_key_violations 0x%X\n" - "q_key_violations 0x%X\n" - "guid_cap 0x%X\n" - "subnet_timeout 0x%X\n" - "resp_time_value 0x%X\n" - "error_threshold 0x%X\n" - "END\n\n", - cl_ntoh16(p_rec->lid), - p_rec->port_num, - cl_ntoh64(p_rec->port_info.m_key), - cl_ntoh64(p_rec->port_info.subnet_prefix), - cl_ntoh16(p_rec->port_info.base_lid), - cl_ntoh16(p_rec->port_info.master_sm_base_lid), - cl_ntoh32(p_rec->port_info.capability_mask), - cl_ntoh16(p_rec->port_info.diag_code), - cl_ntoh16(p_rec->port_info.m_key_lease_period), - p_rec->port_info.local_port_num, - p_rec->port_info.link_width_enabled, - p_rec->port_info.link_width_supported, - p_rec->port_info.link_width_active, - ib_port_info_get_link_speed_sup(&p_rec->port_info), - ib_get_port_state_str(ib_port_info_get_port_state - (&p_rec->port_info)), - p_rec->port_info.state_info2, - ib_port_info_get_mpb(&p_rec->port_info), - ib_port_info_get_lmc(&p_rec->port_info), - p_rec->port_info.link_speed, p_rec->port_info.mtu_smsl, - p_rec->port_info.vl_cap, - p_rec->port_info.vl_high_limit, - p_rec->port_info.vl_arb_high_cap, - p_rec->port_info.vl_arb_low_cap, - p_rec->port_info.mtu_cap, - p_rec->port_info.vl_stall_life, - p_rec->port_info.vl_enforce, - cl_ntoh16(p_rec->port_info.m_key_violations), - cl_ntoh16(p_rec->port_info.p_key_violations), - cl_ntoh16(p_rec->port_info.q_key_violations), - p_rec->port_info.guid_cap, - ib_port_info_get_timeout(&p_rec->port_info), - p_rec->port_info.resp_time_value, - p_rec->port_info.error_threshold); - - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0161: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_write_path_info(IN osmtest_t * const p_osmt, - IN FILE * fh, IN const ib_path_rec_t * const p_rec) -{ - int result; - cl_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - result = fprintf(fh, - "DEFINE_PATH\n" - "dgid 0x%016" PRIx64 " 0x%016" - PRIx64 "\nsgid 0x%016" PRIx64 - " 0x%016" PRIx64 "\ndlid 0x%X\n" - "slid 0x%X\n" - "# hop_flow_raw 0x%X\n" - "# tclass 0x%X\n" - "# num_path 0x%X\n" - "pkey 0x%X\n" - "# sl 0x%X\n" - "# qos_class 0x%X\n" - "# mtu 0x%X\n" - "# rate 0x%X\n" - "# pkt_life 0x%X\n" - "# preference 0x%X\n" "END\n\n", - cl_ntoh64(p_rec->dgid.unicast.prefix), - cl_ntoh64(p_rec->dgid.unicast.interface_id), - cl_ntoh64(p_rec->sgid.unicast.prefix), - cl_ntoh64(p_rec->sgid.unicast.interface_id), - cl_ntoh16(p_rec->dlid), cl_ntoh16(p_rec->slid), - cl_ntoh32(p_rec->hop_flow_raw), p_rec->tclass, - p_rec->num_path, cl_ntoh16(p_rec->pkey), - ib_path_rec_sl(p_rec), ib_path_rec_qos_class(p_rec), - p_rec->mtu, p_rec->rate, p_rec->pkt_life, - p_rec->preference); - - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0162: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_write_node_info(IN osmtest_t * const p_osmt, - IN FILE * fh, IN const ib_node_record_t * const p_rec) -{ - int result; - cl_status_t status = IB_SUCCESS; - char desc[IB_NODE_DESCRIPTION_SIZE + 1]; - - OSM_LOG_ENTER(&p_osmt->log); - - memcpy(desc, p_rec->node_desc.description, IB_NODE_DESCRIPTION_SIZE); - desc[IB_NODE_DESCRIPTION_SIZE] = '\0'; - - result = fprintf(fh, - "DEFINE_NODE\n" - "lid 0x%X\n" - "base_version 0x%X\n" - "class_version 0x%X\n" - "node_type 0x%X # (%s)\n" - "num_ports 0x%X\n" - "sys_guid 0x%016" PRIx64 "\n" - "node_guid 0x%016" PRIx64 "\n" - "port_guid 0x%016" PRIx64 "\n" - "partition_cap 0x%X\n" - "device_id 0x%X\n" - "revision 0x%X\n" - "# port_num 0x%X\n" - "# vendor_id 0x%X\n" - "# node_desc %s\n" - "END\n\n", - cl_ntoh16(p_rec->lid), - p_rec->node_info.base_version, - p_rec->node_info.class_version, - p_rec->node_info.node_type, - ib_get_node_type_str(p_rec->node_info.node_type), - p_rec->node_info.num_ports, - cl_ntoh64(p_rec->node_info.sys_guid), - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh64(p_rec->node_info.port_guid), - cl_ntoh16(p_rec->node_info.partition_cap), - cl_ntoh16(p_rec->node_info.device_id), - cl_ntoh32(p_rec->node_info.revision), - ib_node_info_get_local_port_num(&p_rec->node_info), - cl_ntoh32(ib_node_info_get_vendor_id - (&p_rec->node_info)), desc); - - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0163: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_write_link(IN osmtest_t * const p_osmt, - IN FILE * fh, IN const ib_link_record_t * const p_rec) -{ - int result; - cl_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - result = fprintf(fh, - "DEFINE_LINK\n" - "from_lid 0x%X\n" - "from_port_num 0x%X\n" - "to_port_num 0x%X\n" - "to_lid 0x%X\n" - "END\n\n", - cl_ntoh16(p_rec->from_lid), - p_rec->from_port_num, - p_rec->to_port_num, cl_ntoh16(p_rec->to_lid)); - - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0164: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_write_all_link_recs(IN osmtest_t * const p_osmt, IN FILE * fh) -{ - osmtest_req_context_t context; - const ib_link_record_t *p_rec; - uint32_t i; - cl_status_t status; - size_t num_recs; - int result; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all NodeRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_LINK_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0165: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Write the received records out to the file. - */ - num_recs = context.result.result_cnt; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Received %u records\n", num_recs); - - result = fprintf(fh, "#\n" "# Link Records\n" "#\n"); - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0166: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - - for (i = 0; i < num_recs; i++) { - p_rec = - (ib_link_record_t *) osmv_get_query_result(context.result. - p_result_madw, - i); - - osmtest_write_link(p_osmt, fh, p_rec); - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_get_path_rec_by_lid_pair(IN osmtest_t * const p_osmt, - IN ib_net16_t slid, - IN ib_net16_t dlid, - IN osmtest_req_context_t * p_context) -{ - cl_status_t status = IB_SUCCESS; - osmv_query_req_t req; - osmv_lid_pair_t lid_pair; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&req, 0, sizeof(req)); - memset(p_context, 0, sizeof(*p_context)); - - p_context->p_osmt = p_osmt; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - - req.query_type = OSMV_QUERY_PATH_REC_BY_LIDS; - - lid_pair.dest_lid = dlid; - lid_pair.src_lid = slid; - - req.p_query_input = &lid_pair; - req.sm_key = 0; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Query for path (by lid pair) from 0x%X to 0x%X\n", slid, dlid); - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0053: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = (*p_context).result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0067: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - ((*p_context).result. - p_result_madw))); - } - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -#ifdef VENDOR_RMPP_SUPPORT -/********************************************************************** - * ASSUMES RMPP - **********************************************************************/ -static ib_api_status_t -osmtest_write_all_node_recs(IN osmtest_t * const p_osmt, IN FILE * fh) -{ - osmtest_req_context_t context; - const ib_node_record_t *p_rec; - uint32_t i; - cl_status_t status; - size_t num_recs; - int result; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all NodeRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_NODE_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0022: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Write the received records out to the file. - */ - num_recs = context.result.result_cnt; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", num_recs); - - result = fprintf(fh, "#\n" "# Node Records\n" "#\n"); - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0023: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_node_rec(context.result.p_result_madw, i); - osmtest_write_node_info(p_osmt, fh, p_rec); - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * ASSUMES RMPP - **********************************************************************/ -static ib_api_status_t -osmtest_write_all_port_recs(IN osmtest_t * const p_osmt, IN FILE * fh) -{ - osmtest_req_context_t context; - const ib_portinfo_record_t *p_rec; - uint32_t i; - cl_status_t status; - size_t num_recs; - int result; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all NodeRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_PORTINFO_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0167: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Write the received records out to the file. - */ - num_recs = context.result.result_cnt; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", num_recs); - - result = fprintf(fh, "#\n" "# PortInfo Records\n" "#\n"); - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0024: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_portinfo_rec(context.result.p_result_madw, - i); - osmtest_write_port_info(p_osmt, fh, p_rec); - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * ASSUMES RMPP - **********************************************************************/ -static ib_api_status_t -osmtest_write_all_path_recs(IN osmtest_t * const p_osmt, IN FILE * fh) -{ - osmtest_req_context_t context; - const ib_path_rec_t *p_rec; - uint32_t i; - cl_status_t status; - size_t num_recs; - int result; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all PathRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_PATH_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0025: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Write the received records out to the file. - */ - num_recs = context.result.result_cnt; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", num_recs); - - result = fprintf(fh, "#\n" "# Path Records\n" "#\n"); - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0026: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_path_rec(context.result.p_result_madw, i); - osmtest_write_path_info(p_osmt, fh, p_rec); - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -#else /* !VENDOR_RMPP_SUPPORT */ -/* - * NON RMPP BASED QUERY FOR ALL NODES: BASED ON THE MAX LID GIVEN BY THE USER - */ -static ib_api_status_t -osmtest_write_all_node_recs(IN osmtest_t * const p_osmt, IN FILE * fh) -{ - osmtest_req_context_t context; - node_t *p_node; - node_t *p_guid_node; - const ib_node_record_t *p_rec; - cl_status_t status = CL_SUCCESS; - int result; - uint16_t lid; - - OSM_LOG_ENTER(&p_osmt->log); - - result = fprintf(fh, "#\n" "# Node Records\n" "#\n"); - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0027: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - - /* - * Go over all LIDs in the range 1 to max_lid and do a - * NodeRecord query by that lid. - */ - for (lid = 1; lid <= p_osmt->max_lid; lid++) { - /* prepare the query context */ - memset(&context, 0, sizeof(context)); - - status = - osmtest_get_node_rec_by_lid(p_osmt, cl_ntoh16(lid), - &context); - if (status != IB_SUCCESS) { - if (status != IB_SA_MAD_STATUS_NO_RECORDS) { - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "ERR 0028: " - "failed to get node info for LID:0x%02X (%s)\n", - cl_ntoh16(lid), ib_get_err_str(status)); - goto Exit; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "WRN 0121: " - "failed to get node info for LID:0x%02X (%s)\n", - cl_ntoh16(lid), ib_get_err_str(status)); - status = IB_SUCCESS; - } - } else { - /* OK we got something */ - p_rec = - osmv_get_query_node_rec(context.result. - p_result_madw, 0); - osmtest_write_node_info(p_osmt, fh, p_rec); - - /* create a subnet object */ - p_node = node_new(); - CL_ASSERT(p_node != NULL); - - /* copy the info to the subnet node object */ - p_node->rec = *p_rec; - - cl_qmap_insert(&p_osmt->exp_subn.node_lid_tbl, - p_node->rec.lid, &p_node->map_item); - - p_guid_node = node_new(); - CL_ASSERT(p_guid_node != NULL); - - *p_guid_node = *p_node; - - cl_qmap_insert(&p_osmt->exp_subn.node_guid_tbl, - p_guid_node->rec.node_info.node_guid, - &p_guid_node->map_item); - - } - - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - } - -Exit: - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/* - * GET ALL PORT RECORDS IN THE FABRIC - - * one by one by using the node info received - */ -static ib_api_status_t -osmtest_write_all_port_recs(IN osmtest_t * const p_osmt, IN FILE * fh) -{ - osmtest_req_context_t context; - const ib_node_record_t *p_node_rec; - const ib_portinfo_record_t *p_rec; - uint8_t port_num; - cl_status_t status = CL_SUCCESS; - cl_qmap_t *p_tbl; - node_t *p_node; - port_t *p_port; - int result; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* print header */ - result = fprintf(fh, "#\n" "# PortInfo Records\n" "#\n"); - if (result < 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0029: " - "Write failed\n"); - status = IB_ERROR; - goto Exit; - } - - /* use the pre-explored set of nodes */ - p_tbl = &p_osmt->exp_subn.node_lid_tbl; - p_node = (node_t *) cl_qmap_head(p_tbl); - - /* - * Go over all LIDs in the range 1 to max_lid and do a - * NodeRecord query by that lid. - */ - while (p_node != (node_t *) cl_qmap_end(p_tbl)) { - - p_node_rec = &(p_node->rec); - - /* go through all ports of the node: */ - for (port_num = 0; port_num <= p_node_rec->node_info.num_ports; - port_num++) { - /* prepare the query context */ - memset(&context, 0, sizeof(context)); - - status = osmtest_get_port_rec_by_num(p_osmt, - p_node_rec->lid, - port_num, - &context); - if (status != IB_SUCCESS) { - if (status != IB_SA_MAD_STATUS_NO_RECORDS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "WRN 0122: " - "Error encountered getting port info for LID:0x%04X Num:0x%02X (%s)\n", - p_node_rec->lid, port_num, - ib_get_err_str(status)); - goto Exit; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "WRN 0123: " - "failed to get port info for LID:0x%04X Num:0x%02X (%s)\n", - p_node_rec->lid, port_num, - ib_get_err_str(status)); - status = IB_SUCCESS; - } - } else { - /* OK we got something */ - p_rec = - osmv_get_query_portinfo_rec(context.result. - p_result_madw, - 0); - osmtest_write_port_info(p_osmt, fh, p_rec); - - /* create a subnet object */ - p_port = port_new(); - CL_ASSERT(p_port != NULL); - - /* copy the info to the subnet node object */ - p_port->rec = *p_rec; - - cl_qmap_insert(&p_osmt->exp_subn.port_key_tbl, - port_gen_id(p_node_rec->lid, - port_num), - &p_port->map_item); - } - - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - } - p_node = (node_t *) cl_qmap_next(&p_node->map_item); - } - - /* we must set the exist status to avoid abort of the over all algorith */ - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * ASSUMES NO RMPP - **********************************************************************/ -static ib_api_status_t -osmtest_write_all_path_recs(IN osmtest_t * const p_osmt, IN FILE * fh) -{ - osmtest_req_context_t context; - const ib_path_rec_t *p_rec; - cl_status_t status = CL_SUCCESS; - int num_recs, i; - cl_qmap_t *p_tbl; - node_t *p_src_node, *p_dst_node; - ib_api_status_t got_status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Go over all nodes that exist in the subnet - * for each pair that are not switch nodes get the path record - */ - - context.p_osmt = p_osmt; - - p_tbl = &p_osmt->exp_subn.node_lid_tbl; - - p_src_node = (node_t *) cl_qmap_head(p_tbl); - - while (p_src_node != (node_t *) cl_qmap_end(p_tbl)) { - /* HACK we use capability_mask to know diff a CA node from switch node */ - /* if(p_src_node->rec.node_info.capability_mask ) { */ - p_dst_node = (node_t *) cl_qmap_head(p_tbl); - - while (p_dst_node != (node_t *) cl_qmap_end(p_tbl)) { - /* HACK we use capability_mask to know diff a CA node from switch node */ - /* if (p_dst_node->rec.node_info.capability_mask) { */ - - /* query for it: */ - status = osmtest_get_path_rec_by_lid_pair(p_osmt, - p_src_node-> - rec.lid, - p_dst_node-> - rec.lid, - &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 012D: " - "failed to get path info from LID:0x%X To LID:0x%X (%s)\n", - p_src_node->rec.lid, - p_dst_node->rec.lid, - ib_get_err_str(status)); - /* remember the first error status */ - got_status = - (got_status == - IB_SUCCESS) ? status : got_status; - } else { - /* we might have received several records */ - num_recs = context.result.result_cnt; - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_path_rec(context. - result. - p_result_madw, - i); - osmtest_write_path_info(p_osmt, fh, - p_rec); - } - } -/* } */ - - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - /* next one please */ - p_dst_node = - (node_t *) cl_qmap_next(&p_dst_node->map_item); - } -/* } */ - - p_src_node = (node_t *) cl_qmap_next(&p_src_node->map_item); - } - - if (got_status != IB_SUCCESS) - status = got_status; - - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -#endif - -static ib_api_status_t -osmtest_create_inventory_file(IN osmtest_t * const p_osmt) -{ - FILE *fh; - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - fh = fopen(p_osmt->opt.file_name, "w"); - if (fh == NULL) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0079: " - "Unable to open inventory file (%s)\n", - p_osmt->opt.file_name); - status = IB_ERROR; - goto Exit; - } - - /* HACK: the order is important: nodes ports paths */ - status = osmtest_write_all_node_recs(p_osmt, fh); - if (status != IB_SUCCESS) - goto Exit; - - status = osmtest_write_all_port_recs(p_osmt, fh); - if (status != IB_SUCCESS) - goto Exit; - - if (!p_osmt->opt.ignore_path_records) { - status = osmtest_write_all_path_recs(p_osmt, fh); - if (status != IB_SUCCESS) - goto Exit; - } - - status = osmtest_write_all_link_recs(p_osmt, fh); - if (status != IB_SUCCESS) - goto Exit; - - fclose(fh); - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t osmtest_stress_large_rmpp_pr(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status = IB_SUCCESS; - uint64_t num_recs = 0; - uint64_t num_queries = 0; - uint32_t delta_recs; - uint32_t delta_queries; - uint32_t print_freq = 0; - struct timeval start_tv, end_tv; - long sec_diff, usec_diff; - float ratio; - - OSM_LOG_ENTER(&p_osmt->log); - gettimeofday(&start_tv, NULL); - printf("-I- Start time is : %09ld:%06ld [sec:usec]\n", start_tv.tv_sec, - (long)start_tv.tv_usec); - - while (num_queries < STRESS_LARGE_PR_RMPP_THR) { - delta_recs = 0; - delta_queries = 0; - - status = osmtest_stress_path_recs_by_guid(p_osmt, &delta_recs, - &delta_queries); - if (status != IB_SUCCESS) - goto Exit; - - num_recs += delta_recs; - num_queries += delta_queries; - - print_freq += delta_recs; - if (print_freq > 10000) { - gettimeofday(&end_tv, NULL); - if (end_tv.tv_usec > start_tv.tv_usec) { - sec_diff = end_tv.tv_sec - start_tv.tv_sec; - usec_diff = end_tv.tv_usec - start_tv.tv_usec; - } else { - sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1; - usec_diff = - 1000000 - (start_tv.tv_usec - - end_tv.tv_usec); - } - printf("-I- End time is : %09ld:%06ld [sec:usec]\n", - end_tv.tv_sec, (long)end_tv.tv_usec); - printf("-I- Querying %" PRId64 - " Path Record queries CA to CA (rmpp)\n\ttook %04ld:%06ld [sec:usec]\n", - num_queries, sec_diff, usec_diff); - if (num_recs == 0) - ratio = 0; - else - ratio = ((float)num_queries / (float)num_recs); - printf("-I- Queries to Record Ratio is %" PRIu64 - " records, %" PRIu64 " queries : %.2f \n", - num_recs, num_queries, ratio); - print_freq = 0; - } - } - -Exit: - gettimeofday(&end_tv, NULL); - printf("-I- End time is : %09ld:%06ld [sec:usec]\n", - end_tv.tv_sec, (long)end_tv.tv_usec); - if (end_tv.tv_usec > start_tv.tv_usec) { - sec_diff = end_tv.tv_sec - start_tv.tv_sec; - usec_diff = end_tv.tv_usec - start_tv.tv_usec; - } else { - sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1; - usec_diff = 1000000 - (start_tv.tv_usec - end_tv.tv_usec); - } - - printf("-I- Querying %" PRId64 - " Path Record queries (rmpp) took %04ld:%06ld [sec:usec]\n", - num_queries, sec_diff, usec_diff); - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t osmtest_stress_large_rmpp(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status = IB_SUCCESS; - uint64_t num_recs = 0; - uint64_t num_queries = 0; - uint32_t delta_recs; - uint32_t delta_queries; - uint32_t print_freq = 0; - struct timeval start_tv, end_tv; - long sec_diff, usec_diff; - - OSM_LOG_ENTER(&p_osmt->log); - gettimeofday(&start_tv, NULL); - printf("-I- Start time is : %09ld:%06ld [sec:usec]\n", start_tv.tv_sec, - (long)start_tv.tv_usec); - - while (num_queries < STRESS_LARGE_RMPP_THR) { - delta_recs = 0; - delta_queries = 0; - - status = osmtest_stress_node_recs_large(p_osmt, &delta_recs, - &delta_queries); - if (status != IB_SUCCESS) - goto Exit; - - status = osmtest_stress_path_recs_large(p_osmt, &delta_recs, - &delta_queries); - if (status != IB_SUCCESS) - goto Exit; - - status = osmtest_stress_port_recs_large(p_osmt, &delta_recs, - &delta_queries); - if (status != IB_SUCCESS) - goto Exit; - - num_recs += delta_recs; - num_queries += delta_queries; - - print_freq += delta_recs; - - if (print_freq > 100000) { - gettimeofday(&end_tv, NULL); - if (end_tv.tv_usec > start_tv.tv_usec) { - sec_diff = end_tv.tv_sec - start_tv.tv_sec; - usec_diff = end_tv.tv_usec - start_tv.tv_usec; - } else { - sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1; - usec_diff = - 1000000 - (start_tv.tv_usec - - end_tv.tv_usec); - } - printf("-I- End time is : %09ld:%06ld [sec:usec]\n", - end_tv.tv_sec, (long)end_tv.tv_usec); - printf("-I- Querying %" PRId64 - " large mixed queries (rmpp) took %04ld:%06ld [sec:usec]\n", - num_queries, sec_diff, usec_diff); - printf("%" PRIu64 " records, %" PRIu64 " queries\n", - num_recs, num_queries); - print_freq = 0; - } - } - -Exit: - gettimeofday(&end_tv, NULL); - printf("-I- End time is : %09ld:%06ld [sec:usec]\n", - end_tv.tv_sec, (long)end_tv.tv_usec); - if (end_tv.tv_usec > start_tv.tv_usec) { - sec_diff = end_tv.tv_sec - start_tv.tv_sec; - usec_diff = end_tv.tv_usec - start_tv.tv_usec; - } else { - sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1; - usec_diff = 1000000 - (start_tv.tv_usec - end_tv.tv_usec); - } - - printf("-I- Querying %" PRId64 - " large mixed queries (rmpp) took %04ld:%06ld [sec:usec]\n", - num_queries, sec_diff, usec_diff); - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t osmtest_stress_small_rmpp(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status = IB_SUCCESS; - uint64_t num_recs = 0; - uint64_t num_queries = 0; - uint32_t delta_recs; - uint32_t delta_queries; - uint32_t print_freq = 0; - int num_timeouts = 0; - struct timeval start_tv, end_tv; - long sec_diff, usec_diff; - - OSM_LOG_ENTER(&p_osmt->log); - gettimeofday(&start_tv, NULL); - printf("-I- Start time is : %09ld:%06ld [sec:usec]\n", - start_tv.tv_sec, (long)start_tv.tv_usec); - - while ((num_queries < STRESS_SMALL_RMPP_THR) && (num_timeouts < 100)) { - delta_recs = 0; - delta_queries = 0; - - status = osmtest_stress_port_recs_small(p_osmt, &delta_recs, - &delta_queries); - if (status != IB_SUCCESS) - goto Exit; - - num_recs += delta_recs; - num_queries += delta_queries; - - print_freq += delta_recs; - if (print_freq > 5000) { - gettimeofday(&end_tv, NULL); - printf("%" PRIu64 " records, %" PRIu64 " queries\n", - num_recs, num_queries); - if (end_tv.tv_usec > start_tv.tv_usec) { - sec_diff = end_tv.tv_sec - start_tv.tv_sec; - usec_diff = end_tv.tv_usec - start_tv.tv_usec; - } else { - sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1; - usec_diff = - 1000000 - (start_tv.tv_usec - - end_tv.tv_usec); - } - printf("-I- End time is : %09ld:%06ld [sec:usec]\n", - end_tv.tv_sec, (long)end_tv.tv_usec); - printf("-I- Querying %" PRId64 - " port_info queries (single mad) took %04ld:%06ld [sec:usec]\n", - num_queries, sec_diff, usec_diff); - print_freq = 0; - } - } - -Exit: - gettimeofday(&end_tv, NULL); - printf("-I- End time is : %09ld:%06ld [sec:usec]\n", - end_tv.tv_sec, (long)end_tv.tv_usec); - if (end_tv.tv_usec > start_tv.tv_usec) { - sec_diff = end_tv.tv_sec - start_tv.tv_sec; - usec_diff = end_tv.tv_usec - start_tv.tv_usec; - } else { - sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1; - usec_diff = 1000000 - (start_tv.tv_usec - end_tv.tv_usec); - } - - printf("-I- Querying %" PRId64 - " port_info queries (single mad) took %04ld:%06ld [sec:usec]\n", - num_queries, sec_diff, usec_diff); - if (num_timeouts > 50) { - status = IB_TIMEOUT; - } - /* Exit: */ - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t -osmtest_stress_path_recs_by_lid(IN osmtest_t * const p_osmt, - OUT uint32_t * const p_num_recs, - OUT uint32_t * const p_num_queries) -{ - osmtest_req_context_t context; - ib_path_rec_t *p_rec; - cl_status_t status; - ib_net16_t dlid, slid; - int num_recs, i; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - slid = cl_ntoh16(p_osmt->local_port.lid); -#ifdef OSM_VENDOR_INTF_AL - dlid = p_osmt->local_port.sm_lid; // already in correct byte-order -#else - dlid = cl_ntoh16(p_osmt->local_port.sm_lid); -#endif - - /* - * Do a blocking query for the PathRecord. - */ - status = osmtest_get_path_rec_by_lid_pair(p_osmt, slid, dlid, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 000A: " - "osmtest_get_path_rec_by_lid_pair failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Populate the database with the received records. - */ - num_recs = context.result.result_cnt; - *p_num_recs += num_recs; - ++*p_num_queries; - - if (osm_log_is_active(&p_osmt->log, OSM_LOG_VERBOSE)) { - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Received %u records\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = osmv_get_query_path_rec(context.result.p_result_madw, 0); - osm_dump_path_record(&p_osmt->log, p_rec, OSM_LOG_VERBOSE); - } - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t osmtest_stress_get_pr(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status = IB_SUCCESS; - uint64_t num_recs = 0; - uint64_t num_queries = 0; - uint32_t delta_recs; - uint32_t delta_queries; - uint32_t print_freq = 0; - int num_timeouts = 0; - struct timeval start_tv, end_tv; - long sec_diff, usec_diff; - - OSM_LOG_ENTER(&p_osmt->log); - gettimeofday(&start_tv, NULL); - printf("-I- Start time is : %09ld:%06ld [sec:usec]\n", - start_tv.tv_sec, (long)start_tv.tv_usec); - - while ((num_queries < STRESS_GET_PR) && (num_timeouts < 100)) { - delta_recs = 0; - delta_queries = 0; - - status = osmtest_stress_path_recs_by_lid(p_osmt, - &delta_recs, - &delta_queries); - if (status != IB_SUCCESS) - goto Exit; - - num_recs += delta_recs; - num_queries += delta_queries; - - print_freq += delta_recs; - if (print_freq > 5000) { - gettimeofday(&end_tv, NULL); - printf("%" PRIu64 " records, %" PRIu64 " queries\n", - num_recs, num_queries); - if (end_tv.tv_usec > start_tv.tv_usec) { - sec_diff = end_tv.tv_sec - start_tv.tv_sec; - usec_diff = end_tv.tv_usec - start_tv.tv_usec; - } else { - sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1; - usec_diff = - 1000000 - (start_tv.tv_usec - - end_tv.tv_usec); - } - printf("-I- End time is : %09ld:%06ld [sec:usec]\n", - end_tv.tv_sec, (long)end_tv.tv_usec); - printf("-I- Querying %" PRId64 - " path_rec queries took %04ld:%06ld [sec:usec]\n", - num_queries, sec_diff, usec_diff); - print_freq = 0; - } - } - -Exit: - gettimeofday(&end_tv, NULL); - printf("-I- End time is : %09ld:%06ld [sec:usec]\n", - end_tv.tv_sec, (long)end_tv.tv_usec); - if (end_tv.tv_usec > start_tv.tv_usec) { - sec_diff = end_tv.tv_sec - start_tv.tv_sec; - usec_diff = end_tv.tv_usec - start_tv.tv_usec; - } else { - sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1; - usec_diff = 1000000 - (start_tv.tv_usec - end_tv.tv_usec); - } - - printf("-I- Querying %" PRId64 - " path_rec queries took %04ld:%06ld [sec:usec]\n", - num_queries, sec_diff, usec_diff); - if (num_timeouts > 50) { - status = IB_TIMEOUT; - } - /* Exit: */ - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static void -osmtest_prepare_db_generic(IN osmtest_t * const p_osmt, - IN cl_qmap_t * const p_tbl) -{ - generic_t *p_generic; - - OSM_LOG_ENTER(&p_osmt->log); - - p_generic = (generic_t *) cl_qmap_head(p_tbl); - - while (p_generic != (generic_t *) cl_qmap_end(p_tbl)) { - p_generic->count = 0; - p_generic = (generic_t *) cl_qmap_next(&p_generic->map_item); - } - - OSM_LOG_EXIT(&p_osmt->log); -} - -static void osmtest_prepare_db(IN osmtest_t * const p_osmt) -{ - OSM_LOG_ENTER(&p_osmt->log); - - osmtest_prepare_db_generic(p_osmt, &p_osmt->exp_subn.node_lid_tbl); - osmtest_prepare_db_generic(p_osmt, &p_osmt->exp_subn.path_tbl); - - OSM_LOG_EXIT(&p_osmt->log); -} - -static ib_api_status_t osmtest_check_missing_nodes(IN osmtest_t * const p_osmt) -{ - const node_t *p_node; - cl_status_t status = IB_SUCCESS; - cl_qmap_t *p_tbl; - - OSM_LOG_ENTER(&p_osmt->log); - - p_tbl = &p_osmt->exp_subn.node_lid_tbl; - - p_node = (node_t *) cl_qmap_head(p_tbl); - - while (p_node != (node_t *) cl_qmap_end(p_tbl)) { - if (p_node->count == 0) { - /* - * This node was not reported by the SA - */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0080: " - "Missing node 0x%016" PRIx64 "\n", - cl_ntoh64(p_node->rec.node_info.node_guid)); - status = IB_ERROR; - } - - p_node = (node_t *) cl_qmap_next(&p_node->map_item); - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t osmtest_check_missing_ports(IN osmtest_t * const p_osmt) -{ - const port_t *p_port; - cl_status_t status = IB_SUCCESS; - cl_qmap_t *p_tbl; - - OSM_LOG_ENTER(&p_osmt->log); - - p_tbl = &p_osmt->exp_subn.port_key_tbl; - - p_port = (port_t *) cl_qmap_head(p_tbl); - - while (p_port != (port_t *) cl_qmap_end(p_tbl)) { - if (p_port->count == 0) { - /* - * This port was not reported by the SA - */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0081: " - "Missing port LID:0x%X Num:0x%X\n", - cl_ntoh16(p_port->rec.lid), - p_port->rec.port_num); - status = IB_ERROR; - } - - p_port = (port_t *) cl_qmap_next(&p_port->map_item); - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t osmtest_check_missing_paths(IN osmtest_t * const p_osmt) -{ - const path_t *p_path; - cl_status_t status = IB_SUCCESS; - cl_qmap_t *p_tbl; - - OSM_LOG_ENTER(&p_osmt->log); - - p_tbl = &p_osmt->exp_subn.path_tbl; - - p_path = (path_t *) cl_qmap_head(p_tbl); - - while (p_path != (path_t *) cl_qmap_end(p_tbl)) { - if (p_path->count == 0) { - /* - * This path was not reported by the SA - */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0051: " - "SA did not return path SLID 0x%X to DLID 0x%X\n", - cl_ntoh16(p_path->rec.slid), - cl_ntoh16(p_path->rec.dlid)); - status = IB_ERROR; - goto Exit; - } - - p_path = (path_t *) cl_qmap_next(&p_path->map_item); - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -inline uint32_t osmtest_path_rec_key_get(IN const ib_path_rec_t * const p_rec) -{ - return (p_rec->dlid << 16 | p_rec->slid); -} - -static boolean_t -osmtest_path_rec_kay_is_valid(IN osmtest_t * const p_osmt, - IN const path_t * const p_path) -{ - if ((p_path->comp.dlid == 0) || (p_path->comp.slid == 0)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0168: " - "SLID and DLID must be specified for defined paths\n"); - return (FALSE); - } - - return (TRUE); -} - -static ib_api_status_t -osmtest_validate_path_data(IN osmtest_t * const p_osmt, - IN path_t * const p_path, - IN const ib_path_rec_t * const p_rec) -{ - cl_status_t status = IB_SUCCESS; - uint8_t lmc = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Checking path SLID 0x%X to DLID 0x%X\n", - cl_ntoh16(p_rec->slid), cl_ntoh16(p_rec->dlid)); - - status = - osmtest_get_local_port_lmc(p_osmt, p_osmt->local_port.lid, &lmc); - if (status != IB_SUCCESS) - goto Exit; - - /* HACK: Assume uniform LMC across endports in the subnet */ - /* This is the only LMC mode which OpenSM currently supports */ - /* In absence of this assumption, validation of this is much more complicated */ - if (lmc == 0) { - /* - * Has this record already been returned? - */ - if (p_path->count != 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0056: " - "Already received path SLID 0x%X to DLID 0x%X\n", - cl_ntoh16(p_rec->slid), cl_ntoh16(p_rec->dlid)); - status = IB_ERROR; - goto Exit; - } - } else { - /* Also, this doesn't detect fewer than the correct number of paths being returned */ - if (p_path->count >= (uint32_t) (1 << (2 * lmc))) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0052: " - "Already received path SLID 0x%X to DLID 0x%X count %d LMC %d\n", - cl_ntoh16(p_rec->slid), cl_ntoh16(p_rec->dlid), - p_path->count, lmc); - status = IB_ERROR; - goto Exit; - } - } - - ++p_path->count; - - /* - * Check the fields the user wants checked. - */ - if ((p_path->comp.dgid.unicast.interface_id & - p_path->rec.dgid.unicast.interface_id) != - (p_path->comp.dgid.unicast.interface_id & - p_rec->dgid.unicast.interface_id)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0169: " - "DGID mismatch on path SLID 0x%X to DLID 0x%X\n" - "\t\t\t\tExpected 0x%016" PRIx64 " 0x%016" PRIx64 "\n" - "\t\t\t\tReceived 0x%016" PRIx64 " 0x%016" PRIx64 "\n", - cl_ntoh16(p_path->rec.slid), - cl_ntoh16(p_path->rec.dlid), - cl_ntoh64(p_path->rec.dgid.unicast.prefix), - cl_ntoh64(p_path->rec.dgid.unicast.interface_id), - cl_ntoh64(p_rec->dgid.unicast.prefix), - cl_ntoh64(p_rec->dgid.unicast.interface_id)); - status = IB_ERROR; - goto Exit; - } - - /* - * Check the fields the user wants checked. - */ - if ((p_path->comp.sgid.unicast.interface_id & - p_path->rec.sgid.unicast.interface_id) != - (p_path->comp.sgid.unicast.interface_id & - p_rec->sgid.unicast.interface_id)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0057: " - "SGID mismatch on path SLID 0x%X to DLID 0x%X\n" - "\t\t\t\tExpected 0x%016" PRIx64 " 0x%016" PRIx64 ",\n" - "\t\t\t\tReceived 0x%016" PRIx64 " 0x%016" PRIx64 ".\n", - cl_ntoh16(p_path->rec.slid), - cl_ntoh16(p_path->rec.dlid), - cl_ntoh64(p_path->rec.sgid.unicast.prefix), - cl_ntoh64(p_path->rec.sgid.unicast.interface_id), - cl_ntoh64(p_rec->sgid.unicast.prefix), - cl_ntoh64(p_rec->sgid.unicast.interface_id)); - status = IB_ERROR; - goto Exit; - } - - /* - * Compare the fields the user wishes to validate. - */ - if ((p_path->comp.pkey & p_path->rec.pkey) != - (p_path->comp.pkey & p_rec->pkey)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0012: " - "PKEY mismatch on path SLID 0x%X to DLID 0x%X\n" - "\t\t\t\tExpected 0x%X, received 0x%X\n", - cl_ntoh16(p_path->rec.slid), - cl_ntoh16(p_path->rec.dlid), - cl_ntoh16(p_path->rec.pkey), cl_ntoh16(p_rec->pkey)); - status = IB_ERROR; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_node_data(IN osmtest_t * const p_osmt, - IN node_t * const p_node, - IN const ib_node_record_t * const p_rec) -{ - cl_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Checking node 0x%016" PRIx64 ", LID 0x%X\n", - cl_ntoh64(p_rec->node_info.node_guid), cl_ntoh16(p_rec->lid)); - - /* - * Has this record already been returned? - */ - if (p_node->count != 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0013: " - "Already received node 0x%016" PRIx64 "\n", - cl_ntoh64(p_node->rec.node_info.node_guid)); - status = IB_ERROR; - goto Exit; - } - - ++p_node->count; - - /* - * Compare the fields the user wishes to validate. - */ - if ((p_node->comp.lid & p_node->rec.lid) != - (p_node->comp.lid & p_rec->lid)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0014: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected LID 0x%X, received 0x%X\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), p_node->rec.lid, p_rec->lid); - status = IB_ERROR; - goto Exit; - } - - if ((p_node->comp.node_info.base_version & - p_node->rec.node_info.base_version) != - (p_node->comp.node_info.base_version & - p_rec->node_info.base_version)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0015: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected base_version 0x%X, received 0x%X\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), - p_node->rec.node_info.base_version, - p_rec->node_info.base_version); - status = IB_ERROR; - goto Exit; - } - - if ((p_node->comp.node_info.class_version & - p_node->rec.node_info.class_version) != - (p_node->comp.node_info.class_version & - p_rec->node_info.class_version)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0016: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected class_version 0x%X, received 0x%X\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), - p_node->rec.node_info.class_version, - p_rec->node_info.class_version); - status = IB_ERROR; - goto Exit; - } - - if ((p_node->comp.node_info.node_type & - p_node->rec.node_info.node_type) != - (p_node->comp.node_info.node_type & p_rec->node_info.node_type)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0017: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected node_type 0x%X, received 0x%X\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), - p_node->rec.node_info.node_type, - p_rec->node_info.node_type); - status = IB_ERROR; - goto Exit; - } - - if ((p_node->comp.node_info.sys_guid & - p_node->rec.node_info.sys_guid) != - (p_node->comp.node_info.sys_guid & p_rec->node_info.sys_guid)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0018: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected sys_guid 0x%016" PRIx64 - ", received 0x%016" PRIx64 "\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), - cl_ntoh64(p_node->rec.node_info.sys_guid), - cl_ntoh64(p_rec->node_info.sys_guid)); - status = IB_ERROR; - goto Exit; - } - - if ((p_node->comp.node_info.node_guid & - p_node->rec.node_info.node_guid) != - (p_node->comp.node_info.node_guid & p_rec->node_info.node_guid)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0019: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected node_guid 0x%016" PRIx64 - ", received 0x%016" PRIx64 "\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), - cl_ntoh64(p_node->rec.node_info.node_guid), - cl_ntoh64(p_rec->node_info.node_guid)); - status = IB_ERROR; - goto Exit; - } - - if ((p_node->comp.node_info.port_guid & - p_node->rec.node_info.port_guid) != - (p_node->comp.node_info.port_guid & p_rec->node_info.port_guid)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0031: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected port_guid 0x%016" PRIx64 - ", received 0x%016" PRIx64 "\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), - cl_ntoh64(p_node->rec.node_info.port_guid), - cl_ntoh64(p_rec->node_info.port_guid)); - status = IB_ERROR; - goto Exit; - } - - if ((p_node->comp.node_info.partition_cap & - p_node->rec.node_info.partition_cap) != - (p_node->comp.node_info.partition_cap & - p_rec->node_info.partition_cap)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0032: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected partition_cap 0x%X, received 0x%X\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), - cl_ntoh16(p_node->rec.node_info.partition_cap), - cl_ntoh16(p_rec->node_info.partition_cap)); - status = IB_ERROR; - goto Exit; - } - - if ((p_node->comp.node_info.device_id & - p_node->rec.node_info.device_id) != - (p_node->comp.node_info.device_id & p_rec->node_info.device_id)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0033: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected device_id 0x%X, received 0x%X\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), - cl_ntoh16(p_node->rec.node_info.device_id), - cl_ntoh16(p_rec->node_info.device_id)); - status = IB_ERROR; - goto Exit; - } - - if ((p_node->comp.node_info.revision & - p_node->rec.node_info.revision) != - (p_node->comp.node_info.revision & p_rec->node_info.revision)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0034: " - "Field mismatch node 0x%016" PRIx64 ", LID 0x%X\n" - "\t\t\t\tExpected revision 0x%X, received 0x%X\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid), - cl_ntoh32(p_node->rec.node_info.revision), - cl_ntoh32(p_rec->node_info.revision)); - status = IB_ERROR; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_node_rec(IN osmtest_t * const p_osmt, - IN const ib_node_record_t * const p_rec) -{ - cl_status_t status = IB_SUCCESS; - node_t *p_node; - const cl_qmap_t *p_tbl; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Find proper node record in the database. - */ - p_tbl = &p_osmt->exp_subn.node_lid_tbl; - p_node = (node_t *) cl_qmap_get(p_tbl, p_rec->lid); - if (p_node == (node_t *) cl_qmap_end(p_tbl)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0035: " - "Unexpected node 0x%016" PRIx64 ", LID 0x%X\n", - cl_ntoh64(p_rec->node_info.node_guid), - cl_ntoh16(p_rec->lid)); - status = IB_ERROR; - goto Exit; - } - - status = osmtest_validate_node_data(p_osmt, p_node, p_rec); - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_port_data(IN osmtest_t * const p_osmt, - IN port_t * const p_port, - IN const ib_portinfo_record_t * const p_rec) -{ - cl_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Checking port LID 0x%X, Num 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num); - - /* - * Has this record already been returned? - */ - if (p_port->count != 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0036: " - "Already received port LID 0x%X, Num 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num); - status = IB_ERROR; - goto Exit; - } - - ++p_port->count; - - /* - * Compare the fields the user wishes to validate. - */ - if ((p_port->comp.lid & p_port->rec.lid) != - (p_port->comp.lid & p_rec->lid)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0037: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected LID 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.lid, p_rec->lid); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_num & p_port->rec.port_num) != - (p_port->comp.port_num & p_rec->port_num)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0038: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected port_num 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_num, p_rec->port_num); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.m_key & p_port->rec.port_info.m_key) != - (p_port->comp.port_info.m_key & p_rec->port_info.m_key)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0039: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected m_key 0x%016" PRIx64 - ", received 0x%016" PRIx64 "\n", cl_ntoh16(p_rec->lid), - p_rec->port_num, p_port->rec.port_info.m_key, - p_rec->port_info.m_key); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.subnet_prefix & p_port->rec.port_info. - subnet_prefix) != - (p_port->comp.port_info.subnet_prefix & p_rec->port_info. - subnet_prefix)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0040: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected subnet_prefix 0x%016" PRIx64 - ", received 0x%016" PRIx64 "\n", cl_ntoh16(p_rec->lid), - p_rec->port_num, p_port->rec.port_info.subnet_prefix, - p_rec->port_info.subnet_prefix); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.base_lid & p_port->rec.port_info. - base_lid) != - (p_port->comp.port_info.base_lid & p_rec->port_info.base_lid)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0041: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected base_lid 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.base_lid, - p_rec->port_info.base_lid); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.master_sm_base_lid & p_port->rec.port_info. - master_sm_base_lid) != - (p_port->comp.port_info.master_sm_base_lid & p_rec->port_info. - master_sm_base_lid)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0042: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected master_sm_base_lid 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.master_sm_base_lid, - p_rec->port_info.master_sm_base_lid); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.capability_mask & p_port->rec.port_info. - capability_mask) != - (p_port->comp.port_info.capability_mask & p_rec->port_info. - capability_mask)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0043: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected capability_mask 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - cl_ntoh32(p_port->rec.port_info.capability_mask), - cl_ntoh32(p_rec->port_info.capability_mask)); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.diag_code & p_port->rec.port_info. - diag_code) != - (p_port->comp.port_info.diag_code & p_rec->port_info.diag_code)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0044: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected diag_code 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.diag_code, - p_rec->port_info.diag_code); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.m_key_lease_period & p_port->rec.port_info. - m_key_lease_period) != - (p_port->comp.port_info.m_key_lease_period & p_rec->port_info. - m_key_lease_period)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0045: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected m_key_lease_period 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.m_key_lease_period, - p_rec->port_info.m_key_lease_period); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.local_port_num & p_port->rec.port_info. - local_port_num) != - (p_port->comp.port_info.local_port_num & p_rec->port_info. - local_port_num)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0046: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected local_port_num 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.local_port_num, - p_rec->port_info.local_port_num); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.link_width_enabled & p_port->rec.port_info. - link_width_enabled) != - (p_port->comp.port_info.link_width_enabled & p_rec->port_info. - link_width_enabled)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0047: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected link_width_enabled 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.link_width_enabled, - p_rec->port_info.link_width_enabled); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.link_width_supported & p_port->rec. - port_info.link_width_supported) != - (p_port->comp.port_info.link_width_supported & p_rec->port_info. - link_width_supported)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0048: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected link_width_supported 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.link_width_supported, - p_rec->port_info.link_width_supported); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.link_width_active & p_port->rec.port_info. - link_width_active) != - (p_port->comp.port_info.link_width_active & p_rec->port_info. - link_width_active)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0049: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected link_width_active 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.link_width_active, - p_rec->port_info.link_width_active); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.link_speed & p_port->rec.port_info. - link_speed) != - (p_port->comp.port_info.link_speed & p_rec->port_info.link_speed)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0054: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected link_speed 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.link_speed, - p_rec->port_info.link_speed); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.state_info1 & p_port->rec.port_info. - state_info1) != - (p_port->comp.port_info.state_info1 & p_rec->port_info. - state_info1)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0055: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected state_info1 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.state_info1, - p_rec->port_info.state_info1); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.state_info2 & p_port->rec.port_info. - state_info2) != - (p_port->comp.port_info.state_info2 & p_rec->port_info. - state_info2)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0058: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected state_info2 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.state_info2, - p_rec->port_info.state_info2); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.mkey_lmc & p_port->rec.port_info. - mkey_lmc) != - (p_port->comp.port_info.mkey_lmc & p_rec->port_info.mkey_lmc)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0059: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected mkey_lmc 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.mkey_lmc, - p_rec->port_info.mkey_lmc); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.link_speed & p_port->rec.port_info. - link_speed) != - (p_port->comp.port_info.link_speed & p_rec->port_info.link_speed)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0060: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected link_speed 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.link_speed, - p_rec->port_info.link_speed); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.mtu_smsl & p_port->rec.port_info. - mtu_smsl) != - (p_port->comp.port_info.mtu_smsl & p_rec->port_info.mtu_smsl)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0061: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected mtu_smsl 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.mtu_smsl, - p_rec->port_info.mtu_smsl); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.vl_cap & p_port->rec.port_info.vl_cap) != - (p_port->comp.port_info.vl_cap & p_rec->port_info.vl_cap)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0062: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected vl_cap 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.vl_cap, p_rec->port_info.vl_cap); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.vl_high_limit & p_port->rec.port_info. - vl_high_limit) != - (p_port->comp.port_info.vl_high_limit & p_rec->port_info. - vl_high_limit)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0082: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected vl_high_limit 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.vl_high_limit, - p_rec->port_info.vl_high_limit); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.vl_arb_high_cap & p_port->rec.port_info. - vl_arb_high_cap) != - (p_port->comp.port_info.vl_arb_high_cap & p_rec->port_info. - vl_arb_high_cap)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0083: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected vl_arb_high_cap 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.vl_arb_high_cap, - p_rec->port_info.vl_arb_high_cap); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.vl_arb_low_cap & p_port->rec.port_info. - vl_arb_low_cap) != - (p_port->comp.port_info.vl_arb_low_cap & p_rec->port_info. - vl_arb_low_cap)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0084: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected vl_arb_low_cap 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.vl_arb_low_cap, - p_rec->port_info.vl_arb_low_cap); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.mtu_cap & p_port->rec.port_info.mtu_cap) != - (p_port->comp.port_info.mtu_cap & p_rec->port_info.mtu_cap)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0085: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected mtu_cap 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.mtu_cap, - p_rec->port_info.mtu_cap); - status = IB_ERROR; - goto Exit; - } -#if 0 - /* this is a dynamic attribute */ - if ((p_port->comp.port_info.vl_stall_life & p_port->rec.port_info. - vl_stall_life) != - (p_port->comp.port_info.vl_stall_life & p_rec->port_info. - vl_stall_life)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 012F: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected vl_stall_life 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.vl_stall_life, - p_rec->port_info.vl_stall_life); - status = IB_ERROR; - goto Exit; - } -#endif - - if ((p_port->comp.port_info.vl_enforce & p_port->rec.port_info. - vl_enforce) != - (p_port->comp.port_info.vl_enforce & p_rec->port_info.vl_enforce)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0086: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected vl_enforce 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.vl_enforce, - p_rec->port_info.vl_enforce); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.m_key_violations & p_port->rec.port_info. - m_key_violations) != - (p_port->comp.port_info.m_key_violations & p_rec->port_info. - m_key_violations)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0087: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected m_key_violations 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - cl_ntoh16(p_port->rec.port_info.m_key_violations), - cl_ntoh16(p_rec->port_info.m_key_violations)); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.p_key_violations & p_port->rec.port_info. - p_key_violations) != - (p_port->comp.port_info.p_key_violations & p_rec->port_info. - p_key_violations)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0088: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected p_key_violations 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - cl_ntoh16(p_port->rec.port_info.p_key_violations), - cl_ntoh16(p_rec->port_info.p_key_violations)); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.q_key_violations & p_port->rec.port_info. - q_key_violations) != - (p_port->comp.port_info.q_key_violations & p_rec->port_info. - q_key_violations)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0089: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected q_key_violations 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - cl_ntoh16(p_port->rec.port_info.q_key_violations), - cl_ntoh16(p_rec->port_info.q_key_violations)); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.guid_cap & p_port->rec.port_info. - guid_cap) != - (p_port->comp.port_info.guid_cap & p_rec->port_info.guid_cap)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0090: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected guid_cap 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.guid_cap, - p_rec->port_info.guid_cap); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.subnet_timeout & p_port->rec.port_info. - subnet_timeout) != - (p_port->comp.port_info.subnet_timeout & p_rec->port_info. - subnet_timeout)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0091: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected subnet_timeout 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - ib_port_info_get_timeout(&p_port->rec.port_info), - ib_port_info_get_timeout(&p_rec->port_info)); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.resp_time_value & p_port->rec.port_info. - resp_time_value) != - (p_port->comp.port_info.resp_time_value & p_rec->port_info. - resp_time_value)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0092: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected resp_time_value 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.resp_time_value, - p_rec->port_info.resp_time_value); - status = IB_ERROR; - goto Exit; - } - - if ((p_port->comp.port_info.error_threshold & p_port->rec.port_info. - error_threshold) != - (p_port->comp.port_info.error_threshold & p_rec->port_info. - error_threshold)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0093: " - "Field mismatch port LID 0x%X Num:0x%X\n" - "\t\t\t\tExpected error_threshold 0x%X, received 0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num, - p_port->rec.port_info.error_threshold, - p_rec->port_info.error_threshold); - status = IB_ERROR; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_port_rec(IN osmtest_t * const p_osmt, - IN const ib_portinfo_record_t * const p_rec) -{ - cl_status_t status = IB_SUCCESS; - port_t *p_port; - const cl_qmap_t *p_tbl; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Find proper port record in the database. - * (we use by guid - since lid is not unique) - */ - p_tbl = &p_osmt->exp_subn.port_key_tbl; - p_port = - (port_t *) cl_qmap_get(p_tbl, - port_gen_id(p_rec->lid, p_rec->port_num)); - if (p_port == (port_t *) cl_qmap_end(p_tbl)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0094: " - "Unexpected port LID 0x%X, Num:0x%X\n", - cl_ntoh16(p_rec->lid), p_rec->port_num); - status = IB_ERROR; - goto Exit; - } - - status = osmtest_validate_port_data(p_osmt, p_port, p_rec); - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_path_rec(IN osmtest_t * const p_osmt, - IN const ib_path_rec_t * const p_rec) -{ - cl_status_t status = IB_SUCCESS; - path_t *p_path; - const cl_qmap_t *p_tbl; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Find proper path record in the database. - */ - p_tbl = &p_osmt->exp_subn.path_tbl; - p_path = (path_t *) cl_qmap_get(p_tbl, osmtest_path_rec_key_get(p_rec)); - if (p_path == (path_t *) cl_qmap_end(p_tbl)) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0095: " - "Unexpected path SLID 0x%X to DLID 0x%X\n", - cl_ntoh16(p_rec->slid), cl_ntoh16(p_rec->dlid)); - status = IB_ERROR; - goto Exit; - } - - status = osmtest_validate_path_data(p_osmt, p_path, p_rec); - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -#ifdef VENDOR_RMPP_SUPPORT -ib_net64_t portguid = 0; - -static ib_api_status_t -osmtest_validate_all_node_recs(IN osmtest_t * const p_osmt) -{ - osmtest_req_context_t context; - const ib_node_record_t *p_rec; - uint32_t i; - cl_status_t status; - size_t num_recs; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all NodeRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_NODE_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0096: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - num_recs = context.result.result_cnt; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", - num_recs); - - /* - * Compare the received records to the database. - */ - osmtest_prepare_db(p_osmt); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_node_rec(context.result.p_result_madw, i); - - status = osmtest_validate_node_rec(p_osmt, p_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0097: " - "osmtest_valid_node_rec failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - if (!portguid) - portguid = p_rec->node_info.port_guid; - } - - status = osmtest_check_missing_nodes(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0098: " - "osmtest_check_missing_nodes failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_all_guidinfo_recs(IN osmtest_t * const p_osmt) -{ - osmtest_req_context_t context; - const ib_guidinfo_record_t *p_rec; - cl_status_t status; - size_t num_recs; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all GuidInfoRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_GUIDINFO_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0099: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - num_recs = context.result.result_cnt; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", - num_recs); - - /* No validation as yet */ - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_all_path_recs(IN osmtest_t * const p_osmt) -{ - osmtest_req_context_t context; - const ib_path_rec_t *p_rec; - uint32_t i; - cl_status_t status; - size_t num_recs; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all PathRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_PATH_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 009A: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - num_recs = context.result.result_cnt; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", - num_recs); - - /* - * Compare the received records to the database. - */ - osmtest_prepare_db(p_osmt); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_path_rec(context.result.p_result_madw, i); - - status = osmtest_validate_path_rec(p_osmt, p_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0100: " - "osmtest_validate_path_rec failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - } - - status = osmtest_check_missing_paths(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0101: " - "osmtest_check_missing_paths failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * Get link record by LID - **********************************************************************/ -ib_api_status_t -osmtest_get_link_rec_by_lid(IN osmtest_t * const p_osmt, - IN ib_net16_t const from_lid, - IN ib_net16_t const to_lid, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_link_record_t record; - ib_mad_t *p_mad; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting link record from LID 0x%02X to LID 0x%02X\n", - cl_ntoh16(from_lid), cl_ntoh16(to_lid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.from_lid = from_lid; - record.to_lid = to_lid; - p_context->p_osmt = p_osmt; - if (from_lid) - user.comp_mask |= IB_LR_COMPMASK_FROM_LID; - if (to_lid) - user.comp_mask |= IB_LR_COMPMASK_TO_LID; - user.attr_id = IB_MAD_ATTR_LINK_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 007A: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 007B: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "osmtest_get_link_rec_by_lid: " - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * Get GUIDInfo record by LID - **********************************************************************/ -ib_api_status_t -osmtest_get_guidinfo_rec_by_lid(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_guidinfo_record_t record; - ib_mad_t *p_mad; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting GUIDInfo record for LID 0x%02X\n", cl_ntoh16(lid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = lid; - p_context->p_osmt = p_osmt; - user.comp_mask = IB_GIR_COMPMASK_LID; - user.attr_id = IB_MAD_ATTR_GUIDINFO_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 007C: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 007D: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * Get PKeyTable record by LID - **********************************************************************/ -ib_api_status_t -osmtest_get_pkeytbl_rec_by_lid(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN ib_net64_t const sm_key, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_pkey_table_record_t record; - ib_mad_t *p_mad; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting PKeyTable record for LID 0x%02X\n", cl_ntoh16(lid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = lid; - p_context->p_osmt = p_osmt; - user.comp_mask = IB_PKEY_COMPMASK_LID; - user.attr_id = IB_MAD_ATTR_PKEY_TBL_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = sm_key; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 007E: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 007F: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * Get SwitchInfo record by LID - **********************************************************************/ -ib_api_status_t -osmtest_get_sw_info_rec_by_lid(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_switch_info_record_t record; - ib_mad_t *p_mad; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting SwitchInfo record for LID 0x%02X\n", cl_ntoh16(lid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = lid; - p_context->p_osmt = p_osmt; - if (lid) - user.comp_mask = IB_SWIR_COMPMASK_LID; - user.attr_id = IB_MAD_ATTR_SWITCH_INFO_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 006C: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 006D: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * Get LFT record by LID - **********************************************************************/ -ib_api_status_t -osmtest_get_lft_rec_by_lid(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_lft_record_t record; - ib_mad_t *p_mad; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting LFT record for LID 0x%02X\n", cl_ntoh16(lid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = lid; - p_context->p_osmt = p_osmt; - if (lid) - user.comp_mask = IB_LFTR_COMPMASK_LID; - user.attr_id = IB_MAD_ATTR_LFT_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 008A: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 008B: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - * Get MFT record by LID - **********************************************************************/ -ib_api_status_t -osmtest_get_mft_rec_by_lid(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_mft_record_t record; - ib_mad_t *p_mad; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Getting MFT record for LID 0x%02X\n", cl_ntoh16(lid)); - - /* - * Do a blocking query for this record in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = lid; - p_context->p_osmt = p_osmt; - if (lid) - user.comp_mask = IB_MFTR_COMPMASK_LID; - user.attr_id = IB_MAD_ATTR_MFT_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 009B: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 009C: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_sminfo_record_request(IN osmtest_t * const p_osmt, - IN uint8_t method, - IN void *p_options, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_sminfo_record_t record; - ib_mad_t *p_mad; - osmtest_sm_info_rec_t *p_sm_info_opt; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Do a blocking query for these records in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - p_context->p_osmt = p_osmt; - user.attr_id = IB_MAD_ATTR_SMINFO_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - p_sm_info_opt = p_options; - if (p_sm_info_opt->sm_guid != 0) { - record.sm_info.guid = p_sm_info_opt->sm_guid; - user.comp_mask |= IB_SMIR_COMPMASK_GUID; - } - if (p_sm_info_opt->lid != 0) { - record.lid = p_sm_info_opt->lid; - user.comp_mask |= IB_SMIR_COMPMASK_LID; - } - if (p_sm_info_opt->priority != 0) { - record.sm_info.pri_state = - (p_sm_info_opt->priority & 0x0F) << 4; - user.comp_mask |= IB_SMIR_COMPMASK_PRIORITY; - } - if (p_sm_info_opt->sm_state != 0) { - record.sm_info.pri_state |= p_sm_info_opt->sm_state & 0x0F; - user.comp_mask |= IB_SMIR_COMPMASK_SMSTATE; - } - - user.method = method; - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 008C: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - if (status != IB_INVALID_PARAMETER) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 008D: " - "ib_query failed (%s)\n", - ib_get_err_str(status)); - } - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_informinfo_request(IN osmtest_t * const p_osmt, - IN ib_net16_t attr_id, - IN uint8_t method, - IN void *p_options, - IN OUT osmtest_req_context_t * const p_context) -{ - ib_api_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_inform_info_t rec; - ib_inform_info_record_t record; - ib_mad_t *p_mad; - osmtest_inform_info_t *p_inform_info_opt; - osmtest_inform_info_rec_t *p_inform_info_rec_opt; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Do a blocking query for these records in the subnet. - * The result is returned in the result field of the caller's - * context structure. - * - * The query structures are locals. - */ - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&rec, 0, sizeof(rec)); - memset(&record, 0, sizeof(record)); - - p_context->p_osmt = p_osmt; - user.attr_id = attr_id; - if (attr_id == IB_MAD_ATTR_INFORM_INFO_RECORD) { - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - p_inform_info_rec_opt = p_options; - if (p_inform_info_rec_opt->subscriber_gid.unicast.prefix != 0 && - p_inform_info_rec_opt->subscriber_gid.unicast. - interface_id != 0) { - record.subscriber_gid = - p_inform_info_rec_opt->subscriber_gid; - user.comp_mask = IB_IIR_COMPMASK_SUBSCRIBERGID; - } - record.subscriber_enum = - cl_hton16(p_inform_info_rec_opt->subscriber_enum); - user.comp_mask |= IB_IIR_COMPMASK_ENUM; - user.p_attr = &record; - } else { - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(rec)); - /* comp mask bits below are for InformInfoRecord rather than InformInfo */ - /* as currently no comp mask bits defined for InformInfo!!! */ - user.comp_mask = IB_IIR_COMPMASK_SUBSCRIBE; - p_inform_info_opt = p_options; - rec.subscribe = (uint8_t) p_inform_info_opt->subscribe; - if (p_inform_info_opt->qpn) { - rec.g_or_v.generic.qpn_resp_time_val = - cl_hton32(p_inform_info_opt->qpn << 8); - user.comp_mask |= IB_IIR_COMPMASK_QPN; - } - if (p_inform_info_opt->trap) { - rec.g_or_v.generic.trap_num = - cl_hton16(p_inform_info_opt->trap); - user.comp_mask |= IB_IIR_COMPMASK_TRAPNUMB; - } - user.p_attr = &rec; - } - user.method = method; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = p_context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 008E: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = p_context->result.status; - - if (status != IB_SUCCESS) { - if (status != IB_INVALID_PARAMETER) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 008F: " - "ib_query failed (%s)\n", - ib_get_err_str(status)); - } - if (status == IB_REMOTE_ERROR) { - p_mad = - osm_madw_get_mad_ptr(p_context->result. - p_result_madw); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(p_mad)); - - status = - (ib_net16_t) (p_mad->status & IB_SMP_STATUS_MASK); - } - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} -#endif - -static ib_api_status_t -osmtest_validate_single_path_rec_lid_pair(IN osmtest_t * const p_osmt, - IN path_t * const p_path) -{ - osmtest_req_context_t context; - const ib_path_rec_t *p_rec; - cl_status_t status = IB_SUCCESS; - size_t num_recs; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - status = osmtest_get_path_rec_by_lid_pair(p_osmt, - p_path->rec.slid, - p_path->rec.dlid, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0102: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - num_recs = context.result.result_cnt; - if (num_recs != 1) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0103: " - "Too many records. Expected 1, received %u\n", - num_recs); - - status = IB_ERROR; - } else { - p_rec = - osmv_get_query_path_rec(context.result.p_result_madw, 0); - - status = osmtest_validate_path_data(p_osmt, p_path, p_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0104: " - "osmtest_validate_path_data failed (%s)\n", - ib_get_err_str(status)); - } - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_single_node_rec_lid(IN osmtest_t * const p_osmt, - IN ib_net16_t const lid, - IN node_t * const p_node) -{ - cl_status_t status = IB_SUCCESS; - osmv_user_query_t user; - osmv_query_req_t req; - ib_node_record_t record; - - osmtest_req_context_t context; - const ib_node_record_t *p_rec; - int num_recs, i; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Getting NodeRecord for node with LID 0x%X\n", cl_ntoh16(lid)); - - memset(&context, 0, sizeof(context)); - memset(&req, 0, sizeof(req)); - memset(&user, 0, sizeof(user)); - memset(&record, 0, sizeof(record)); - - record.lid = lid; - - context.p_osmt = p_osmt; - user.comp_mask = IB_NR_COMPMASK_LID; - user.attr_id = IB_MAD_ATTR_NODE_RECORD; - user.attr_offset = ib_get_attr_offset((uint16_t) sizeof(record)); - user.p_attr = &record; - - req.query_type = OSMV_QUERY_USER_DEFINED; - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - req.p_query_input = &user; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0105: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0106: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - } - goto Exit; - } - - num_recs = context.result.result_cnt; - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Received %d nodes\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_node_rec(context.result.p_result_madw, i); - - status = osmtest_validate_node_rec(p_osmt, p_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0107: " - "osmtest_validate_node_data failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_single_port_rec_lid(IN osmtest_t * const p_osmt, - IN port_t * const p_port) -{ - osmtest_req_context_t context; - - const ib_portinfo_record_t *p_rec; - cl_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&context, 0, sizeof(context)); - - context.p_osmt = p_osmt; - osmtest_get_port_rec_by_num(p_osmt, - p_port->rec.lid, - p_port->rec.port_num, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0108: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - goto Exit; - } - - /* we should have got exactly one port */ - p_rec = osmv_get_query_portinfo_rec(context.result.p_result_madw, 0); - status = osmtest_validate_port_rec(p_osmt, p_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0109: " - "osmtest_validate_port_data failed (%s)\n", - ib_get_err_str(status)); - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_single_path_rec_guid_pair(IN osmtest_t * const p_osmt, - IN const osmv_guid_pair_t * - const p_pair) -{ - osmtest_req_context_t context; - const ib_path_rec_t *p_rec; - cl_status_t status = IB_SUCCESS; - size_t num_recs; - osmv_query_req_t req; - uint32_t i; - boolean_t got_error = FALSE; - - OSM_LOG_ENTER(&p_osmt->log); - - memset(&req, 0, sizeof(req)); - memset(&context, 0, sizeof(context)); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "\n\t\t\t\tChecking src 0x%016" PRIx64 - " to dest 0x%016" PRIx64 "\n", - cl_ntoh64(p_pair->src_guid), cl_ntoh64(p_pair->dest_guid)); - - context.p_osmt = p_osmt; - - req.timeout_ms = p_osmt->opt.transaction_timeout; - req.retry_cnt = p_osmt->opt.retry_count; - req.flags = OSM_SA_FLAGS_SYNC; - req.query_context = &context; - req.pfn_query_cb = osmtest_query_res_cb; - - req.query_type = OSMV_QUERY_PATH_REC_BY_PORT_GUIDS; - req.p_query_input = p_pair; - req.sm_key = 0; - - status = osmv_query_sa(p_osmt->h_bind, &req); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0110: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - goto Exit; - } - - status = context.result.status; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0111: " - "ib_query failed (%s)\n", ib_get_err_str(status)); - - if (status == IB_REMOTE_ERROR) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Remote error = %s\n", - ib_get_mad_status_str(osm_madw_get_mad_ptr - (context.result. - p_result_madw))); - } - goto Exit; - } - - num_recs = context.result.result_cnt; - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "%u records\n", num_recs); - - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_path_rec(context.result.p_result_madw, i); - - /* - * Make sure the GUID values are correct - */ - if (p_rec->dgid.unicast.interface_id != p_pair->dest_guid) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0112: " - "Destination GUID mismatch\n" - "\t\t\t\texpected 0x%016" PRIx64 - ", received 0x%016" PRIx64 "\n", - cl_ntoh64(p_pair->dest_guid), - cl_ntoh64(p_rec->dgid.unicast.interface_id)); - got_error = TRUE; - } - - if (p_rec->sgid.unicast.interface_id != p_pair->src_guid) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0113: " - "Source GUID mismatch\n" - "\t\t\t\texpected 0x%016" PRIx64 - ", received 0x%016" PRIx64 ".\n", - cl_ntoh64(p_pair->src_guid), - cl_ntoh64(p_rec->sgid.unicast.interface_id)); - got_error = TRUE; - } - - status = osmtest_validate_path_rec(p_osmt, p_rec); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0114: " - "osmtest_validate_path_rec failed (%s)\n", - ib_get_err_str(status)); - got_error = TRUE; - } - if (got_error || (status != IB_SUCCESS)) { - osm_dump_path_record(&p_osmt->log, p_rec, - OSM_LOG_VERBOSE); - if (status == IB_SUCCESS) - status = IB_ERROR; - goto Exit; - } - } - -Exit: - /* - * Return the IB query MAD to the pool as necessary. - */ - if (context.result.p_result_madw != NULL) { - osm_mad_pool_put(&p_osmt->mad_pool, - context.result.p_result_madw); - context.result.p_result_madw = NULL; - } - - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_single_path_recs(IN osmtest_t * const p_osmt) -{ - path_t *p_path; - cl_status_t status = IB_SUCCESS; - const cl_qmap_t *p_path_tbl; -/* We skip node to node path record validation since it might contains - NONEXISTENT PATHS, i.e. when using UPDN */ - osmv_guid_pair_t guid_pair; - uint16_t cnt; - - OSM_LOG_ENTER(&p_osmt->log); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Validating individual path record queries\n"); - p_path_tbl = &p_osmt->exp_subn.path_tbl; - - osmtest_prepare_db(p_osmt); - - /* - * Walk the list of all path records, and ask for each one - * specifically. Make sure we get it. - */ - cnt = 0; - p_path = (path_t *) cl_qmap_head(p_path_tbl); - while (p_path != (path_t *) cl_qmap_end(p_path_tbl)) { - status = - osmtest_validate_single_path_rec_lid_pair(p_osmt, p_path); - if (status != IB_SUCCESS) - goto Exit; - cnt++; - p_path = (path_t *) cl_qmap_next(&p_path->map_item); - } - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Total of %u path records validated using LID based query\n", - cnt); - - status = osmtest_check_missing_paths(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0115: " - "osmtest_check_missing_paths failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Do the whole thing again with port GUID pairs. - * Note that multiple path records may be returned - * for each guid pair if LMC > 0. - */ - osmtest_prepare_db(p_osmt); - cnt = 0; - p_path = (path_t *) cl_qmap_head(p_path_tbl); - while (p_path != (path_t *) cl_qmap_end(p_path_tbl)) { - guid_pair.src_guid = p_path->rec.sgid.unicast.interface_id; - guid_pair.dest_guid = p_path->rec.dgid.unicast.interface_id; - status = osmtest_validate_single_path_rec_guid_pair(p_osmt, - &guid_pair); - if (status != IB_SUCCESS) - goto Exit; - cnt++; - p_path = (path_t *) cl_qmap_next(&p_path->map_item); - } - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Total of %u path records validated using GUID based query\n", - cnt); - - status = osmtest_check_missing_paths(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0116: " - "osmtest_check_missing_paths failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_single_node_recs(IN osmtest_t * const p_osmt) -{ - node_t *p_node; - cl_status_t status = IB_SUCCESS; - const cl_qmap_t *p_node_lid_tbl; - uint16_t cnt = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - p_node_lid_tbl = &p_osmt->exp_subn.node_lid_tbl; - - osmtest_prepare_db(p_osmt); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Validating individual node record queries\n"); - - /* - * Walk the list of all node records, and ask for each one - * specifically. Make sure we get it. - */ - p_node = (node_t *) cl_qmap_head(p_node_lid_tbl); - while (p_node != (node_t *) cl_qmap_end(p_node_lid_tbl)) { - status = osmtest_validate_single_node_rec_lid(p_osmt, - (ib_net16_t) - cl_qmap_key((cl_map_item_t *) p_node), p_node); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 011A: " - "osmtest_validate_single_node_rec_lid (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - cnt++; - p_node = (node_t *) cl_qmap_next(&p_node->map_item); - } - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Total of %u node records validated\n", cnt); - - status = osmtest_check_missing_nodes(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0117: " - "osmtest_check_missing_nodes (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_validate_single_port_recs(IN osmtest_t * const p_osmt) -{ - port_t *p_port; - cl_status_t status = IB_SUCCESS; - const cl_qmap_t *p_port_key_tbl; - uint16_t cnt = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - p_port_key_tbl = &p_osmt->exp_subn.port_key_tbl; - - osmtest_prepare_db(p_osmt); - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Validating individual port record queries\n"); - - /* - * Walk the list of all port records, and ask for each one - * specifically. Make sure we get it. - */ - p_port = (port_t *) cl_qmap_head(p_port_key_tbl); - while (p_port != (port_t *) cl_qmap_end(p_port_key_tbl)) { - status = osmtest_validate_single_port_rec_lid(p_osmt, p_port); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 011B: " - "osmtest_validate_single_port_rec_lid (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - cnt++; - p_port = (port_t *) cl_qmap_next(&p_port->map_item); - } - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, - "Total of %u port records validated\n", cnt); - - status = osmtest_check_missing_ports(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0118: " - "osmtest_check_missing_paths failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t osmtest_validate_against_db(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status = IB_SUCCESS; - ib_gid_t portgid, mgid; - osmtest_sm_info_rec_t sm_info_rec_opt; - osmtest_inform_info_t inform_info_opt; - osmtest_inform_info_rec_t inform_info_rec_opt; -#ifdef VENDOR_RMPP_SUPPORT - ib_net64_t sm_key; - ib_net16_t test_lid; - uint8_t lmc; - osmtest_req_context_t context; -#ifdef DUAL_SIDED_RMPP - osmv_multipath_req_t request; -#endif - uint8_t i; -#endif - - OSM_LOG_ENTER(&p_osmt->log); - -#ifdef VENDOR_RMPP_SUPPORT - status = osmtest_validate_all_node_recs(p_osmt); - if (status != IB_SUCCESS) - goto Exit; -#endif - - status = osmtest_validate_single_node_recs(p_osmt); - if (status != IB_SUCCESS) - goto Exit; - - /* Exercise SA PathRecord multicast destination code */ - memset(&context, 0, sizeof(context)); - ib_gid_set_default(&portgid, portguid); - /* Set IPoIB broadcast MGID */ - mgid.unicast.prefix = CL_HTON64(0xff12401bffff0000ULL); - mgid.unicast.interface_id = CL_HTON64(0x00000000ffffffffULL); - /* Can't check status as don't know whether port is running IPoIB */ - osmtest_get_path_rec_by_gid_pair(p_osmt, portgid, mgid, &context); - - /* Other link local unicast PathRecord */ - memset(&context, 0, sizeof(context)); - ib_gid_set_default(&portgid, portguid); - ib_gid_set_default(&mgid, portguid); - mgid.raw[7] = 0xff; /* not default GID prefix */ - /* Can't check status as don't know whether ??? */ - osmtest_get_path_rec_by_gid_pair(p_osmt, portgid, mgid, &context); - - /* Off subnet (site local) unicast PathRecord */ - memset(&context, 0, sizeof(context)); - ib_gid_set_default(&portgid, portguid); - ib_gid_set_default(&mgid, portguid); - mgid.raw[1] = 0xc0; /* site local */ - /* Can't check status as don't know whether ??? */ - osmtest_get_path_rec_by_gid_pair(p_osmt, portgid, mgid, &context); - - /* More than link local scope multicast PathRecord */ - memset(&context, 0, sizeof(context)); - ib_gid_set_default(&portgid, portguid); - /* Set IPoIB broadcast MGID */ - mgid.unicast.prefix = CL_HTON64(0xff15401bffff0000ULL); /* site local */ - mgid.unicast.interface_id = CL_HTON64(0x00000000ffffffffULL); - /* Can't check status as don't know whether port is running IPoIB */ - osmtest_get_path_rec_by_gid_pair(p_osmt, portgid, mgid, &context); - -#if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP) - memset(&context, 0, sizeof(context)); - memset(&request, 0, sizeof(request)); - request.comp_mask = - IB_MPR_COMPMASK_SGIDCOUNT | IB_MPR_COMPMASK_DGIDCOUNT; - request.sgid_count = 1; - request.dgid_count = 1; - ib_gid_set_default(&request.gids[0], portguid); - ib_gid_set_default(&request.gids[1], portguid); - status = osmtest_get_multipath_rec(p_osmt, &request, &context); - if (status != IB_SUCCESS) - goto Exit; - - memset(&context, 0, sizeof(context)); - memset(&request, 0, sizeof(request)); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmtest_get_multipath_rec(p_osmt, &request, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Got error %s\n", ib_get_err_str(status)); - } - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } - - memset(&context, 0, sizeof(context)); - memset(&request, 0, sizeof(request)); - request.comp_mask = IB_MPR_COMPMASK_SGIDCOUNT; - request.sgid_count = 1; - ib_gid_set_default(&request.gids[0], portguid); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmtest_get_multipath_rec(p_osmt, &request, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Got error %s\n", ib_get_err_str(status)); - } - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } - - memset(&context, 0, sizeof(context)); - memset(&request, 0, sizeof(request)); - request.comp_mask = - IB_MPR_COMPMASK_SGIDCOUNT | IB_MPR_COMPMASK_DGIDCOUNT; - request.sgid_count = 1; - request.dgid_count = 1; - ib_gid_set_default(&request.gids[0], portguid); - /* Set IPoIB broadcast MGID as DGID */ - request.gids[1].unicast.prefix = CL_HTON64(0xff12401bffff0000ULL); - request.gids[1].unicast.interface_id = CL_HTON64(0x00000000ffffffffULL); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmtest_get_multipath_rec(p_osmt, &request, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Got error %s\n", ib_get_err_str(status)); - } - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } - - memset(&context, 0, sizeof(context)); - request.comp_mask = - IB_MPR_COMPMASK_SGIDCOUNT | IB_MPR_COMPMASK_DGIDCOUNT; - request.sgid_count = 1; - request.dgid_count = 1; - /* Set IPoIB broadcast MGID as SGID */ - request.gids[0].unicast.prefix = CL_HTON64(0xff12401bffff0000ULL); - request.gids[0].unicast.interface_id = CL_HTON64(0x00000000ffffffffULL); - ib_gid_set_default(&request.gids[1], portguid); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmtest_get_multipath_rec(p_osmt, &request, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Got error %s\n", ib_get_err_str(status)); - } - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } - - memset(&context, 0, sizeof(context)); - memset(&request, 0, sizeof(request)); - request.comp_mask = - IB_MPR_COMPMASK_SGIDCOUNT | IB_MPR_COMPMASK_DGIDCOUNT | - IB_MPR_COMPMASK_NUMBPATH; - request.sgid_count = 2; - request.dgid_count = 2; - request.num_path = 2; - ib_gid_set_default(&request.gids[0], portguid); - ib_gid_set_default(&request.gids[1], portguid); - ib_gid_set_default(&request.gids[2], portguid); - ib_gid_set_default(&request.gids[3], portguid); - status = osmtest_get_multipath_rec(p_osmt, &request, &context); - if (status != IB_SUCCESS) - goto Exit; -#endif - -#ifdef VENDOR_RMPP_SUPPORT - /* GUIDInfoRecords */ - status = osmtest_validate_all_guidinfo_recs(p_osmt); - if (status != IB_SUCCESS) - goto Exit; - - /* If LMC > 0, test non base LID SA PortInfoRecord request */ - status = - osmtest_get_local_port_lmc(p_osmt, p_osmt->local_port.lid, &lmc); - if (status != IB_SUCCESS) - goto Exit; - - if (lmc != 0) { - status = - osmtest_get_local_port_lmc(p_osmt, - p_osmt->local_port.lid + 1, - NULL); - if (status != IB_SUCCESS) - goto Exit; - } - - status = osmtest_get_local_port_lmc(p_osmt, 0xffff, NULL); - if (status != IB_SUCCESS) - goto Exit; - - test_lid = cl_ntoh16(p_osmt->local_port.lid); - - /* More GUIDInfo Record tests */ - memset(&context, 0, sizeof(context)); - status = osmtest_get_guidinfo_rec_by_lid(p_osmt, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - memset(&context, 0, sizeof(context)); - status = osmtest_get_guidinfo_rec_by_lid(p_osmt, 0xffff, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Some PKeyTable Record tests */ - sm_key = OSM_DEFAULT_SM_KEY; - memset(&context, 0, sizeof(context)); - status = - osmtest_get_pkeytbl_rec_by_lid(p_osmt, test_lid, sm_key, &context); - if (status != IB_SUCCESS) - goto Exit; - - memset(&context, 0, sizeof(context)); - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n"); - status = osmtest_get_pkeytbl_rec_by_lid(p_osmt, test_lid, 0, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Got error %s\n", ib_get_err_str(status)); - } - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } - - memset(&context, 0, sizeof(context)); - status = - osmtest_get_pkeytbl_rec_by_lid(p_osmt, 0xffff, sm_key, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* SwitchInfo Record tests */ - memset(&context, 0, sizeof(context)); - status = osmtest_get_sw_info_rec_by_lid(p_osmt, 0, &context); - if (status != IB_SUCCESS) - goto Exit; - - memset(&context, 0, sizeof(context)); - status = osmtest_get_sw_info_rec_by_lid(p_osmt, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* LFT Record tests */ - memset(&context, 0, sizeof(context)); - status = osmtest_get_lft_rec_by_lid(p_osmt, 0, &context); - if (status != IB_SUCCESS) - goto Exit; - - memset(&context, 0, sizeof(context)); - status = osmtest_get_lft_rec_by_lid(p_osmt, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* MFT Record tests */ - memset(&context, 0, sizeof(context)); - status = osmtest_get_mft_rec_by_lid(p_osmt, 0, &context); - if (status != IB_SUCCESS) - goto Exit; - - memset(&context, 0, sizeof(context)); - status = osmtest_get_mft_rec_by_lid(p_osmt, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Some LinkRecord tests */ - /* FromLID */ - memset(&context, 0, sizeof(context)); - status = osmtest_get_link_rec_by_lid(p_osmt, test_lid, 0, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* ToLID */ - memset(&context, 0, sizeof(context)); - status = osmtest_get_link_rec_by_lid(p_osmt, 0, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* FromLID & ToLID */ - memset(&context, 0, sizeof(context)); - status = - osmtest_get_link_rec_by_lid(p_osmt, test_lid, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* NodeRecord test */ - memset(&context, 0, sizeof(context)); - status = osmtest_get_node_rec_by_lid(p_osmt, 0xffff, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* SMInfoRecord tests */ - memset(&sm_info_rec_opt, 0, sizeof(sm_info_rec_opt)); - memset(&context, 0, sizeof(context)); - status = osmtest_sminfo_record_request(p_osmt, IB_MAD_METHOD_SET, - &sm_info_rec_opt, &context); - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "IS EXPECTED ERROR ^^^^\n"); - } - - memset(&sm_info_rec_opt, 0, sizeof(sm_info_rec_opt)); - memset(&context, 0, sizeof(context)); - status = osmtest_sminfo_record_request(p_osmt, IB_MAD_METHOD_GETTABLE, - &sm_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - memset(&sm_info_rec_opt, 0, sizeof(sm_info_rec_opt)); - sm_info_rec_opt.lid = test_lid; /* local LID */ - memset(&context, 0, sizeof(context)); - status = osmtest_sminfo_record_request(p_osmt, IB_MAD_METHOD_GETTABLE, - &sm_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - if (portguid != 0) { - memset(&sm_info_rec_opt, 0, sizeof(sm_info_rec_opt)); - sm_info_rec_opt.sm_guid = portguid; /* local GUID */ - memset(&context, 0, sizeof(context)); - status = - osmtest_sminfo_record_request(p_osmt, - IB_MAD_METHOD_GETTABLE, - &sm_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - } - - for (i = 1; i < 16; i++) { - memset(&sm_info_rec_opt, 0, sizeof(sm_info_rec_opt)); - sm_info_rec_opt.priority = i; - memset(&context, 0, sizeof(context)); - status = - osmtest_sminfo_record_request(p_osmt, - IB_MAD_METHOD_GETTABLE, - &sm_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - } - - for (i = 1; i < 4; i++) { - memset(&sm_info_rec_opt, 0, sizeof(sm_info_rec_opt)); - sm_info_rec_opt.sm_state = i; - memset(&context, 0, sizeof(context)); - status = - osmtest_sminfo_record_request(p_osmt, - IB_MAD_METHOD_GETTABLE, - &sm_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - } - - /* InformInfoRecord tests */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfoRecord " - "Sending a BAD - Set Unsubscribe request\n"); - memset(&inform_info_opt, 0, sizeof(inform_info_opt)); - memset(&inform_info_rec_opt, 0, sizeof(inform_info_rec_opt)); - memset(&context, 0, sizeof(context)); - status = - osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO_RECORD, - IB_MAD_METHOD_SET, &inform_info_rec_opt, - &context); - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "InformInfoRecord " - "IS EXPECTED ERROR ^^^^\n"); - } - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfoRecord " - "Sending a Good - Empty GetTable request\n"); - memset(&context, 0, sizeof(context)); - status = - osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO_RECORD, - IB_MAD_METHOD_GETTABLE, - &inform_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* InformInfo tests */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfo " - "Sending a BAD - Empty Get request " - "(should fail with NO_RECORDS)\n"); - memset(&context, 0, sizeof(context)); - status = osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO, - IB_MAD_METHOD_GET, &inform_info_opt, - &context); - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "InformInfo " - "IS EXPECTED ERROR ^^^^\n"); - } - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfo " - "Sending a BAD - Set Unsubscribe request\n"); - memset(&context, 0, sizeof(context)); - status = osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO, - IB_MAD_METHOD_SET, &inform_info_opt, - &context); - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } else { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "InformInfo UnSubscribe " - "IS EXPECTED ERROR ^^^^\n"); - } - - /* Now subscribe */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfo " - "Sending a Good - Set Subscribe request\n"); - inform_info_opt.subscribe = TRUE; - memset(&context, 0, sizeof(context)); - status = osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO, - IB_MAD_METHOD_SET, &inform_info_opt, - &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Now unsubscribe (QPN needs to be 1 to work) */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfo " - "Sending a Good - Set Unsubscribe request\n"); - inform_info_opt.subscribe = FALSE; - inform_info_opt.qpn = 1; - memset(&context, 0, sizeof(context)); - status = osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO, - IB_MAD_METHOD_SET, &inform_info_opt, - &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Now subscribe again */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfo " - "Sending a Good - Set Subscribe request\n"); - inform_info_opt.subscribe = TRUE; - inform_info_opt.qpn = 1; - memset(&context, 0, sizeof(context)); - status = osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO, - IB_MAD_METHOD_SET, &inform_info_opt, - &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Subscribe over existing subscription */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfo " - "Sending a Good - Set Subscribe (again) request\n"); - inform_info_opt.qpn = 0; - memset(&context, 0, sizeof(context)); - status = osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO, - IB_MAD_METHOD_SET, &inform_info_opt, - &context); - if (status != IB_SUCCESS) - goto Exit; - - /* More InformInfoRecord tests */ - /* RID lookup (with currently invalid enum) */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfoRecord " - "Sending a Good - GetTable by GID\n"); - ib_gid_set_default(&inform_info_rec_opt.subscriber_gid, - p_osmt->local_port.port_guid); - inform_info_rec_opt.subscriber_enum = 1; - memset(&context, 0, sizeof(context)); - status = - osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO_RECORD, - IB_MAD_METHOD_GETTABLE, - &inform_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Enum lookup */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfoRecord " - "Sending a Good - GetTable (subscriber_enum == 0) request\n"); - inform_info_rec_opt.subscriber_enum = 0; - memset(&context, 0, sizeof(context)); - status = - osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO_RECORD, - IB_MAD_METHOD_GETTABLE, - &inform_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Get all InformInfoRecords */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfoRecord " - "Sending a Good - GetTable (ALL records) request\n"); - memset(&inform_info_rec_opt, 0, sizeof(inform_info_rec_opt)); - memset(&context, 0, sizeof(context)); - status = - osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO_RECORD, - IB_MAD_METHOD_GETTABLE, - &inform_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Another subscription */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfo " - "Sending another Good - Set Subscribe (again) request\n"); - inform_info_opt.qpn = 0; - inform_info_opt.trap = 0x1234; - memset(&context, 0, sizeof(context)); - status = osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO, - IB_MAD_METHOD_SET, &inform_info_opt, - &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Get all InformInfoRecords again */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfoRecord " - "Sending a Good - GetTable (ALL records) request\n"); - memset(&inform_info_rec_opt, 0, sizeof(inform_info_rec_opt)); - memset(&context, 0, sizeof(context)); - status = - osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO_RECORD, - IB_MAD_METHOD_GETTABLE, - &inform_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Cleanup subscriptions before further testing */ - /* Does order of deletion matter ? Test this !!! */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfo " - "Sending a Good - Set (cleanup) request\n"); - inform_info_opt.subscribe = FALSE; - inform_info_opt.qpn = 1; - memset(&context, 0, sizeof(context)); - status = osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO, - IB_MAD_METHOD_SET, - &inform_info_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Get all InformInfoRecords again */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfoRecord " - "Sending a Good - GetTable (ALL records) request\n"); - memset(&inform_info_rec_opt, 0, sizeof(inform_info_rec_opt)); - memset(&context, 0, sizeof(context)); - status = - osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO_RECORD, - IB_MAD_METHOD_GETTABLE, - &inform_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfo" - "Sending a Good - Set (cleanup) request\n"); - inform_info_opt.subscribe = FALSE; - inform_info_opt.qpn = 1; - inform_info_opt.trap = 0; - memset(&context, 0, sizeof(context)); - status = osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO, - IB_MAD_METHOD_SET, - &inform_info_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Get all InformInfoRecords a final time */ - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "InformInfoRecord " - "Sending a Good - GetTable (ALL records) request\n"); - memset(&inform_info_rec_opt, 0, sizeof(inform_info_rec_opt)); - memset(&context, 0, sizeof(context)); - status = - osmtest_informinfo_request(p_osmt, IB_MAD_ATTR_INFORM_INFO_RECORD, - IB_MAD_METHOD_GETTABLE, - &inform_info_rec_opt, &context); - if (status != IB_SUCCESS) - goto Exit; - - if (lmc != 0) { - test_lid = cl_ntoh16(p_osmt->local_port.lid + 1); - - /* Another GUIDInfo Record test */ - memset(&context, 0, sizeof(context)); - status = - osmtest_get_guidinfo_rec_by_lid(p_osmt, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Another PKeyTable Record test */ - memset(&context, 0, sizeof(context)); - status = - osmtest_get_pkeytbl_rec_by_lid(p_osmt, test_lid, sm_key, - &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Another SwitchInfo Record test */ - memset(&context, 0, sizeof(context)); - status = - osmtest_get_sw_info_rec_by_lid(p_osmt, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Another LFT Record test */ - memset(&context, 0, sizeof(context)); - status = osmtest_get_lft_rec_by_lid(p_osmt, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Another MFT Record test */ - memset(&context, 0, sizeof(context)); - status = osmtest_get_mft_rec_by_lid(p_osmt, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* More LinkRecord tests */ - /* FromLID */ - memset(&context, 0, sizeof(context)); - status = - osmtest_get_link_rec_by_lid(p_osmt, test_lid, 0, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* ToLID */ - memset(&context, 0, sizeof(context)); - status = - osmtest_get_link_rec_by_lid(p_osmt, 0, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - - /* Another NodeRecord test */ - memset(&context, 0, sizeof(context)); - status = - osmtest_get_node_rec_by_lid(p_osmt, test_lid, &context); - if (status != IB_SUCCESS) - goto Exit; - } - - /* PathRecords */ - if (!p_osmt->opt.ignore_path_records) { - status = osmtest_validate_all_path_recs(p_osmt); - if (status != IB_SUCCESS) - goto Exit; - - if (lmc != 0) { - memset(&context, 0, sizeof(context)); - status = - osmtest_get_path_rec_by_lid_pair(p_osmt, test_lid, - test_lid, - &context); - if (status != IB_SUCCESS) - goto Exit; - - memset(&context, 0, sizeof(context)); - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - EXPECTING_ERRORS_START "\n"); - status = - osmtest_get_path_rec_by_lid_pair(p_osmt, 0xffff, - 0xffff, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Got error %s\n", - ib_get_err_str(status)); - } - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - EXPECTING_ERRORS_START "\n"); - - status = - osmtest_get_path_rec_by_lid_pair(p_osmt, test_lid, - 0xffff, &context); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "Got error %s\n", - ib_get_err_str(status)); - } - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - EXPECTING_ERRORS_END "\n"); - - if (status == IB_SUCCESS) { - status = IB_ERROR; - goto Exit; - } - } - } -#endif - - status = osmtest_validate_single_port_recs(p_osmt); - if (status != IB_SUCCESS) - goto Exit; - - if (!p_osmt->opt.ignore_path_records) { - status = osmtest_validate_single_path_recs(p_osmt); - if (status != IB_SUCCESS) - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static const osmtest_token_t *str_get_token(IN char *const p_str) -{ - const osmtest_token_t *p_tok; - uint32_t index = 0; - - p_tok = &token_array[index]; - - while (p_tok->val != OSMTEST_TOKEN_UNKNOWN) { - if (strncasecmp(p_str, p_tok->str, p_tok->str_size) == 0) - return (p_tok); - - p_tok = &token_array[++index]; - } - - return (NULL); -} - -/********************************************************************** - Returns true if not whitespace character encountered before EOL. -**********************************************************************/ -static boolean_t -str_skip_white(IN char line[], IN OUT uint32_t * const p_offset) -{ - while (((line[*p_offset] == '\t') || - (line[*p_offset] == ' ')) && - (line[*p_offset] != '\n') && (line[*p_offset] != '\0')) { - ++*p_offset; - } - - if ((line[*p_offset] == '\n') || (line[*p_offset] == '\0')) - return (FALSE); - else - return (TRUE); -} - -/********************************************************************** - Returns true if not whitespace character encountered before EOL. -**********************************************************************/ -static void str_skip_token(IN char line[], IN OUT uint32_t * const p_offset) -{ - while ((line[*p_offset] != '\t') && - (line[*p_offset] != ' ') && (line[*p_offset] != '\0')) { - ++*p_offset; - } -} - -static ib_api_status_t -osmtest_parse_node(IN osmtest_t * const p_osmt, - IN FILE * const fh, IN OUT uint32_t * const p_line_num) -{ - ib_api_status_t status = IB_SUCCESS; - uint32_t offset; - char line[OSMTEST_MAX_LINE_LEN]; - boolean_t done = FALSE; - node_t *p_node; - node_t *p_guid_node; - const osmtest_token_t *p_tok; - - OSM_LOG_ENTER(&p_osmt->log); - - p_node = node_new(); - CL_ASSERT(p_node != NULL); - - /* - * Parse the inventory file and create the database. - */ - while (!done) { - if (fgets(line, OSMTEST_MAX_LINE_LEN, fh) == NULL) { - /* - * End of file in the middle of a definition. - */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0119: " - "Unexpected end of file\n"); - status = IB_ERROR; - goto Exit; - } - - ++*p_line_num; - - /* - * Skip whitespace - */ - offset = 0; - if (!str_skip_white(line, &offset)) - continue; /* whole line was whitespace */ - - p_tok = str_get_token(&line[offset]); - if (p_tok == NULL) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0120: " - "Ignoring line %u with unknown token: %s\n", - *p_line_num, &line[offset]); - continue; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Found '%s' (line %u)\n", p_tok->str, *p_line_num); - - str_skip_token(line, &offset); - - switch (p_tok->val) { - case OSMTEST_TOKEN_COMMENT: - break; - - case OSMTEST_TOKEN_LID: - p_node->comp.lid = 0xFFFF; - p_node->rec.lid = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "lid = 0x%X\n", - cl_ntoh16(p_node->rec.lid)); - break; - - case OSMTEST_TOKEN_BASE_VERSION: - p_node->comp.node_info.base_version = 0xFF; - p_node->rec.node_info.base_version = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "base_version = 0x%X\n", - p_node->rec.node_info.base_version); - break; - - case OSMTEST_TOKEN_CLASS_VERSION: - p_node->comp.node_info.class_version = 0xFF; - p_node->rec.node_info.class_version = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "class_version = 0x%X\n", - p_node->rec.node_info.class_version); - break; - - case OSMTEST_TOKEN_NODE_TYPE: - p_node->comp.node_info.node_type = 0xFF; - p_node->rec.node_info.node_type = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "node_type = 0x%X\n", - p_node->rec.node_info.node_type); - break; - - case OSMTEST_TOKEN_NUM_PORTS: - p_node->comp.node_info.num_ports = 0xFF; - p_node->rec.node_info.num_ports = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "num_ports = 0x%X\n", - p_node->rec.node_info.num_ports); - break; - - case OSMTEST_TOKEN_SYS_GUID: - p_node->comp.node_info.sys_guid = 0xFFFFFFFFFFFFFFFFULL; - p_node->rec.node_info.sys_guid = - cl_hton64(strtoull(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "sys_guid = 0x%016" PRIx64 "\n", - cl_ntoh64(p_node->rec.node_info.sys_guid)); - break; - - case OSMTEST_TOKEN_NODE_GUID: - p_node->comp.node_info.node_guid = - 0xFFFFFFFFFFFFFFFFULL; - p_node->rec.node_info.node_guid = - cl_hton64(strtoull(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "node_guid = 0x%016" PRIx64 "\n", - cl_ntoh64(p_node->rec.node_info.node_guid)); - break; - - case OSMTEST_TOKEN_PORT_GUID: - p_node->comp.node_info.port_guid = - 0xFFFFFFFFFFFFFFFFULL; - p_node->rec.node_info.port_guid = - cl_hton64(strtoull(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "port_guid = 0x%016" PRIx64 "\n", - cl_ntoh64(p_node->rec.node_info.port_guid)); - break; - - case OSMTEST_TOKEN_PARTITION_CAP: - p_node->comp.node_info.partition_cap = 0xFFFF; - p_node->rec.node_info.partition_cap = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "partition_cap = 0x%X\n", - cl_ntoh16(p_node->rec.node_info.partition_cap)); - break; - - case OSMTEST_TOKEN_DEVICE_ID: - p_node->comp.node_info.device_id = 0xFFFF; - p_node->rec.node_info.device_id = cl_hton16((uint16_t) - strtoul - (&line - [offset], - NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "device_id = 0x%X\n", - cl_ntoh16(p_node->rec.node_info.device_id)); - break; - - case OSMTEST_TOKEN_REVISION: - p_node->comp.node_info.revision = 0xFFFFFFFF; - p_node->rec.node_info.revision = - cl_hton32(strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "revision = 0x%X\n", - cl_ntoh32(p_node->rec.node_info.revision)); - break; - - case OSMTEST_TOKEN_PORT_NUM: - p_node->comp.node_info.port_num_vendor_id |= - IB_NODE_INFO_PORT_NUM_MASK; - p_node->rec.node_info.port_num_vendor_id |= - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "local_port_num = 0x%X\n", - ib_node_info_get_local_port_num - (&p_node->rec.node_info)); - break; - - case OSMTEST_TOKEN_VENDOR_ID: - p_node->comp.node_info.port_num_vendor_id |= - IB_NODE_INFO_VEND_ID_MASK; - p_node->rec.node_info.port_num_vendor_id |= - cl_hton32(strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "vendor_id = 0x%X\n", - cl_ntoh32(ib_node_info_get_vendor_id - (&p_node->rec.node_info))); - break; - - case OSMTEST_TOKEN_END: - done = TRUE; - break; - - default: - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0121: " - "Ignoring line %u with unknown token: %s\n", - *p_line_num, &line[offset]); - - break; - } - } - - /* - * Make sure the user specified enough information, then - * add this object to the database. - */ - if (p_node->comp.lid == 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0122: " - "LID must be specified for defined nodes\n"); - node_delete(p_node); - goto Exit; - } - - cl_qmap_insert(&p_osmt->exp_subn.node_lid_tbl, - p_node->rec.lid, &p_node->map_item); - - p_guid_node = node_new(); - CL_ASSERT(p_node != NULL); - - *p_guid_node = *p_node; - - cl_qmap_insert(&p_osmt->exp_subn.node_guid_tbl, - p_guid_node->rec.node_info.node_guid, - &p_guid_node->map_item); - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_parse_port(IN osmtest_t * const p_osmt, - IN FILE * const fh, IN OUT uint32_t * const p_line_num) -{ - ib_api_status_t status = IB_SUCCESS; - uint32_t offset; - char line[OSMTEST_MAX_LINE_LEN]; - boolean_t done = FALSE; - port_t *p_port; - const osmtest_token_t *p_tok; - - OSM_LOG_ENTER(&p_osmt->log); - - p_port = port_new(); - CL_ASSERT(p_port != NULL); - - /* - * Parse the inventory file and create the database. - */ - while (!done) { - if (fgets(line, OSMTEST_MAX_LINE_LEN, fh) == NULL) { - /* - * End of file in the middle of a definition. - */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0123: " - "Unexpected end of file\n"); - status = IB_ERROR; - goto Exit; - } - - ++*p_line_num; - - /* - * Skip whitespace - */ - offset = 0; - if (!str_skip_white(line, &offset)) - continue; /* whole line was whitespace */ - - p_tok = str_get_token(&line[offset]); - if (p_tok == NULL) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0124: " - "Ignoring line %u with unknown token: %s\n", - *p_line_num, &line[offset]); - continue; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Found '%s' (line %u)\n", p_tok->str, *p_line_num); - - str_skip_token(line, &offset); - - switch (p_tok->val) { - case OSMTEST_TOKEN_COMMENT: - break; - - case OSMTEST_TOKEN_LID: - p_port->comp.lid = 0xFFFF; - p_port->rec.lid = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "lid = 0x%X\n", - cl_ntoh16(p_port->rec.lid)); - break; - - case OSMTEST_TOKEN_PORT_NUM: - p_port->comp.port_num = 0xFF; - p_port->rec.port_num = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "port_num = 0x%u\n", p_port->rec.port_num); - break; - - case OSMTEST_TOKEN_MKEY: - p_port->comp.port_info.m_key = 0xFFFFFFFFFFFFFFFFULL; - p_port->rec.port_info.m_key = - cl_hton64(strtoull(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "m_key = 0x%016" PRIx64 "\n", - cl_ntoh64(p_port->rec.port_info.m_key)); - break; - - case OSMTEST_TOKEN_SUBN_PREF: - p_port->comp.port_info.subnet_prefix = - 0xFFFFFFFFFFFFFFFFULL; - p_port->rec.port_info.subnet_prefix = - cl_hton64(strtoull(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "subnet_prefix = 0x%016" PRIx64 "\n", - cl_ntoh64(p_port->rec.port_info.subnet_prefix)); - break; - - case OSMTEST_TOKEN_BASE_LID: - p_port->comp.port_info.base_lid = 0xFFFF; - p_port->rec.port_info.base_lid = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "base_lid = 0x%X\n", - cl_ntoh16(p_port->rec.port_info.base_lid)); - break; - - case OSMTEST_TOKEN_SM_BASE_LID: - p_port->comp.port_info.master_sm_base_lid = 0xFFFF; - p_port->rec.port_info.master_sm_base_lid = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "master_sm_base_lid = 0x%X\n", - cl_ntoh16(p_port->rec.port_info.master_sm_base_lid)); - break; - - case OSMTEST_TOKEN_CAP_MASK: - p_port->comp.port_info.capability_mask = 0xFFFFFFFF; - p_port->rec.port_info.capability_mask = - cl_hton32((uint32_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "capability_mask = 0x%X\n", - cl_ntoh32(p_port->rec.port_info.capability_mask)); - break; - - case OSMTEST_TOKEN_DIAG_CODE: - p_port->comp.port_info.diag_code = 0xFFFF; - p_port->rec.port_info.diag_code = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "diag_code = 0x%X\n", - cl_ntoh16(p_port->rec.port_info.diag_code)); - break; - - case OSMTEST_TOKEN_MKEY_LEASE_PER: - p_port->comp.port_info.m_key_lease_period = 0xFFFF; - p_port->rec.port_info.m_key_lease_period = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "m_key_lease_period = 0x%X\n", - cl_ntoh16(p_port->rec.port_info.m_key_lease_period)); - break; - - case OSMTEST_TOKEN_LOC_PORT_NUM: - p_port->comp.port_info.local_port_num = 0xFF; - p_port->rec.port_info.local_port_num = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "local_port_num = 0x%u\n", - p_port->rec.port_info.local_port_num); - break; - - case OSMTEST_TOKEN_LINK_WID_EN: - p_port->comp.port_info.link_width_enabled = 0xFF; - p_port->rec.port_info.link_width_enabled = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "link_width_enabled = 0x%u\n", - p_port->rec.port_info.link_width_enabled); - break; - - case OSMTEST_TOKEN_LINK_WID_SUP: - p_port->comp.port_info.link_width_supported = 0xFF; - p_port->rec.port_info.link_width_supported = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "link_width_supported = 0x%u\n", - p_port->rec.port_info.link_width_supported); - break; - - case OSMTEST_TOKEN_LINK_WID_ACT: - p_port->comp.port_info.link_width_active = 0xFF; - p_port->rec.port_info.link_width_active = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "link_width_active = 0x%u\n", - p_port->rec.port_info.link_width_active); - break; - - case OSMTEST_TOKEN_LINK_SPEED_SUP: - p_port->comp.port_info.state_info1 = 0xFF; - ib_port_info_set_link_speed_sup((uint8_t) - strtoul(&line[offset], - NULL, 0), - &p_port->rec.port_info); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "link_speed_supported = 0x%u\n", - ib_port_info_get_link_speed_sup(&p_port->rec.port_info)); - break; - - case OSMTEST_TOKEN_PORT_STATE: - str_skip_white(line, &offset); - p_port->comp.port_info.state_info1 = 0xFF; - ib_port_info_set_port_state(&p_port->rec.port_info, - ib_get_port_state_from_str - (&line[offset])); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "port_state = 0x%u\n", - ib_port_info_get_port_state(&p_port->rec.port_info)); - break; - - case OSMTEST_TOKEN_STATE_INFO2: - p_port->comp.port_info.state_info2 = 0xFF; - p_port->rec.port_info.state_info2 = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "state_info2 = 0x%u\n", - p_port->rec.port_info.state_info2); - break; - - case OSMTEST_TOKEN_MKEY_PROT_BITS: - p_port->comp.port_info.mkey_lmc = 0xFF; - ib_port_info_set_mpb(&p_port->rec.port_info, - (uint8_t) strtoul(&line[offset], - NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "mpb = 0x%u\n", - ib_port_info_get_mpb(&p_port->rec.port_info)); - break; - - case OSMTEST_TOKEN_LMC: - p_port->comp.port_info.mkey_lmc = 0xFF; - ib_port_info_set_lmc(&p_port->rec.port_info, - (uint8_t) strtoul(&line[offset], - NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "lmc = 0x%u\n", - ib_port_info_get_lmc(&p_port->rec.port_info)); - break; - - case OSMTEST_TOKEN_LINK_SPEED: - p_port->comp.port_info.link_speed = 0xFF; - p_port->rec.port_info.link_speed = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "link_speed = 0x%u\n", - p_port->rec.port_info.link_speed); - break; - - case OSMTEST_TOKEN_MTU_SMSL: - p_port->comp.port_info.mtu_smsl = 0xFF; - p_port->rec.port_info.mtu_smsl = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "mtu_smsl = 0x%u\n", - p_port->rec.port_info.mtu_smsl); - break; - - case OSMTEST_TOKEN_VL_CAP: - p_port->comp.port_info.vl_cap = 0xFF; - p_port->rec.port_info.vl_cap = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "vl_cap = 0x%u\n", - p_port->rec.port_info.vl_cap); - break; - - case OSMTEST_TOKEN_VL_HIGH_LIMIT: - p_port->comp.port_info.vl_high_limit = 0xFF; - p_port->rec.port_info.vl_high_limit = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "vl_high_limit = 0x%u\n", - p_port->rec.port_info.vl_high_limit); - break; - - case OSMTEST_TOKEN_VL_ARB_HIGH_CAP: - p_port->comp.port_info.vl_arb_high_cap = 0xFF; - p_port->rec.port_info.vl_arb_high_cap = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "vl_arb_high_cap = 0x%u\n", - p_port->rec.port_info.vl_arb_high_cap); - break; - - case OSMTEST_TOKEN_VL_ARB_LOW_CAP: - p_port->comp.port_info.vl_arb_low_cap = 0xFF; - p_port->rec.port_info.vl_arb_low_cap = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "vl_arb_low_cap = 0x%u\n", - p_port->rec.port_info.vl_arb_low_cap); - break; - - case OSMTEST_TOKEN_MTU_CAP: - p_port->comp.port_info.mtu_cap = 0xFF; - p_port->rec.port_info.mtu_cap = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "mtu_cap = 0x%u\n", - p_port->rec.port_info.mtu_cap); - break; - - case OSMTEST_TOKEN_VL_STALL_LIFE: - p_port->comp.port_info.vl_stall_life = 0xFF; - p_port->rec.port_info.vl_stall_life = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "vl_stall_life = 0x%u\n", - p_port->rec.port_info.vl_stall_life); - break; - - case OSMTEST_TOKEN_VL_ENFORCE: - p_port->comp.port_info.vl_enforce = 0xFF; - p_port->rec.port_info.vl_enforce = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "vl_enforce = 0x%u\n", - p_port->rec.port_info.vl_enforce); - break; - - case OSMTEST_TOKEN_MKEY_VIOL: - p_port->comp.port_info.m_key_violations = 0xFFFF; - p_port->rec.port_info.m_key_violations = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "m_key_violations = 0x%X\n", - cl_ntoh16(p_port->rec.port_info.m_key_violations)); - break; - - case OSMTEST_TOKEN_PKEY_VIOL: - p_port->comp.port_info.p_key_violations = 0xFFFF; - p_port->rec.port_info.p_key_violations = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "p_key_violations = 0x%X\n", - cl_ntoh16(p_port->rec.port_info.p_key_violations)); - break; - - case OSMTEST_TOKEN_QKEY_VIOL: - p_port->comp.port_info.q_key_violations = 0xFFFF; - p_port->rec.port_info.q_key_violations = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "q_key_violations = 0x%X\n", - cl_ntoh16(p_port->rec.port_info.q_key_violations)); - break; - - case OSMTEST_TOKEN_GUID_CAP: - p_port->comp.port_info.guid_cap = 0xFF; - p_port->rec.port_info.guid_cap = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "guid_cap = 0x%u\n", - p_port->rec.port_info.guid_cap); - break; - - case OSMTEST_TOKEN_SUBN_TIMEOUT: - p_port->comp.port_info.subnet_timeout = 0x1F; - p_port->rec.port_info.subnet_timeout = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "subnet_timeout = 0x%u\n", - ib_port_info_get_timeout(&p_port->rec.port_info)); - break; - - case OSMTEST_TOKEN_RESP_TIME_VAL: - p_port->comp.port_info.resp_time_value = 0xFF; - p_port->rec.port_info.resp_time_value = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "resp_time_value = 0x%u\n", - p_port->rec.port_info.resp_time_value); - break; - - case OSMTEST_TOKEN_ERR_THRESHOLD: - p_port->comp.port_info.error_threshold = 0xFF; - p_port->rec.port_info.error_threshold = - (uint8_t) strtoul(&line[offset], NULL, 0); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "error_threshold = 0x%u\n", - p_port->rec.port_info.error_threshold); - break; - - case OSMTEST_TOKEN_END: - done = TRUE; - break; - - default: - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0125: " - "Ignoring line %u with unknown token: %s\n", - *p_line_num, &line[offset]); - break; - } - } - - /* - * Make sure the user specified enough information, then - * add this object to the database. - */ - if (p_port->comp.lid == 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0126: " - "LID must be specified for defined ports\n"); - port_delete(p_port); - status = IB_ERROR; - goto Exit; - } - - cl_qmap_insert(&p_osmt->exp_subn.port_key_tbl, - port_gen_id(p_port->rec.lid, p_port->rec.port_num), - &p_port->map_item); - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_parse_path(IN osmtest_t * const p_osmt, - IN FILE * const fh, IN OUT uint32_t * const p_line_num) -{ - ib_api_status_t status = IB_SUCCESS; - uint32_t offset; - char line[OSMTEST_MAX_LINE_LEN]; - boolean_t done = FALSE; - path_t *p_path; - const osmtest_token_t *p_tok; - boolean_t got_error = FALSE; - - OSM_LOG_ENTER(&p_osmt->log); - - p_path = path_new(); - CL_ASSERT(p_path != NULL); - - /* - * Parse the inventory file and create the database. - */ - while (!done) { - if (fgets(line, OSMTEST_MAX_LINE_LEN, fh) == NULL) { - /* - * End of file in the middle of a definition. - */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0127: " - "Unexpected end of file\n"); - status = IB_ERROR; - goto Exit; - } - - ++*p_line_num; - - /* - * Skip whitespace - */ - offset = 0; - if (!str_skip_white(line, &offset)) - continue; /* whole line was whitespace */ - - p_tok = str_get_token(&line[offset]); - if (p_tok == NULL) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0128: " - "Ignoring line %u with unknown token: %s\n", - *p_line_num, &line[offset]); - got_error = TRUE; - continue; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Found '%s' (line %u)\n", p_tok->str, *p_line_num); - - str_skip_token(line, &offset); - - switch (p_tok->val) { - case OSMTEST_TOKEN_COMMENT: - break; - - case OSMTEST_TOKEN_DGID: - p_path->comp.dgid.unicast.prefix = - 0xFFFFFFFFFFFFFFFFULL; - p_path->comp.dgid.unicast.interface_id = - 0xFFFFFFFFFFFFFFFFULL; - - str_skip_white(line, &offset); - p_path->rec.dgid.unicast.prefix = - cl_hton64(strtoull(&line[offset], NULL, 0)); - str_skip_token(line, &offset); - p_path->rec.dgid.unicast.interface_id = - cl_hton64(strtoull(&line[offset], NULL, 0)); - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "dgid = 0x%016" PRIx64 " 0x%016" PRIx64 "\n", - cl_ntoh64(p_path->rec.dgid.unicast.prefix), - cl_ntoh64(p_path->rec.dgid.unicast.interface_id)); - break; - - case OSMTEST_TOKEN_SGID: - p_path->comp.sgid.unicast.prefix = - 0xFFFFFFFFFFFFFFFFULL; - p_path->comp.sgid.unicast.interface_id = - 0xFFFFFFFFFFFFFFFFULL; - - str_skip_white(line, &offset); - p_path->rec.sgid.unicast.prefix = - cl_hton64(strtoull(&line[offset], NULL, 0)); - str_skip_token(line, &offset); - p_path->rec.sgid.unicast.interface_id = - cl_hton64(strtoull(&line[offset], NULL, 0)); - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "sgid = 0x%016" PRIx64 " 0x%016" PRIx64 "\n", - cl_ntoh64(p_path->rec.sgid.unicast.prefix), - cl_ntoh64(p_path->rec.sgid.unicast.interface_id)); - break; - - case OSMTEST_TOKEN_DLID: - p_path->comp.dlid = 0xFFFF; - p_path->rec.dlid = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "dlid = 0x%X\n", - cl_ntoh16(p_path->rec.dlid)); - break; - - case OSMTEST_TOKEN_SLID: - p_path->comp.slid = 0xFFFF; - p_path->rec.slid = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "slid = 0x%X\n", - cl_ntoh16(p_path->rec.slid)); - break; - - case OSMTEST_TOKEN_PKEY: - p_path->comp.pkey = 0xFFFF; - p_path->rec.pkey = - cl_hton16((uint16_t) - strtoul(&line[offset], NULL, 0)); - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, "pkey = 0x%X\n", - cl_ntoh16(p_path->rec.pkey)); - break; - - case OSMTEST_TOKEN_END: - done = TRUE; - break; - - default: - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0129: " - "Ignoring line %u with unknown token: %s\n", - *p_line_num, &line[offset]); - got_error = TRUE; - break; - } - } - - if (got_error) { - status = IB_ERROR; - goto Exit; - } - /* - * Make sure the user specified enough information, then - * add this object to the database. - */ - if (osmtest_path_rec_kay_is_valid(p_osmt, p_path) == FALSE) { - path_delete(p_path); - status = IB_ERROR; - goto Exit; - } - - cl_qmap_insert(&p_osmt->exp_subn.path_tbl, - osmtest_path_rec_key_get(&p_path->rec), - &p_path->map_item); - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t -osmtest_parse_link(IN osmtest_t * const p_osmt, - IN FILE * const fh, IN OUT uint32_t * const p_line_num) -{ - ib_api_status_t status = IB_SUCCESS; - uint32_t offset; - char line[OSMTEST_MAX_LINE_LEN]; - boolean_t done = FALSE; - const osmtest_token_t *p_tok; - boolean_t got_error = FALSE; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Parse the inventory file and create the database. - */ - while (!done) { - if (fgets(line, OSMTEST_MAX_LINE_LEN, fh) == NULL) { - /* - * End of file in the middle of a definition. - */ - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 012A: " - "Unexpected end of file\n"); - status = IB_ERROR; - goto Exit; - } - - ++*p_line_num; - - /* - * Skip whitespace - */ - offset = 0; - if (!str_skip_white(line, &offset)) - continue; /* whole line was whitespace */ - - p_tok = str_get_token(&line[offset]); - if (p_tok == NULL) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 012B: " - "Ignoring line %u with unknown token: %s\n", - *p_line_num, &line[offset]); - got_error = TRUE; - continue; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Found '%s' (line %u)\n", p_tok->str, *p_line_num); - - str_skip_token(line, &offset); - - switch (p_tok->val) { - case OSMTEST_TOKEN_FROMLID: - case OSMTEST_TOKEN_FROMPORTNUM: - case OSMTEST_TOKEN_TOPORTNUM: - case OSMTEST_TOKEN_TOLID: - /* For now */ - break; - - case OSMTEST_TOKEN_END: - done = TRUE; - break; - - default: - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 012C: " - "Ignoring line %u with unknown token: %s\n", - *p_line_num, &line[offset]); - got_error = TRUE; - break; - } - } - - if (got_error) - status = IB_ERROR; - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -static ib_api_status_t osmtest_create_db(IN osmtest_t * const p_osmt) -{ - FILE *fh; - ib_api_status_t status = IB_SUCCESS; - uint32_t offset; - char line[OSMTEST_MAX_LINE_LEN]; - uint32_t line_num = 0; - const osmtest_token_t *p_tok; - boolean_t got_error = FALSE; - - OSM_LOG_ENTER(&p_osmt->log); - - fh = fopen(p_osmt->opt.file_name, "r"); - if (fh == NULL) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0130: " - "Unable to open inventory file (%s)\n", - p_osmt->opt.file_name); - status = IB_ERROR; - goto Exit; - } - - /* - * Parse the inventory file and create the database. - */ - while (fgets(line, OSMTEST_MAX_LINE_LEN, fh) != NULL) { - line_num++; - - /* - * Skip whitespace - */ - offset = 0; - if (!str_skip_white(line, &offset)) - continue; /* whole line was whitespace */ - - p_tok = str_get_token(&line[offset]); - if (p_tok == NULL) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0131: " - "Ignoring line %u: %s\n", line_num, - &line[offset]); - got_error = TRUE; - continue; - } - - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Found '%s' (line %u)\n", p_tok->str, line_num); - - switch (p_tok->val) { - case OSMTEST_TOKEN_COMMENT: - break; - - case OSMTEST_TOKEN_DEFINE_NODE: - status = osmtest_parse_node(p_osmt, fh, &line_num); - break; - - case OSMTEST_TOKEN_DEFINE_PORT: - status = osmtest_parse_port(p_osmt, fh, &line_num); - break; - - case OSMTEST_TOKEN_DEFINE_PATH: - status = osmtest_parse_path(p_osmt, fh, &line_num); - break; - - case OSMTEST_TOKEN_DEFINE_LINK: - status = osmtest_parse_link(p_osmt, fh, &line_num); - break; - - default: - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0132: " - "Ignoring line %u: %s\n", line_num, - &line[offset]); - got_error = TRUE; - break; - } - - if (got_error) - status = IB_ERROR; - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0133: " - "Bad status received during parsing (%s)\n", - ib_get_err_str(status)); - fclose(fh); - goto Exit; - } - } - - fclose(fh); - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -/********************************************************************** - Returns the index in the local port attribute array for the - user's selection. -**********************************************************************/ -static uint32_t -osmtest_get_user_port(IN osmtest_t * const p_osmt, - IN const ib_port_attr_t p_attr_array[], - IN uint32_t const num_ports) -{ - uint32_t i, choice = 0; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * User needs prompting for the local port GUID with which - * to bind. - */ - - while (1) { - printf("\nChoose a local port number with which to bind:\n\n"); - for (i = 0; i < num_ports; i++) { - /* - * Print the index + 1 since by convention, port numbers - * start with 1 on host channel adapters. - */ - - printf("\t%u: GUID = 0x%8" PRIx64 - ", lid = 0x%04X, state = %s\n", i + 1, - cl_ntoh64(p_attr_array[i].port_guid), - p_attr_array[i].lid, - ib_get_port_state_str(p_attr_array[i]. - link_state)); - } - - printf("\nEnter choice (1-%u): ", i); - fflush(stdout); - if (scanf("%u", &choice) <= 0) { - char junk[256]; - if (scanf("%s", junk) <= 0) - printf("\nError: Cannot scan!\n"); - } else if (choice && choice <= num_ports) - break; - printf("\nError: Lame choice!\n"); - } - printf("\n"); - OSM_LOG_EXIT(&p_osmt->log); - return (choice - 1); -} - -ib_api_status_t -osmtest_bind(IN osmtest_t * p_osmt, - IN uint16_t max_lid, IN ib_net64_t guid OPTIONAL) -{ - uint32_t port_index; - ib_api_status_t status; - uint32_t num_ports = MAX_LOCAL_IBPORTS; - ib_port_attr_t attr_array[MAX_LOCAL_IBPORTS] = { {0} }; - - OSM_LOG_ENTER(&p_osmt->log); - - /* - * Call the transport layer for a list of local port - * GUID values. - */ - status = osm_vendor_get_all_port_attr(p_osmt->p_vendor, - attr_array, &num_ports); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0134: " - "Failure getting local port attributes (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - if (guid == 0) { - /* - * User needs prompting for the local port GUID with which - * to bind. - */ - port_index = - osmtest_get_user_port(p_osmt, attr_array, num_ports); - - if (num_ports == 0) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0135: " - "No local ports. Unable to proceed\n"); - goto Exit; - } - guid = attr_array[port_index].port_guid; - } else { - for (port_index = 0; port_index < num_ports; port_index++) { - if (attr_array[port_index].port_guid == guid) - break; - } - - if (port_index == num_ports) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0136: " - "No local port with guid 0x%016" PRIx64 "\n", - cl_ntoh64(guid)); - status = IB_NOT_FOUND; - goto Exit; - } - } - - /* - * Copy the port info for the selected port. - */ - memcpy(&p_osmt->local_port, &attr_array[port_index], - sizeof(p_osmt->local_port)); - - /* bind to the SA */ - OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG, - "Using port with SM LID:0x%04X\n", p_osmt->local_port.sm_lid); - p_osmt->max_lid = max_lid; - - p_osmt->h_bind = - osmv_bind_sa(p_osmt->p_vendor, &p_osmt->mad_pool, guid); - - if (p_osmt->h_bind == OSM_BIND_INVALID_HANDLE) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0137: " - "Unable to bind to SA\n"); - status = IB_ERROR; - goto Exit; - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} - -ib_api_status_t osmtest_run(IN osmtest_t * const p_osmt) -{ - ib_api_status_t status = IB_SUCCESS; - - OSM_LOG_ENTER(&p_osmt->log); - - status = osmtest_validate_sa_class_port_info(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0138: " - "Could not obtain SA ClassPortInfo (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - if (p_osmt->opt.flow == OSMT_FLOW_CREATE_INVENTORY) { - /* - * Creating an inventory file with all nodes, ports and paths - */ - status = osmtest_create_inventory_file(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0139: " - "Inventory file create failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - } else { - if (p_osmt->opt.flow == OSMT_FLOW_STRESS_SA) { - /* - * Stress SA - flood the SA with queries - */ - switch (p_osmt->opt.stress) { - case 0: - case 1: /* small response SA query stress */ - status = osmtest_stress_small_rmpp(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0140: " - "Small RMPP stress test failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - break; - case 2: /* large response SA query stress */ - status = osmtest_stress_large_rmpp(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0141: " - "Large RMPP stress test failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - break; - case 3: /* large response Path Record SA query stress */ - status = osmtest_create_db(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0142: " - "Database creation failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - status = osmtest_stress_large_rmpp_pr(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0143: " - "Large RMPP stress test failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - break; - case 4: /* SA Get PR to SA LID */ - status = osmtest_stress_get_pr(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 014B: " - "SA Get PR stress test failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - break; - default: - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0144: " - "Unknown stress test value %u\n", - p_osmt->opt.stress); - break; - } - } else { - - /* - * Run normal validation tests. - */ - if (p_osmt->opt.flow == OSMT_FLOW_ALL || - p_osmt->opt.flow == OSMT_FLOW_VALIDATE_INVENTORY) { - /* - * Only validate the given inventory file - */ - status = osmtest_create_db(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0145: " - "Database creation failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - status = osmtest_validate_against_db(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0146: " - "SA validation database failure (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - } - - if (p_osmt->opt.flow == OSMT_FLOW_ALL) { - status = osmtest_wrong_sm_key_ignored(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0147: " - "Try wrong SM_Key failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - } - - if (p_osmt->opt.flow == OSMT_FLOW_ALL || - p_osmt->opt.flow == OSMT_FLOW_SERVICE_REGISTRATION) - { - /* - * run service registration, deregistration, and lease test - */ - status = osmt_run_service_records_flow(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0148: " - "Service Flow failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - } - - if (p_osmt->opt.flow == OSMT_FLOW_ALL || - p_osmt->opt.flow == OSMT_FLOW_EVENT_FORWARDING) { - /* - * Run event forwarding test - */ -#ifdef OSM_VENDOR_INTF_MTL - status = osmt_run_inform_info_flow(p_osmt); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0149: " - "Inform Info Flow failed: (%s)\n", - ib_get_err_str(status)); - goto Exit; - } -#else - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "The event forwarding flow " - "is not implemented yet!\n"); - status = IB_SUCCESS; - goto Exit; -#endif - } - - if (p_osmt->opt.flow == OSMT_FLOW_QOS) { - /* - * QoS info: dump VLArb and SLtoVL tables. - * Since it generates a huge file, we run it only - * if explicitly required to - */ - status = osmtest_create_db(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 014A: " - "Database creation failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - status = - osmt_run_slvl_and_vlarb_records_flow - (p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0150: " - "Failed to get SLtoVL and VL Arbitration Tables (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - } - - if (p_osmt->opt.flow == OSMT_FLOW_TRAP) { - /* - * Run trap 64/65 flow (this flow requires running of external tool) - */ -#ifdef OSM_VENDOR_INTF_MTL - status = osmt_run_trap64_65_flow(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0151: " - "Trap 64/65 Flow failed: (%s)\n", - ib_get_err_str(status)); - goto Exit; - } -#else - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "The event forwarding flow " - "is not implemented yet!\n"); - status = IB_SUCCESS; - goto Exit; -#endif - } - - if (p_osmt->opt.flow == OSMT_FLOW_ALL || - p_osmt->opt.flow == OSMT_FLOW_MULTICAST) { - /* - * Multicast flow - */ - status = osmt_run_mcast_flow(p_osmt); - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, - "ERR 0152: " - "Multicast Flow failed: (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - } - - OSM_LOG(&p_osmt->log, OSM_LOG_INFO, - "\n\n***************** ALL TESTS PASS *****************\n\n"); - - } - } - -Exit: - OSM_LOG_EXIT(&p_osmt->log); - return (status); -} diff --git a/branches/opensm_3/user/osmtest/osmtest.rc b/branches/opensm_3/user/osmtest/osmtest.rc deleted file mode 100644 index 1b71a2d5..00000000 --- a/branches/opensm_3/user/osmtest/osmtest.rc +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2005 Mellanox Technologies. All rights reserved. - * - * This software is available to you under the OpenIB.org BSD license - * below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - - -#include - -#define VER_FILETYPE VFT_APP -#define VER_FILESUBTYPE VFT2_UNKNOWN -#ifdef _DEBUG_ -#define VER_FILEDESCRIPTION_STR "OpenSM Test Application 3.3.6 (Debug)" -#define VER_INTERNALNAME_STR "osmtest.exe" -#define VER_ORIGINALFILENAME_STR "osmtest.exe" -#else -#define VER_FILEDESCRIPTION_STR "OpenSM Test Application 3.3.6" -#define VER_INTERNALNAME_STR "osmtest.exe" -#define VER_ORIGINALFILENAME_STR "osmtest.exe" -#endif -#include diff --git a/branches/opensm_3/user/osmtest/vendor-ibal.inc b/branches/opensm_3/user/osmtest/vendor-ibal.inc deleted file mode 100644 index 303cdd49..00000000 --- a/branches/opensm_3/user/osmtest/vendor-ibal.inc +++ /dev/null @@ -1,2 +0,0 @@ - -!INCLUDE ..\opensm\vendor-ibal.inc diff --git a/branches/opensm_3/user/osmtest/vendor-umad.inc b/branches/opensm_3/user/osmtest/vendor-umad.inc deleted file mode 100644 index d106d80f..00000000 --- a/branches/opensm_3/user/osmtest/vendor-umad.inc +++ /dev/null @@ -1,2 +0,0 @@ - -!INCLUDE ..\opensm\vendor-umad.inc diff --git a/branches/opensm_3/user/scripts/osm-regress.bat b/branches/opensm_3/user/scripts/osm-regress.bat deleted file mode 100644 index 9229f91e..00000000 --- a/branches/opensm_3/user/scripts/osm-regress.bat +++ /dev/null @@ -1,45 +0,0 @@ -@echo off -setlocal - -rem requires cmd.exe /E /V, make it so... JLP -set F=on -set F=off -if "!F!" == "off" goto OK - -%comspec% /E:on /V:on /C %0 %1 %2 -exit /B %ERRORLEVEL% - -:OK - -if "%1" == "" ( -:usage - echo usage: osm-regress results-filename {exit-on-error} - exit /B 1 -) -if exist "%1" del /Q "%1" - -rem if not exist "osmtest.dat" ( -rem echo missing inventory file .\osmtest.dat ? -rem exit /B 1 -rem ) - -rem set T=..\..\..\bin\user\objchk_wlh_amd64\amd64\osmtest.exe -set T=osmtest.exe - -rem Event forwarding test 'e' is not yet implemented [3.3.5] - -set TESTS="c" "v" "m -M1" "m -M2" "m -M3" "m -M4" "f -s1" "f -s2" "f -s3" "f -s4" "s" "a" -rem set TESTS="c" "v" "a" "f -s1" "f -s2" "f -s3" "f -s4" "s" - -for %%t in ( %TESTS% ) DO ( - echo TEST: osmtest -f %%~t - echo TEST: osmtest -f %%~t >> %1 - %T% -f %%~t >> %1 - if !ERRORLEVEL! NEQ 0 ( - echo Error !ERRORLEVEL! reported in osmtest -f %%~t ? - if Not "%2" == "" exit /B 1 - ) - echo. >> %1 - echo PASS. -) -endlocal