As was discussed previously on the list this moves ucast and mcast
dumper functions to separate file (osm_dump.c). Dump generators will
be invoked after heavy sweep.

Signed-off-by: Sasha Khapyorsky <[EMAIL PROTECTED]>
---
 opensm/include/opensm/osm_opensm.h |    4 +
 opensm/opensm/Makefile.am          |    2 +-
 opensm/opensm/osm_dump.c           |  434 ++++++++++++++++++++++++++++++++++++
 opensm/opensm/osm_mcast_mgr.c      |  138 +-----------
 opensm/opensm/osm_state_mgr.c      |    1 +
 opensm/opensm/osm_ucast_mgr.c      |  336 +---------------------------
 6 files changed, 443 insertions(+), 472 deletions(-)
 create mode 100644 opensm/opensm/osm_dump.c

diff --git a/opensm/include/opensm/osm_opensm.h 
b/opensm/include/opensm/osm_opensm.h
index 2b09129..2d668e9 100644
--- a/opensm/include/opensm/osm_opensm.h
+++ b/opensm/include/opensm/osm_opensm.h
@@ -444,6 +444,10 @@ osm_opensm_wait_for_subnet_up(
 * SEE ALSO
 *********/
 
+/* dump helpers */
+void osm_dump_mcast_routes(osm_opensm_t *osm);
+void osm_dump_all(osm_opensm_t *osm);
+
 /****v* OpenSM/osm_exit_flag
 */
 extern volatile unsigned int osm_exit_flag;
diff --git a/opensm/opensm/Makefile.am b/opensm/opensm/Makefile.am
index c94897c..46770b4 100644
--- a/opensm/opensm/Makefile.am
+++ b/opensm/opensm/Makefile.am
@@ -56,7 +56,7 @@ opensm_SOURCES = main.c osm_console.c osm_db_files.c \
                 osm_ucast_lash.c osm_ucast_file.c osm_ucast_ftree.c \
                 osm_vl15intf.c osm_vl_arb_rcv.c \
                 st.c osm_perfmgr.c osm_perfmgr_db.c \
-                osm_event_plugin.c
+                osm_event_plugin.c osm_dump.c
 if OSMV_OPENIB
 opensm_CFLAGS = -Wall $(OSMV_CFLAGS) -fno-strict-aliasing 
-DVENDOR_RMPP_SUPPORT -DDUAL_SIDED_RMPP $(DBGFLAGS) -D_XOPEN_SOURCE=600 
-D_BSD_SOURCE=1
 opensm_CXXFLAGS = -Wall $(OSMV_CFLAGS) -DVENDOR_RMPP_SUPPORT -DDUAL_SIDED_RMPP 
$(DBGFLAGS) -D_XOPEN_SOURCE=600 -D_BSD_SOURCE=1
diff --git a/opensm/opensm/osm_dump.c b/opensm/opensm/osm_dump.c
new file mode 100644
index 0000000..367d941
--- /dev/null
+++ b/opensm/opensm/osm_dump.c
@@ -0,0 +1,434 @@
+/*
+ * Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved.
+ * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+/*
+ * Abstract:
+ *    Various OpenSM dumpers
+ */
+
+#if HAVE_CONFIG_H
+#  include <config.h>
+#endif                         /* HAVE_CONFIG_H */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <iba/ib_types.h>
+#include <complib/cl_qmap.h>
+#include <complib/cl_debug.h>
+#include <opensm/osm_opensm.h>
+#include <opensm/osm_log.h>
+#include <opensm/osm_node.h>
+#include <opensm/osm_switch.h>
+#include <opensm/osm_helper.h>
+#include <opensm/osm_msgdef.h>
+#include <opensm/osm_opensm.h>
+
+struct dump_context {
+       osm_opensm_t *p_osm;
+       FILE *file;
+};
+
+static void dump_ucast_path_distribution(cl_map_item_t * p_map_item, void *cxt)
+{
+       osm_node_t *p_node;
+       osm_node_t *p_remote_node;
+       uint8_t i;
+       uint8_t num_ports;
+       uint32_t num_paths;
+       ib_net64_t remote_guid_ho;
+       osm_switch_t *p_sw = (osm_switch_t *) p_map_item;
+       osm_opensm_t *p_osm = ((struct dump_context *)cxt)->p_osm;
+
+       p_node = p_sw->p_node;
+       num_ports = p_sw->num_ports;
+
+       osm_log_printf(&p_osm->log, OSM_LOG_DEBUG,
+                      "dump_ucast_path_distribution: "
+                      "Switch 0x%" PRIx64 "\n"
+                      "Port : Path Count Through Port",
+                      cl_ntoh64(osm_node_get_node_guid(p_node)));
+
+       for (i = 0; i < num_ports; i++) {
+               num_paths = osm_switch_path_count_get(p_sw, i);
+               osm_log_printf(&p_osm->log, OSM_LOG_DEBUG, "\n %03u : %u", i,
+                              num_paths);
+               if (i == 0) {
+                       osm_log_printf(&p_osm->log, OSM_LOG_DEBUG,
+                                      " (switch management port)");
+                       continue;
+               }
+
+               p_remote_node = osm_node_get_remote_node(p_node, i, NULL);
+               if (p_remote_node == NULL)
+                       continue;
+
+               remote_guid_ho =
+                   cl_ntoh64(osm_node_get_node_guid(p_remote_node));
+
+               switch (osm_node_get_remote_type(p_node, i)) {
+               case IB_NODE_TYPE_SWITCH:
+                       osm_log_printf(&p_osm->log, OSM_LOG_DEBUG,
+                                      " (link to switch");
+                       break;
+               case IB_NODE_TYPE_ROUTER:
+                       osm_log_printf(&p_osm->log, OSM_LOG_DEBUG,
+                                      " (link to router");
+                       break;
+               case IB_NODE_TYPE_CA:
+                       osm_log_printf(&p_osm->log, OSM_LOG_DEBUG,
+                                      " (link to CA");
+                       break;
+               default:
+                       osm_log_printf(&p_osm->log, OSM_LOG_DEBUG,
+                                      " (link to unknown node type");
+                       break;
+               }
+
+               osm_log_printf(&p_osm->log, OSM_LOG_DEBUG, " 0x%" PRIx64 ")",
+                              remote_guid_ho);
+       }
+
+       osm_log_printf(&p_osm->log, OSM_LOG_DEBUG, "\n");
+}
+
+static void dump_ucast_routes(cl_map_item_t * p_map_item, void *cxt)
+{
+       const osm_node_t *p_node;
+       osm_port_t *p_port;
+       uint8_t port_num;
+       uint8_t num_hops;
+       uint8_t best_hops;
+       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_opensm_t *p_osm = ((struct dump_context *)cxt)->p_osm;
+       FILE *file = ((struct dump_context *)cxt)->file;
+
+       p_node = p_sw->p_node;
+
+       max_lid_ho = p_sw->max_lid_ho;
+
+       fprintf(file, "__osm_ucast_mgr_dump_ucast_routes: "
+               "Switch 0x%016" PRIx64 "\n"
+               "LID    : Port : Hops : Optimal\n",
+               cl_ntoh64(osm_node_get_node_guid(p_node)));
+       for (lid_ho = 1; lid_ho <= max_lid_ho; lid_ho++) {
+               fprintf(file, "0x%04X : ", lid_ho);
+
+               p_port = cl_ptr_vector_get(&p_osm->subn.port_lid_tbl, lid_ho);
+               if (!p_port) {
+                       fprintf(file, "UNREACHABLE\n");
+                       continue;
+               }
+
+               port_num = osm_switch_get_port_by_lid(p_sw, lid_ho);
+               if (port_num == OSM_NO_PATH) {
+                       /*
+                          This may occur if there are 'holes' in the existing
+                          LID assignments.  Running SM with --reassign_lids
+                          will reassign and compress the LID range.  The
+                          subnet should work fine either way.
+                        */
+                       fprintf(file, "UNREACHABLE\n");
+                       continue;
+               }
+               /*
+                  Switches can lie about which port routes a given
+                  lid due to a recent reconfiguration of the subnet.
+                  Therefore, ensure that the hop count is better than
+                  OSM_NO_PATH.
+                */
+               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 {
+                       /* 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 {
+                               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);
+                               }
+                       }
+               }
+
+               if (num_hops == OSM_NO_PATH) {
+                       fprintf(file, "UNREACHABLE\n");
+                       continue;
+               }
+
+               best_hops = osm_switch_get_least_hops(p_sw, base_lid);
+               if (!p_port->p_node->sw && !direct_route_exists) {
+                       best_hops++;
+                       num_hops++;
+               }
+
+               fprintf(file, "%03u  : %02u   : ", port_num, num_hops);
+
+               if (best_hops == num_hops)
+                       fprintf(file, "yes");
+               else {
+                       best_port = osm_switch_recommend_path(p_sw, p_port, 
lid_ho, TRUE, NULL, NULL, NULL, NULL);      /* No LMC Optimization */
+                       fprintf(file, "No %u hop path possible via port %u!",
+                               best_hops, best_port);
+               }
+
+               fprintf(file, "\n");
+       }
+}
+
+static void dump_mcast_routes(cl_map_item_t * p_map_item, void *cxt)
+{
+       osm_switch_t *p_sw = (osm_switch_t *) p_map_item;
+       FILE *file = ((struct dump_context *)cxt)->file;
+       osm_mcast_tbl_t *p_tbl;
+       int16_t mlid_ho = 0;
+       int16_t mlid_start_ho;
+       uint8_t position = 0;
+       int16_t block_num = 0;
+       boolean_t first_mlid;
+       boolean_t first_port;
+       const osm_node_t *p_node;
+       uint16_t i, j;
+       uint16_t mask_entry;
+       char sw_hdr[256];
+       char mlid_hdr[32];
+
+       p_node = p_sw->p_node;
+
+       p_tbl = osm_switch_get_mcast_tbl_ptr(p_sw);
+
+       sprintf(sw_hdr, "\nSwitch 0x%016" PRIx64 "\n"
+               "LID    : Out Port(s)\n",
+               cl_ntoh64(osm_node_get_node_guid(p_node)));
+       first_mlid = TRUE;
+       while (block_num <= p_tbl->max_block_in_use) {
+               mlid_start_ho = (uint16_t) (block_num * IB_MCAST_BLOCK_SIZE);
+               for (i = 0; i < IB_MCAST_BLOCK_SIZE; i++) {
+                       mlid_ho = mlid_start_ho + i;
+                       position = 0;
+                       first_port = TRUE;
+                       sprintf(mlid_hdr, "0x%04X :",
+                               mlid_ho + IB_LID_MCAST_START_HO);
+                       while (position <= p_tbl->max_position) {
+                               mask_entry =
+                                   
cl_ntoh16((*p_tbl->p_mask_tbl)[mlid_ho][position]);
+                               if (mask_entry == 0) {
+                                       position++;
+                                       continue;
+                               }
+                               for (j = 0; j < 16; j++) {
+                                       if ((1 << j) & mask_entry) {
+                                               if (first_mlid) {
+                                                       fprintf(file, "%s", 
sw_hdr);
+                                                       first_mlid = FALSE;
+                                               }
+                                               if (first_port) {
+                                                       fprintf(file, "%s", 
mlid_hdr);
+                                                       first_port = FALSE;
+                                               }
+                                               fprintf(file, " 0x%03X ",
+                                                       j + (position * 16));
+                                       }
+                               }
+                               position++;
+                       }
+                       if (first_port == FALSE)
+                               fprintf(file, "\n");
+               }
+               block_num++;
+       }
+}
+
+static void dump_lid_matrix(cl_map_item_t * p_map_item, void *cxt)
+{
+       osm_switch_t *p_sw = (osm_switch_t *) p_map_item;
+       osm_opensm_t *p_osm = ((struct dump_context *)cxt)->p_osm;
+       FILE *file = ((struct dump_context *)cxt)->file;
+       osm_node_t *p_node = p_sw->p_node;
+       unsigned max_lid = p_sw->max_lid_ho;
+       unsigned max_port = p_sw->num_ports;
+       uint16_t lid;
+       uint8_t port;
+
+       fprintf(file, "Switch: guid 0x%016" PRIx64 "\n",
+               cl_ntoh64(osm_node_get_node_guid(p_node)));
+       for (lid = 1; lid <= max_lid; lid++) {
+               osm_port_t *p_port;
+               if (osm_switch_get_least_hops(p_sw, lid) == OSM_NO_PATH)
+                       continue;
+               fprintf(file, "0x%04x:", lid);
+               for (port = 0; port < max_port; port++)
+                       fprintf(file, " %02x",
+                               osm_switch_get_hop_count(p_sw, lid, port));
+               p_port = cl_ptr_vector_get(&p_osm->subn.port_lid_tbl, lid);
+               if (p_port)
+                       fprintf(file, " # portguid 0x%" PRIx64,
+                               cl_ntoh64(osm_port_get_guid(p_port)));
+               fprintf(file, "\n");
+       }
+}
+
+static void dump_ucast_lfts(cl_map_item_t * p_map_item, void *cxt)
+{
+       osm_switch_t *p_sw = (osm_switch_t *) p_map_item;
+       osm_opensm_t *p_osm = ((struct dump_context *)cxt)->p_osm;
+       FILE *file = ((struct dump_context *)cxt)->file;
+       osm_node_t *p_node = p_sw->p_node;
+       unsigned max_lid = p_sw->max_lid_ho;
+       unsigned max_port = p_sw->num_ports;
+       uint16_t lid;
+       uint8_t port;
+
+       fprintf(file, "Unicast lids [0x0-0x%x] of switch Lid %u guid 0x%016"
+               PRIx64 " (\'%s\'):\n",
+               max_lid, osm_node_get_base_lid(p_node, 0),
+               cl_ntoh64(osm_node_get_node_guid(p_node)), p_node->print_desc);
+       for (lid = 0; lid <= max_lid; lid++) {
+               osm_port_t *p_port;
+               port = osm_switch_get_port_by_lid(p_sw, lid);
+
+               if (port >= max_port)
+                       continue;
+
+               fprintf(file, "0x%04x %03u # ", lid, port);
+
+               p_port = cl_ptr_vector_get(&p_osm->subn.port_lid_tbl, lid);
+               if (p_port) {
+                       p_node = p_port->p_node;
+                       fprintf(file, "%s portguid 0x016%" PRIx64 ": \'%s\'",
+                               ib_get_node_type_str(osm_node_get_type(p_node)),
+                               cl_ntoh64(osm_port_get_guid(p_port)),
+                               p_node->print_desc);
+               } else
+                       fprintf(file, "unknown node and type");
+               fprintf(file, "\n");
+       }
+       fprintf(file, "%u lids dumped\n", max_lid);
+}
+
+/**********************************************************************
+ **********************************************************************/
+static void dump_qmap(osm_opensm_t * p_osm, FILE * file,
+                     cl_qmap_t * map, void (*func) (cl_map_item_t *, void *))
+{
+       struct dump_context dump_context;
+
+       dump_context.p_osm = p_osm;
+       dump_context.file = file;
+
+       cl_qmap_apply_func(map, func, &dump_context);
+}
+
+static void dump_qmap_to_file(osm_opensm_t * p_osm, const char *file_name,
+                             cl_qmap_t * map,
+                             void (*func) (cl_map_item_t *, void *))
+{
+       char path[1024];
+       FILE *file;
+
+       snprintf(path, sizeof(path), "%s/%s",
+                p_osm->subn.opt.dump_files_dir, file_name);
+
+       file = fopen(path, "w");
+       if (!file) {
+               osm_log(&p_osm->log, OSM_LOG_ERROR,
+                       "dump_qmap_to_file: "
+                       "cannot create file \'%s\': %s\n",
+                       path, strerror(errno));
+               return;
+       }
+
+       dump_qmap(p_osm, file, map, func);
+
+       fclose(file);
+}
+
+/**********************************************************************
+ **********************************************************************/
+
+void osm_dump_mcast_routes(osm_opensm_t * osm)
+{
+       if (osm_log_is_active(&osm->log, OSM_LOG_ROUTING)) {
+               /* multicast routes */
+               dump_qmap_to_file(osm, "opensm.mcfdbs",
+                                 &osm->subn.sw_guid_tbl, dump_mcast_routes);
+       }
+}
+
+void osm_dump_all(osm_opensm_t * osm)
+{
+       if (osm_log_is_active(&osm->log, OSM_LOG_ROUTING)) {
+               /* unicast routes */
+               dump_qmap_to_file(osm, "opensm-lid-matrix.dump",
+                                 &osm->subn.sw_guid_tbl, dump_lid_matrix);
+               dump_qmap_to_file(osm, "opensm-lfts.dump",
+                                 &osm->subn.sw_guid_tbl, dump_ucast_lfts);
+               if (osm_log_is_active(&osm->log, OSM_LOG_DEBUG))
+                       dump_qmap(osm, NULL, &osm->subn.sw_guid_tbl,
+                                 dump_ucast_path_distribution);
+               dump_qmap_to_file(osm, "opensm.fdbs",
+                                 &osm->subn.sw_guid_tbl, dump_ucast_routes);
+               /* multicast routes */
+               dump_qmap_to_file(osm, "opensm.mcfdbs",
+                                 &osm->subn.sw_guid_tbl, dump_mcast_routes);
+       }
+}
diff --git a/opensm/opensm/osm_mcast_mgr.c b/opensm/opensm/osm_mcast_mgr.c
index f4b64a6..5f64b19 100644
--- a/opensm/opensm/osm_mcast_mgr.c
+++ b/opensm/opensm/osm_mcast_mgr.c
@@ -48,12 +48,11 @@
 #  include <config.h>
 #endif /* HAVE_CONFIG_H */
 
-#include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
-#include <errno.h>
 #include <iba/ib_types.h>
 #include <complib/cl_debug.h>
+#include <opensm/osm_opensm.h>
 #include <opensm/osm_mcast_mgr.h>
 #include <opensm/osm_multicast.h>
 #include <opensm/osm_node.h>
@@ -61,8 +60,6 @@
 #include <opensm/osm_helper.h>
 #include <opensm/osm_msgdef.h>
 
-#define LINE_LENGTH 256
-
 /**********************************************************************
  **********************************************************************/
 typedef struct _osm_mcast_work_obj
@@ -1336,135 +1333,6 @@ osm_mcast_mgr_process_tree(
 }
 
 /**********************************************************************
- **********************************************************************/
-static void
-mcast_mgr_dump_sw_routes(
-  IN const osm_mcast_mgr_t*   const p_mgr,
-  IN const osm_switch_t*      const p_sw,
-  IN FILE *file )
-{
-  osm_mcast_tbl_t*      p_tbl;
-  int16_t               mlid_ho = 0;
-  int16_t               mlid_start_ho;
-  uint8_t               position = 0;
-  int16_t               block_num = 0;
-  boolean_t             first_mlid;
-  boolean_t             first_port;
-  const osm_node_t*     p_node;
-  uint16_t              i, j;
-  uint16_t              mask_entry;
-  char                  sw_hdr[256];
-  char                  mlid_hdr[32];
-
-  OSM_LOG_ENTER( p_mgr->p_log, mcast_mgr_dump_sw_routes );
-
-  if( !osm_log_is_active( p_mgr->p_log, OSM_LOG_ROUTING ) )
-    goto Exit;
-
-  p_node = p_sw->p_node;
-
-  p_tbl = osm_switch_get_mcast_tbl_ptr( p_sw );
-
-  sprintf( sw_hdr, "\nSwitch 0x%016" PRIx64 "\n"
-           "LID    : Out Port(s)\n",
-           cl_ntoh64( osm_node_get_node_guid( p_node ) ) );
-  first_mlid = TRUE;
-  while ( block_num <= p_tbl->max_block_in_use )
-  {
-    mlid_start_ho = (uint16_t)(block_num * IB_MCAST_BLOCK_SIZE);
-    for (i = 0 ; i < IB_MCAST_BLOCK_SIZE ; i++)
-    {
-      mlid_ho = mlid_start_ho + i;
-      position = 0;
-      first_port = TRUE;
-      sprintf( mlid_hdr, "0x%04X :", mlid_ho + IB_LID_MCAST_START_HO );
-      while ( position <= p_tbl->max_position )
-      {
-        mask_entry = cl_ntoh16((*p_tbl->p_mask_tbl)[mlid_ho][position]);
-        if (mask_entry == 0)
-        {
-          position++;
-          continue;
-        }
-        for (j = 0 ; j < 16 ; j++)
-        {
-          if ( (1 << j) & mask_entry )
-          {
-            if (first_mlid)
-            {
-              fprintf( file,"%s", sw_hdr );
-              first_mlid = FALSE;
-            }
-            if (first_port)
-            {
-              fprintf( file,"%s", mlid_hdr );
-              first_port = FALSE;
-            }
-            fprintf( file, " 0x%03X ", j+(position*16) );
-          }
-        }
-        position++;
-      }
-      if (first_port == FALSE)
-      {
-        fprintf( file, "\n" );
-      }
-    }
-    block_num++;
-  }
-
- Exit:
-  OSM_LOG_EXIT( p_mgr->p_log );
-}
-
-/**********************************************************************
- **********************************************************************/
-struct mcast_mgr_dump_context {
-       osm_mcast_mgr_t *p_mgr;
-       FILE *file;
-};
-
-static void
-mcast_mgr_dump_table(cl_map_item_t *p_map_item, void *context)
-{
-       osm_switch_t *p_sw = (osm_switch_t *)p_map_item;
-       struct mcast_mgr_dump_context *cxt = context;
-
-       mcast_mgr_dump_sw_routes(cxt->p_mgr, p_sw, cxt->file);
-}
-
-static void
-mcast_mgr_dump_mcast_routes(osm_mcast_mgr_t *p_mgr)
-{
-       char file_name[1024];
-       struct mcast_mgr_dump_context dump_context;
-       FILE  *file;
-
-       if (!osm_log_is_active(p_mgr->p_log, OSM_LOG_ROUTING))
-               return;
-
-       snprintf(file_name, sizeof(file_name), "%s/%s",
-                p_mgr->p_subn->opt.dump_files_dir, "opensm.mcfdbs");
-
-       file = fopen(file_name, "w");
-       if (!file) {
-               osm_log(p_mgr->p_log, OSM_LOG_ERROR,
-                       "mcast_dump_mcast_routes: ERR 0A18: "
-                       "cannot create mcfdb file \'%s\': %s\n",
-                       file_name, strerror(errno));
-               return;
-       }
-
-       dump_context.p_mgr = p_mgr;
-       dump_context.file = file;
-
-       cl_qmap_apply_func(&p_mgr->p_subn->sw_guid_tbl,
-                          mcast_mgr_dump_table, &dump_context);
-
-       fclose(file);
-}
-
-/**********************************************************************
  Process the entire group.
 
  NOTE : The lock should be held externally!
@@ -1510,7 +1378,7 @@ osm_mcast_mgr_process_mgrp(
     p_sw = (osm_switch_t*)cl_qmap_next( &p_sw->map_item );
   }
 
-  mcast_mgr_dump_mcast_routes( p_mgr );
+  osm_dump_mcast_routes( p_mgr->p_subn->p_osm );
 
  Exit:
   OSM_LOG_EXIT( p_mgr->p_log );
@@ -1580,8 +1448,6 @@ osm_mcast_mgr_process(
     p_sw = (osm_switch_t*)cl_qmap_next( &p_sw->map_item );
   }
 
-  mcast_mgr_dump_mcast_routes( p_mgr );
-
   CL_PLOCK_RELEASE( p_mgr->p_lock );
 
   OSM_LOG_EXIT( p_mgr->p_log );
diff --git a/opensm/opensm/osm_state_mgr.c b/opensm/opensm/osm_state_mgr.c
index a15f3b4..a6d0e24 100644
--- a/opensm/opensm/osm_state_mgr.c
+++ b/opensm/opensm/osm_state_mgr.c
@@ -2749,6 +2749,7 @@ Idle:
                p_mgr->p_subn->need_update = 0;
 
                __osm_topology_file_create( p_mgr );
+               osm_dump_all(p_mgr->p_subn->p_osm);
                __osm_state_mgr_report( p_mgr );
                __osm_state_mgr_up_msg( p_mgr );
 
diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c
index f049e74..cfe1a58 100644
--- a/opensm/opensm/osm_ucast_mgr.c
+++ b/opensm/opensm/osm_ucast_mgr.c
@@ -48,7 +48,7 @@
 #  include <config.h>
 #endif /* HAVE_CONFIG_H */
 
-#include <unistd.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <iba/ib_types.h>
@@ -62,8 +62,6 @@
 #include <opensm/osm_msgdef.h>
 #include <opensm/osm_opensm.h>
 
-#define LINE_LENGTH 256
-
 /**********************************************************************
  **********************************************************************/
 void
@@ -123,329 +121,6 @@ osm_ucast_mgr_init(
 }
 
 /**********************************************************************
- **********************************************************************/
-struct ucast_mgr_dump_context {
-       osm_ucast_mgr_t *p_mgr;
-       FILE *file;
-};
-
-static void
-ucast_mgr_dump(osm_ucast_mgr_t *p_mgr, FILE *file,
-              void (*func)(cl_map_item_t *, void *))
-{
-       struct ucast_mgr_dump_context dump_context;
-
-       dump_context.p_mgr = p_mgr;
-       dump_context.file = file;
-
-       cl_qmap_apply_func(&p_mgr->p_subn->sw_guid_tbl, func, &dump_context);
-}
-
-void
-ucast_mgr_dump_to_file(osm_ucast_mgr_t *p_mgr, const char *file_name,
-                      void (*func)(cl_map_item_t *, void *))
-{
-       char path[1024];
-       FILE *file;
-
-       snprintf(path, sizeof(path), "%s/%s",
-                p_mgr->p_subn->opt.dump_files_dir, file_name);
-
-       file = fopen(path, "w");
-       if (!file) {
-               osm_log( p_mgr->p_log, OSM_LOG_ERROR,
-                        "ucast_mgr_dump_to_file: ERR 3A12: "
-                        "Failed to open fdb file (%s)\n", path );
-               return;
-       }
-
-       ucast_mgr_dump(p_mgr, file, func);
-
-       fclose(file);
-}
-
-/**********************************************************************
- **********************************************************************/
-static void
-__osm_ucast_mgr_dump_path_distribution(
-  IN cl_map_item_t *p_map_item,
-  IN void *cxt)
-{
-  osm_node_t *p_node;
-  osm_node_t *p_remote_node;
-  uint8_t i;
-  uint8_t num_ports;
-  uint32_t num_paths;
-  ib_net64_t remote_guid_ho;
-  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;
-
-  OSM_LOG_ENTER( p_mgr->p_log, __osm_ucast_mgr_dump_path_distribution );
-
-  p_node = p_sw->p_node;
-  num_ports = p_sw->num_ports;
-
-  osm_log_printf( p_mgr->p_log, OSM_LOG_DEBUG,
-                  "__osm_ucast_mgr_dump_path_distribution: "
-                  "Switch 0x%" PRIx64 "\n"
-                  "Port : Path Count Through Port",
-                  cl_ntoh64( osm_node_get_node_guid( p_node ) ) );
-
-  for( i = 0; i < num_ports; i++ )
-  {
-    num_paths = osm_switch_path_count_get( p_sw , i );
-    osm_log_printf( p_mgr->p_log, OSM_LOG_DEBUG,"\n %03u : %u", i, num_paths );
-    if( i == 0 )
-    {
-      osm_log_printf( p_mgr->p_log, OSM_LOG_DEBUG, " (switch management port)" 
);
-      continue;
-    }
-
-    p_remote_node = osm_node_get_remote_node( p_node, i, NULL );
-    if( p_remote_node == NULL )
-      continue;
-
-    remote_guid_ho = cl_ntoh64( osm_node_get_node_guid( p_remote_node ) );
-
-    switch(  osm_node_get_remote_type( p_node, i ) )
-    {
-    case IB_NODE_TYPE_SWITCH:
-      osm_log_printf( p_mgr->p_log, OSM_LOG_DEBUG, " (link to switch" );
-      break;
-    case IB_NODE_TYPE_ROUTER:
-      osm_log_printf( p_mgr->p_log, OSM_LOG_DEBUG, " (link to router" );
-      break;
-    case IB_NODE_TYPE_CA:
-      osm_log_printf( p_mgr->p_log, OSM_LOG_DEBUG, " (link to CA" );
-      break;
-    default:
-      osm_log_printf( p_mgr->p_log, OSM_LOG_DEBUG, " (link to unknown node 
type" );
-      break;
-    }
-
-    osm_log_printf( p_mgr->p_log, OSM_LOG_DEBUG, " 0x%" PRIx64 ")",
-                    remote_guid_ho );
-  }
-
-  osm_log_printf( p_mgr->p_log, OSM_LOG_DEBUG, "\n" );
-
-  OSM_LOG_EXIT( p_mgr->p_log );
-}
-
-/**********************************************************************
- **********************************************************************/
-static void
-__osm_ucast_mgr_dump_ucast_routes(
-  IN cl_map_item_t *p_map_item,
-  IN void *cxt )
-{
-  const osm_node_t*        p_node;
-  osm_port_t *             p_port;
-  uint8_t                  port_num;
-  uint8_t                  num_hops;
-  uint8_t                  best_hops;
-  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;
-
-  OSM_LOG_ENTER( p_mgr->p_log, __osm_ucast_mgr_dump_ucast_routes );
-
-  p_node = p_sw->p_node;
-
-  max_lid_ho = p_sw->max_lid_ho;
-
-  fprintf( file, "__osm_ucast_mgr_dump_ucast_routes: "
-           "Switch 0x%016" PRIx64 "\n"
-           "LID    : Port : Hops : Optimal\n",
-           cl_ntoh64( osm_node_get_node_guid( p_node ) ) );
-  for( lid_ho = 1; lid_ho <= max_lid_ho; lid_ho++ )
-  {
-    fprintf(file, "0x%04X : ", lid_ho);
-
-    p_port = cl_ptr_vector_get(&p_mgr->p_subn->port_lid_tbl, lid_ho);
-    if (!p_port)
-    {
-      fprintf( file, "UNREACHABLE\n" );
-      continue;
-    }
-
-    port_num = osm_switch_get_port_by_lid( p_sw, lid_ho );
-    if( port_num == OSM_NO_PATH )
-    {
-      /*
-        This may occur if there are 'holes' in the existing
-        LID assignments.  Running SM with --reassign_lids
-        will reassign and compress the LID range.  The
-        subnet should work fine either way.
-      */
-      fprintf( file, "UNREACHABLE\n" );
-      continue;
-    }
-    /*
-      Switches can lie about which port routes a given
-      lid due to a recent reconfiguration of the subnet.
-      Therefore, ensure that the hop count is better than
-      OSM_NO_PATH.
-    */
-    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
-    {
-      /* 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
-      {
-        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 );
-        }
-      }
-    }
-
-    if( num_hops == OSM_NO_PATH )
-    {
-      fprintf( file, "UNREACHABLE\n" );
-      continue;
-    }
-
-    best_hops = osm_switch_get_least_hops( p_sw, base_lid );
-    if (!p_port->p_node->sw && !direct_route_exists)
-    {
-      best_hops++;
-      num_hops++;
-    }
-
-    fprintf( file, "%03u  : %02u   : ", port_num, num_hops );
-
-    if( best_hops == num_hops )
-      fprintf( file, "yes" );
-    else
-    {
-      best_port = osm_switch_recommend_path(
-        p_sw, p_port, lid_ho, TRUE,
-        NULL, NULL, NULL, NULL ); /* No LMC Optimization */
-      fprintf( file, "No %u hop path possible via port %u!",
-               best_hops, best_port );
-    }
-
-    fprintf( file, "\n" );
-  }
-
-  OSM_LOG_EXIT( p_mgr->p_log );
-}
-
-/**********************************************************************
- **********************************************************************/
-static void
-ucast_mgr_dump_lid_matrix(cl_map_item_t *p_map_item, void *cxt)
-{
-       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;
-       osm_node_t *p_node = p_sw->p_node;
-       unsigned max_lid = p_sw->max_lid_ho;
-       unsigned max_port = p_sw->num_ports;
-       uint16_t lid;
-       uint8_t port;
-
-       fprintf(file, "Switch: guid 0x%016" PRIx64 "\n",
-               cl_ntoh64(osm_node_get_node_guid(p_node)));
-       for (lid = 1; lid <= max_lid; lid++) {
-               osm_port_t *p_port;
-               if (osm_switch_get_least_hops(p_sw, lid) == OSM_NO_PATH)
-                       continue;
-               fprintf(file, "0x%04x:", lid);
-               for (port = 0 ; port < max_port ; port++)
-                       fprintf(file, " %02x",
-                               osm_switch_get_hop_count(p_sw, lid, port));
-               p_port = cl_ptr_vector_get(&p_mgr->p_subn->port_lid_tbl, lid);
-               if (p_port)
-                       fprintf(file, " # portguid 0x%" PRIx64,
-                               cl_ntoh64(osm_port_get_guid(p_port)));
-               fprintf(file, "\n");
-       }
-}
-
-/**********************************************************************
- **********************************************************************/
-void
-ucast_mgr_dump_lfts(cl_map_item_t *p_map_item, void *cxt)
-{
-       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;
-       osm_node_t *p_node = p_sw->p_node;
-       unsigned max_lid = p_sw->max_lid_ho;
-       unsigned max_port = p_sw->num_ports;
-       uint16_t lid;
-       uint8_t port;
-
-       fprintf(file, "Unicast lids [0x0-0x%x] of switch Lid %u guid 0x%016"
-               PRIx64 " (\'%s\'):\n",
-               max_lid, osm_node_get_base_lid(p_node, 0),
-               cl_ntoh64(osm_node_get_node_guid(p_node)),
-               p_node->print_desc);
-       for (lid = 0; lid <= max_lid; lid++) {
-               osm_port_t *p_port;
-               port = osm_switch_get_port_by_lid(p_sw, lid);
-
-               if (port >= max_port)
-                       continue;
-
-               fprintf(file, "0x%04x %03u # ", lid, port);
-
-               p_port = cl_ptr_vector_get(&p_mgr->p_subn->port_lid_tbl, lid);
-               if (p_port) {
-                       p_node = p_port->p_node;
-                       fprintf(file, "%s portguid 0x016%" PRIx64 ": \'%s\'",
-                               ib_get_node_type_str(osm_node_get_type(p_node)),
-                               cl_ntoh64(osm_port_get_guid(p_port)),
-                               p_node->print_desc);
-               }
-               else
-                       fprintf(file, "unknown node and type");
-               fprintf(file, "\n");
-       }
-       fprintf(file, "%u lids dumped\n", max_lid);
-}
-
-/**********************************************************************
- **********************************************************************/
-static void __osm_ucast_mgr_dump_tables(osm_ucast_mgr_t *p_mgr)
-{
-  ucast_mgr_dump_to_file(p_mgr, "opensm-lid-matrix.dump",
-                         ucast_mgr_dump_lid_matrix);
-  ucast_mgr_dump_to_file(p_mgr, "opensm-lfts.dump", ucast_mgr_dump_lfts);
-  if( osm_log_is_active( p_mgr->p_log, OSM_LOG_DEBUG ) )
-    ucast_mgr_dump(p_mgr, NULL, __osm_ucast_mgr_dump_path_distribution);
-  ucast_mgr_dump_to_file(p_mgr, "opensm.fdbs", 
__osm_ucast_mgr_dump_ucast_routes);
-}
-
-/**********************************************************************
  Add each switch's own and neighbor LIDs to its LID matrix
 **********************************************************************/
 static void
@@ -1172,15 +847,6 @@ osm_ucast_mgr_process(
   else
      cl_qmap_apply_func( p_sw_guid_tbl, __osm_ucast_mgr_process_tbl, p_mgr );
 
-  /* dump fdb into file: */
-  if ( osm_log_is_active( p_mgr->p_log, OSM_LOG_ROUTING ) )
-  {
-     if ( !default_routing && p_routing_eng->ucast_dump_tables != 0 )
-        p_routing_eng->ucast_dump_tables(p_routing_eng->context);
-     else
-        __osm_ucast_mgr_dump_tables( p_mgr );
-  }
-
   if (p_mgr->any_change)
   {
     signal = OSM_SIGNAL_DONE_PENDING;
-- 
1.5.3.rc2.38.g11308

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to