Blame osmroutingplugin/src/osmroutingplugin.c

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
};