@@ -219,6 +219,7 @@ typedef struct osm_subn_opt {
osm_qos_options_t qos_rtr_options;
boolean_t enable_quirks;
boolean_t no_clients_rereg;
+ boolean_t no_fallback_routing_engine;
#ifdef ENABLE_OSM_PERF_MGR
boolean_t perfmgr;
boolean_t perfmgr_redir;
@@ -159,6 +159,11 @@ static struct osm_routing_engine *setup_routing_engine(osm_opensm_t *osm,
struct osm_routing_engine *re;
const struct routing_engine_module *m;
+ if (!strcmp(name, "no_fallback")) {
+ osm->subn.opt.no_fallback_routing_engine = TRUE;
+ return NULL;
+ }
+
for (m = routing_modules; m->name && *m->name; m++) {
if (!strcmp(m->name, name)) {
re = malloc(sizeof(struct osm_routing_engine));
@@ -212,6 +212,12 @@ static int qos_extports_setup(osm_sm_t * sm, osm_node_t *node,
unsigned in, out;
uint8_t op_vl1;
+ /*
+ * Do nothing unless the most recent routing attempt was successful.
+ */
+ if (!re)
+ return ret;
+
for (out = 1; out < num_ports; out++) {
p = osm_node_get_physp_ptr(node, out);
force_update = p->need_update || sm->p_subn->need_update;
@@ -1091,7 +1091,8 @@ int osm_ucast_mgr_process(IN osm_ucast_mgr_t * p_mgr)
p_routing_eng = p_routing_eng->next;
}
- if (!p_osm->routing_engine_used) {
+ if (!p_osm->routing_engine_used &&
+ p_osm->subn.opt.no_fallback_routing_engine != TRUE) {
/* If configured routing algorithm failed, use default MinHop */
struct osm_routing_engine *r = p_osm->default_routing_engine;
@@ -1101,14 +1102,20 @@ int osm_ucast_mgr_process(IN osm_ucast_mgr_t * p_mgr)
osm_ucast_mgr_set_fwd_tables(p_mgr);
}
- 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->type));
-
- if (p_mgr->p_subn->opt.use_ucast_cache)
- p_mgr->cache_valid = TRUE;
+ if (p_osm->routing_engine_used) {
+ 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->type));
+ if (p_mgr->p_subn->opt.use_ucast_cache)
+ p_mgr->cache_valid = TRUE;
+ } else {
+ p_mgr->p_subn->subnet_initialization_error = TRUE;
+ OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR,
+ "No routing engine able to successfully configure "
+ " switch tables on current fabric\n");
+ }
Exit:
CL_PLOCK_RELEASE(p_mgr->p_lock);
OSM_LOG_EXIT(p_mgr->p_log);