@@ -132,6 +132,8 @@ struct osm_routing_engine {
uint8_t (*path_sl)(void *context, IN uint8_t path_sl_hint,
IN const osm_port_t *src_port,
IN const osm_port_t *dst_port);
+ ib_api_status_t (*mcast_build_stree)(void *context,
+ IN OUT osm_mgrp_box_t *mgb);
void (*delete) (void *context);
struct osm_routing_engine *next;
};
@@ -165,6 +167,10 @@ struct osm_routing_engine {
* path_sl
* The callback for computing path SL.
*
+* mcast_build_stree
+* The callback for building the spanning tree for multicast
+* forwarding, called per MLID.
+*
* delete
* The delete method, may be used for routing engine
* internals cleanup.
@@ -987,6 +987,7 @@ Exit:
static ib_api_status_t mcast_mgr_process_mlid(osm_sm_t * sm, uint16_t mlid)
{
ib_api_status_t status = IB_SUCCESS;
+ struct osm_routing_engine *re = sm->p_subn->p_osm->routing_engine_used;
osm_mgrp_box_t *mbox;
OSM_LOG_ENTER(sm->p_log);
@@ -1001,7 +1002,11 @@ static ib_api_status_t mcast_mgr_process_mlid(osm_sm_t * sm, uint16_t mlid)
mbox = osm_get_mbox_by_mlid(sm->p_subn, cl_hton16(mlid));
if (mbox) {
- status = mcast_mgr_build_spanning_tree(sm, mbox);
+ if (re && re->mcast_build_stree)
+ status = re->mcast_build_stree(re->context, mbox);
+ else
+ 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 "