/* * Copyright (c) 2019 Fabriscale Technologies AS. All rights reserved. * Copyright (c) 2013 Mellanox Technologies LTD. All rights reserved. * 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 #include /* * This is a simple routing engine plugin * which implements the routing engine API */ struct plugin_t { osm_opensm_t *osm; }; /* * Forward declarations */ static void *construct(osm_opensm_t *osm); static void destroy(void *context); static int plugin_build_lid_matrices( IN void *context); static int plugin_ucast_build_fwd_tables( IN void *context); static void plugin_ucast_dump_tables( IN void *context); static void plugin_update_sl2vl( void *context, IN osm_physp_t *port, IN uint8_t in_port_num, IN uint8_t out_port_num, IN OUT ib_slvl_table_t *t); static void plugin_update_vlarb( void *context, IN osm_physp_t *port, IN uint8_t port_num, IN OUT ib_vl_arb_table_t *block, unsigned int block_length, unsigned int block_num); static uint8_t plugin_path_sl( IN void *context, IN uint8_t path_sl_hint, IN const ib_net16_t slid, IN const ib_net16_t dlid); static ib_api_status_t plugin_mcast_build_stree( IN void *context, IN OUT osm_mgrp_box_t *mgb); static void plugin_destroy_routing_engine( IN void *context); static int routing_engine_setup( osm_routing_engine_t *engine, osm_opensm_t *osm); /* * Implement plugin functions */ static void *construct(osm_opensm_t *osm) { struct plugin_t *plugin; cl_status_t status; plugin = (struct plugin_t *) calloc(1, sizeof(struct plugin_t)); if (!plugin) return NULL; plugin->osm = osm; external_routing_engine_module_t plugin_routing_engine_module = { "routing_engine_plugin", routing_engine_setup, plugin, }; status = osm_register_external_routing_engine( osm, &plugin_routing_engine_module, plugin); if (status != CL_SUCCESS) { destroy(plugin); return NULL; } OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "External routing engine '%s' has been registered with type '%d'\n", plugin_routing_engine_module.name, osm_routing_engine_type(plugin_routing_engine_module.name)); return ((void *)plugin); } static void destroy(void *context) { struct plugin_t *plugin = (struct plugin_t *) context; if (plugin) { OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "Destroying plugin...\n"); free(plugin); } } /* * Implement routing engine functions */ int routing_engine_setup( osm_routing_engine_t *engine, osm_opensm_t *osm) { struct plugin_t *plugin = (struct plugin_t *) engine->context; OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "Setting up the plugin as a new routing engine...\n"); engine->build_lid_matrices = plugin_build_lid_matrices; engine->ucast_build_fwd_tables = plugin_ucast_build_fwd_tables; engine->ucast_dump_tables = plugin_ucast_dump_tables; engine->update_sl2vl = plugin_update_sl2vl; engine->update_vlarb = plugin_update_vlarb; engine->path_sl = plugin_path_sl; engine->mcast_build_stree = plugin_mcast_build_stree; engine->destroy = plugin_destroy_routing_engine; return 0; } static int plugin_build_lid_matrices( IN void *context) { struct plugin_t *plugin = (struct plugin_t *) context; OSM_LOG(&plugin->osm->log, OSM_LOG_ERROR, "Building LID matrices...\n"); return 0; } static int plugin_ucast_build_fwd_tables( IN void *context) { struct plugin_t *plugin = (struct plugin_t *) context; OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "Building Forwarding tables...\n"); return 0; } static void plugin_ucast_dump_tables( IN void *context) { struct plugin_t *plugin = (struct plugin_t *) context; OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "Dumping Unicast forwarding tables...\n"); } static void plugin_update_sl2vl( void *context, IN osm_physp_t *port, IN uint8_t in_port_num, IN uint8_t out_port_num, IN OUT ib_slvl_table_t *t) { struct plugin_t *plugin = (struct plugin_t *) context; OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "Update Service Layer to Virtual Lanes mapping...\n"); } static void plugin_update_vlarb( void *context, IN osm_physp_t *port, IN uint8_t port_num, IN OUT ib_vl_arb_table_t *block, unsigned int block_length, unsigned int block_num) { struct plugin_t *plugin = (struct plugin_t *) context; OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "Update Virtual Lane arbritration...\n"); } static uint8_t plugin_path_sl( IN void *context, IN uint8_t path_sl_hint, IN const ib_net16_t slid, IN const ib_net16_t dlid) { struct plugin_t *plugin = (struct plugin_t *) context; OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "Computing Service Layer for the path LID %d -> LID %d with hint: %d...\n", slid, dlid, path_sl_hint); return 0; } static ib_api_status_t plugin_mcast_build_stree( IN void *context, IN OUT osm_mgrp_box_t *mgb) { struct plugin_t *plugin = (struct plugin_t *) context; OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "Building spanning tree for MLID: %d\n", mgb->mlid); return IB_SUCCESS; } static void plugin_destroy_routing_engine( IN void *context) { struct plugin_t *plugin = (struct plugin_t *) context; OSM_LOG(&plugin->osm->log, OSM_LOG_INFO, "Destroying plugin routing engine\n"); } /* * Define the object symbol for loading */ #if OSM_EVENT_PLUGIN_INTERFACE_VER != 2 #error OpenSM plugin interface version mismatch #endif osm_event_plugin_t osm_event_plugin = { OSM_VERSION, construct, destroy };