@@ -77,6 +77,7 @@ typedef enum {
OSM_EVENT_ID_UCAST_ROUTING_DONE,
OSM_EVENT_ID_STATE_CHANGE,
OSM_EVENT_ID_SA_DB_DUMPED,
+ OSM_EVENT_ID_LFT_CHANGE,
OSM_EVENT_ID_MAX
} osm_epi_event_id_t;
@@ -104,6 +104,8 @@ typedef struct osm_switch {
uint8_t *lft;
uint8_t *new_lft;
uint16_t lft_size;
+ uint32_t lft_epoch_prev;
+ uint32_t lft_epoch;
osm_mcast_tbl_t mcast_tbl;
int32_t mft_block_num;
uint32_t mft_position;
@@ -918,6 +918,8 @@ static void ucast_mgr_set_fwd_top(IN cl_map_item_t * p_map_item,
p_path = osm_physp_get_dr_path_ptr(osm_node_get_physp_ptr(p_node, 0));
+ p_sw->lft_epoch_prev = p_sw->lft_epoch;
+
/*
Set the top of the unicast forwarding table.
*/
@@ -926,6 +928,7 @@ static void ucast_mgr_set_fwd_top(IN cl_map_item_t * p_map_item,
if (lin_top != si.lin_top) {
set_swinfo_require = TRUE;
si.lin_top = lin_top;
+ p_sw->lft_epoch++;
}
/* check to see if the change state bit is on. If it is - then we
@@ -963,7 +966,7 @@ static void ucast_mgr_set_fwd_top(IN cl_map_item_t * p_map_item,
}
static int set_lft_block(IN osm_switch_t *p_sw, IN osm_ucast_mgr_t *p_mgr,
- IN uint16_t block_id_ho)
+ IN uint16_t block_id_ho, IN unsigned last_block)
{
uint8_t block[IB_SMP_DATA_SIZE];
osm_madw_context_t context;
@@ -993,6 +996,8 @@ static int set_lft_block(IN osm_switch_t *p_sw, IN osm_ucast_mgr_t *p_mgr,
IB_SMP_DATA_SIZE)))
return 0;
+ p_sw->lft_epoch++;
+
OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG,
"Writing FT block %u to switch 0x%" PRIx64 "\n", block_id_ho,
cl_ntoh64(context.lft_context.node_guid));
@@ -1002,6 +1007,13 @@ static int set_lft_block(IN osm_switch_t *p_sw, IN osm_ucast_mgr_t *p_mgr,
IB_SMP_DATA_SIZE, IB_MAD_ATTR_LIN_FWD_TBL,
cl_hton32(block_id_ho),
CL_DISP_MSGID_NONE, &context);
+
+ if (!p_mgr->p_subn->first_time_master_sweep &&
+ block_id_ho == last_block &&
+ p_sw->lft_epoch != p_sw->lft_epoch_prev)
+ osm_opensm_report_event(p_mgr->p_subn->p_osm,
+ OSM_EVENT_ID_LFT_CHANGE, p_sw);
+
if (status != IB_SUCCESS) {
OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, "ERR 3A05: "
"Sending linear fwd. tbl. block failed (%s)\n",
@@ -1022,7 +1034,8 @@ static void ucast_mgr_pipeline_fwd_tbl(osm_ucast_mgr_t * p_mgr)
for (i = 0; i < max_block; i++)
for (item = cl_qmap_head(tbl); item != cl_qmap_end(tbl);
item = cl_qmap_next(item))
- set_lft_block((osm_switch_t *)item, p_mgr, i);
+ set_lft_block((osm_switch_t *)item, p_mgr,
+ i, max_block - 1);
}
void osm_ucast_mgr_set_fwd_tables(osm_ucast_mgr_t * p_mgr)
@@ -156,6 +156,15 @@ static void handle_trap_event(_log_events_t *log, ib_mad_notice_attr_t *p_ntc)
/** =========================================================================
*/
+static void handle_lft_change_event(_log_events_t *log, osm_switch_t *p_sw)
+{
+ fprintf(log->log_file,
+ "LFT changed for switch 0x%" PRIx64 "\n",
+ cl_ntoh64(osm_node_get_node_guid(p_sw->p_node)));
+}
+
+/** =========================================================================
+ */
static void report(void *_log, osm_epi_event_id_t event_id, void *event_data)
{
_log_events_t *log = (_log_events_t *) _log;
@@ -191,6 +200,9 @@ static void report(void *_log, osm_epi_event_id_t event_id, void *event_data)
case OSM_EVENT_ID_SA_DB_DUMPED:
fprintf(log->log_file, "SA DB dump file updated\n");
break;
+ case OSM_EVENT_ID_LFT_CHANGE:
+ handle_lft_change_event(log, (osm_switch_t *) event_data);
+ break;
case OSM_EVENT_ID_MAX:
default:
osm_log(log->osmlog, OSM_LOG_ERROR,
Determine LFT changes based on tracking epoch whenever LFT block or LFTTop changes. Don't issue event on first time master sweep as use SUBNET UP event there. Signed-off-by: Hal Rosenstock <hal@mellanox.com> --- -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html