|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Copyright (c) 2019 Fabriscale Technologies AS. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2013 Mellanox Technologies LTD. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2008 Voltaire, Inc. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2007 The Regents of the University of California.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* This software is available to you under a choice of one of two
|
|
Packit |
13e616 |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
13e616 |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
13e616 |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
13e616 |
* OpenIB.org BSD license below:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
13e616 |
* without modification, are permitted provided that the following
|
|
Packit |
13e616 |
* conditions are met:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions of source code must retain the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer in the documentation and/or other materials
|
|
Packit |
13e616 |
* provided with the distribution.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
13e616 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
13e616 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
13e616 |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
13e616 |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
13e616 |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
13e616 |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
13e616 |
* SOFTWARE.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#if HAVE_CONFIG_H
|
|
Packit |
13e616 |
# include <config.h>
|
|
Packit |
13e616 |
#endif /* HAVE_CONFIG_H */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#include <errno.h>
|
|
Packit |
13e616 |
#include <string.h>
|
|
Packit |
13e616 |
#include <stdlib.h>
|
|
Packit |
13e616 |
#include <stdio.h>
|
|
Packit |
13e616 |
#include <time.h>
|
|
Packit |
13e616 |
#include <dlfcn.h>
|
|
Packit |
13e616 |
#include <stdint.h>
|
|
Packit |
13e616 |
#include <opensm/osm_config.h>
|
|
Packit |
13e616 |
#include <complib/cl_qmap.h>
|
|
Packit |
13e616 |
#include <complib/cl_passivelock.h>
|
|
Packit |
13e616 |
#include <opensm/osm_version.h>
|
|
Packit |
13e616 |
#include <opensm/osm_opensm.h>
|
|
Packit |
13e616 |
#include <opensm/osm_log.h>
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* This is a simple routing engine plugin
|
|
Packit |
13e616 |
* which implements the routing engine API
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
struct plugin_t {
|
|
Packit |
13e616 |
osm_opensm_t *osm;
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Forward declarations
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
static void *construct(osm_opensm_t *osm);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void destroy(void *context);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int plugin_build_lid_matrices(
|
|
Packit |
13e616 |
IN void *context);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int plugin_ucast_build_fwd_tables(
|
|
Packit |
13e616 |
IN void *context);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void plugin_ucast_dump_tables(
|
|
Packit |
13e616 |
IN void *context);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void plugin_update_sl2vl(
|
|
Packit |
13e616 |
void *context,
|
|
Packit |
13e616 |
IN osm_physp_t *port,
|
|
Packit |
13e616 |
IN uint8_t in_port_num,
|
|
Packit |
13e616 |
IN uint8_t out_port_num,
|
|
Packit |
13e616 |
IN OUT ib_slvl_table_t *t);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void plugin_update_vlarb(
|
|
Packit |
13e616 |
void *context,
|
|
Packit |
13e616 |
IN osm_physp_t *port,
|
|
Packit |
13e616 |
IN uint8_t port_num,
|
|
Packit |
13e616 |
IN OUT ib_vl_arb_table_t *block,
|
|
Packit |
13e616 |
unsigned int block_length,
|
|
Packit |
13e616 |
unsigned int block_num);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static uint8_t plugin_path_sl(
|
|
Packit |
13e616 |
IN void *context,
|
|
Packit |
13e616 |
IN uint8_t path_sl_hint,
|
|
Packit |
13e616 |
IN const ib_net16_t slid,
|
|
Packit |
13e616 |
IN const ib_net16_t dlid);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static ib_api_status_t plugin_mcast_build_stree(
|
|
Packit |
13e616 |
IN void *context,
|
|
Packit |
13e616 |
IN OUT osm_mgrp_box_t *mgb);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void plugin_destroy_routing_engine(
|
|
Packit |
13e616 |
IN void *context);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int routing_engine_setup(
|
|
Packit |
13e616 |
osm_routing_engine_t *engine,
|
|
Packit |
13e616 |
osm_opensm_t *osm);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Implement plugin functions
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
static void *construct(osm_opensm_t *osm)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin;
|
|
Packit |
13e616 |
cl_status_t status;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
plugin = (struct plugin_t *) calloc(1, sizeof(struct plugin_t));
|
|
Packit |
13e616 |
if (!plugin)
|
|
Packit |
13e616 |
return NULL;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
plugin->osm = osm;
|
|
Packit |
13e616 |
external_routing_engine_module_t plugin_routing_engine_module = {
|
|
Packit |
13e616 |
"routing_engine_plugin",
|
|
Packit |
13e616 |
routing_engine_setup,
|
|
Packit |
13e616 |
plugin,
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osm_register_external_routing_engine(
|
|
Packit |
13e616 |
osm, &plugin_routing_engine_module, plugin);
|
|
Packit |
13e616 |
if (status != CL_SUCCESS) {
|
|
Packit |
13e616 |
destroy(plugin);
|
|
Packit |
13e616 |
return NULL;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"External routing engine '%s' has been registered with type '%d'\n",
|
|
Packit |
13e616 |
plugin_routing_engine_module.name,
|
|
Packit |
13e616 |
osm_routing_engine_type(plugin_routing_engine_module.name));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return ((void *)plugin);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void destroy(void *context)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (plugin) {
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Destroying plugin...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
free(plugin);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Implement routing engine functions
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
int routing_engine_setup(
|
|
Packit |
13e616 |
osm_routing_engine_t *engine,
|
|
Packit |
13e616 |
osm_opensm_t *osm)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) engine->context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Setting up the plugin as a new routing engine...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
engine->build_lid_matrices = plugin_build_lid_matrices;
|
|
Packit |
13e616 |
engine->ucast_build_fwd_tables = plugin_ucast_build_fwd_tables;
|
|
Packit |
13e616 |
engine->ucast_dump_tables = plugin_ucast_dump_tables;
|
|
Packit |
13e616 |
engine->update_sl2vl = plugin_update_sl2vl;
|
|
Packit |
13e616 |
engine->update_vlarb = plugin_update_vlarb;
|
|
Packit |
13e616 |
engine->path_sl = plugin_path_sl;
|
|
Packit |
13e616 |
engine->mcast_build_stree = plugin_mcast_build_stree;
|
|
Packit |
13e616 |
engine->destroy = plugin_destroy_routing_engine;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int plugin_build_lid_matrices(
|
|
Packit |
13e616 |
IN void *context)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"Building LID matrices...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int plugin_ucast_build_fwd_tables(
|
|
Packit |
13e616 |
IN void *context)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Building Forwarding tables...\n");
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void plugin_ucast_dump_tables(
|
|
Packit |
13e616 |
IN void *context)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Dumping Unicast forwarding tables...\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void plugin_update_sl2vl(
|
|
Packit |
13e616 |
void *context,
|
|
Packit |
13e616 |
IN osm_physp_t *port,
|
|
Packit |
13e616 |
IN uint8_t in_port_num, IN uint8_t out_port_num,
|
|
Packit |
13e616 |
IN OUT ib_slvl_table_t *t)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Update Service Layer to Virtual Lanes mapping...\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void plugin_update_vlarb(
|
|
Packit |
13e616 |
void *context,
|
|
Packit |
13e616 |
IN osm_physp_t *port,
|
|
Packit |
13e616 |
IN uint8_t port_num,
|
|
Packit |
13e616 |
IN OUT ib_vl_arb_table_t *block,
|
|
Packit |
13e616 |
unsigned int block_length,
|
|
Packit |
13e616 |
unsigned int block_num)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Update Virtual Lane arbritration...\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static uint8_t plugin_path_sl(
|
|
Packit |
13e616 |
IN void *context,
|
|
Packit |
13e616 |
IN uint8_t path_sl_hint,
|
|
Packit |
13e616 |
IN const ib_net16_t slid,
|
|
Packit |
13e616 |
IN const ib_net16_t dlid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Computing Service Layer for the path LID %d -> LID %d with hint: %d...\n",
|
|
Packit |
13e616 |
slid, dlid, path_sl_hint);
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static ib_api_status_t plugin_mcast_build_stree(
|
|
Packit |
13e616 |
IN void *context,
|
|
Packit |
13e616 |
IN OUT osm_mgrp_box_t *mgb)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Building spanning tree for MLID: %d\n",
|
|
Packit |
13e616 |
mgb->mlid);
|
|
Packit |
13e616 |
return IB_SUCCESS;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void plugin_destroy_routing_engine(
|
|
Packit |
13e616 |
IN void *context)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct plugin_t *plugin = (struct plugin_t *) context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&plugin->osm->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Destroying plugin routing engine\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Define the object symbol for loading
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#if OSM_EVENT_PLUGIN_INTERFACE_VER != 2
|
|
Packit |
13e616 |
#error OpenSM plugin interface version mismatch
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_event_plugin_t osm_event_plugin = {
|
|
Packit |
13e616 |
OSM_VERSION,
|
|
Packit |
13e616 |
construct,
|
|
Packit |
13e616 |
destroy
|
|
Packit |
13e616 |
};
|