[ofa-general] [PATCH] osm: bug in dumping opensm.fdbs
Yevgeny Kliteynik
kliteyn at dev.mellanox.co.il
Thu Jul 5 00:43:55 PDT 2007
Hi Hal,
opensm.fdbs dump function adaptation to the recent changes in min hop tables
broke fat-tree routing (or any other future routing that may not use the same
min hop tables creation functions).
-- Yevgeny
Signed-off-by: Yevgeny Kliteynik <kliteyn at dev.mellanox.co.il>
---
opensm/opensm/osm_ucast_mgr.c | 33 ++++++++++++++++++++++++---------
1 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c
index 5bcb655..cab272e 100644
--- a/opensm/opensm/osm_ucast_mgr.c
+++ b/opensm/opensm/osm_ucast_mgr.c
@@ -242,6 +242,7 @@ __osm_ucast_mgr_dump_path_distribution(
/**********************************************************************
**********************************************************************/
+
static void
__osm_ucast_mgr_dump_ucast_routes(
IN cl_map_item_t *p_map_item,
@@ -255,6 +256,7 @@ __osm_ucast_mgr_dump_ucast_routes(
uint8_t best_port;
uint16_t max_lid_ho;
uint16_t lid_ho, base_lid;
+ boolean_t direct_route_exists = FALSE;
osm_switch_t* p_sw = (osm_switch_t *)p_map_item;
osm_ucast_mgr_t* p_mgr = ((struct ucast_mgr_dump_context *)cxt)->p_mgr;
FILE *file = ((struct ucast_mgr_dump_context *)cxt)->file;
@@ -300,22 +302,35 @@ __osm_ucast_mgr_dump_ucast_routes(
*/
if( p_port->p_node->sw )
{
+ /* Target LID is switch.
+ Get its base lid and check hop count for this base LID only.*/
base_lid = osm_node_get_base_lid(p_port->p_node, 0);
base_lid = cl_ntoh16(base_lid);
num_hops = osm_switch_get_hop_count( p_sw, base_lid, port_num );
}
else
{
- osm_physp_t *p_physp = p_port->p_physp;
- if( !p_physp || !p_physp->p_remote_physp ||
- !p_physp->p_remote_physp->p_node->sw )
- num_hops = OSM_NO_PATH;
+ /* Target LID is not switch (CA or router).
+ Check if we have route to this target from current switch.*/
+ num_hops = osm_switch_get_hop_count( p_sw, lid_ho, port_num );
+ if (num_hops != OSM_NO_PATH)
+ {
+ direct_route_exists = TRUE;
+ base_lid = lid_ho;
+ }
else
{
- base_lid = osm_node_get_base_lid(p_physp->p_remote_physp->p_node, 0);
- base_lid = cl_ntoh16(base_lid);
- num_hops = p_physp->p_remote_physp->p_node->sw == p_sw ?
- 0 : osm_switch_get_hop_count( p_sw, base_lid, port_num );
+ osm_physp_t *p_physp = p_port->p_physp;
+ if( !p_physp || !p_physp->p_remote_physp ||
+ !p_physp->p_remote_physp->p_node->sw )
+ num_hops = OSM_NO_PATH;
+ else
+ {
+ base_lid = osm_node_get_base_lid(p_physp->p_remote_physp->p_node, 0);
+ base_lid = cl_ntoh16(base_lid);
+ num_hops = p_physp->p_remote_physp->p_node->sw == p_sw ?
+ 0 : osm_switch_get_hop_count( p_sw, base_lid, port_num );
+ }
}
}
@@ -326,7 +341,7 @@ __osm_ucast_mgr_dump_ucast_routes(
}
best_hops = osm_switch_get_least_hops( p_sw, base_lid );
- if (!p_port->p_node->sw)
+ if (!p_port->p_node->sw && !direct_route_exists)
{
best_hops++;
num_hops++;
--
1.5.1.4
More information about the general
mailing list