@@ -832,6 +832,69 @@ Exit:
}
static ib_api_status_t
+osmtest_get_path_rec_by_half_world_query(IN osmtest_t * const p_osmt,
+ IN ib_net64_t sguid,
+ IN osmtest_req_context_t * p_context)
+{
+ cl_status_t status = IB_SUCCESS;
+ osmv_query_req_t req;
+ osmv_user_query_t user;
+ ib_path_rec_t record;
+
+ OSM_LOG_ENTER(&p_osmt->log);
+
+ memset(&req, 0, sizeof(req));
+ memset(p_context, 0, sizeof(*p_context));
+ memset(&record, 0, sizeof(record));
+ memset(&user, 0, sizeof(user));
+
+ ib_gid_set_default(&(record.sgid), sguid);
+ record.num_path = 0x01;
+
+ p_context->p_osmt = p_osmt;
+ user.comp_mask = (IB_PR_COMPMASK_SGID | IB_PR_COMPMASK_NUMBPATH);
+ user.attr_id = IB_MAD_ATTR_PATH_RECORD;
+ user.p_attr = &record;
+
+ req.query_type = OSMV_QUERY_USER_DEFINED;
+ req.timeout_ms = p_osmt->opt.transaction_timeout;
+ req.retry_cnt = p_osmt->opt.retry_count;
+ req.flags = OSM_SA_FLAGS_SYNC;
+ req.query_context = p_context;
+ req.pfn_query_cb = osmtest_query_res_cb;
+ req.p_query_input = &user;
+ req.sm_key = 0;
+
+ status = osmv_query_sa(p_osmt->h_bind, &req);
+ if (status != IB_SUCCESS) {
+ OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0063: "
+ "ib_query failed (%s)\n", ib_get_err_str(status));
+ goto Exit;
+ }
+
+ status = (*p_context).result.status;
+
+ if (status != IB_SUCCESS) {
+ OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0066: "
+ "ib_query failed (%s)\n", ib_get_err_str(status));
+
+ if (status == IB_REMOTE_ERROR) {
+ OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
+ "Remote error = %s\n",
+ ib_get_mad_status_str(osm_madw_get_mad_ptr
+ ((*p_context).result.
+ p_result_madw)));
+ }
+ goto Exit;
+ }
+
+Exit:
+
+ OSM_LOG_EXIT(&p_osmt->log);
+ return (status);
+}
+
+static ib_api_status_t
osmtest_get_path_rec_by_guid_pair(IN osmtest_t * const p_osmt,
IN ib_net64_t sguid,
IN ib_net64_t dguid,
@@ -2028,6 +2091,7 @@ osmtest_write_all_node_recs(IN osmtest_t * const p_osmt, IN FILE * fh)
cl_status_t status;
size_t num_recs;
int result;
+ node_t *p_guid_node;
OSM_LOG_ENTER(&p_osmt->log);
@@ -2065,6 +2129,16 @@ osmtest_write_all_node_recs(IN osmtest_t * const p_osmt, IN FILE * fh)
p_rec =
osmv_get_query_node_rec(context.result.p_result_madw, i);
osmtest_write_node_info(p_osmt, fh, p_rec);
+
+ /* create a subnet object */
+ p_guid_node = node_new();
+ CL_ASSERT(p_node != NULL);
+
+ /* copy the info to the subnet node object */
+ p_guid_node->rec = *p_rec;
+ cl_qmap_insert(&p_osmt->exp_subn.node_guid_tbl,
+ p_guid_node->rec.node_info.port_guid,
+ &p_guid_node->map_item);
}
Exit:
@@ -2156,33 +2230,16 @@ osmtest_write_all_path_recs(IN osmtest_t * const p_osmt, IN FILE * fh)
osmtest_req_context_t context;
const ib_path_rec_t *p_rec;
uint32_t i;
- cl_status_t status;
+ cl_status_t status = CL_SUCCESS;
size_t num_recs;
int result;
+ node_t *p_dst_node;
+ cl_qmap_t *p_tbl;
OSM_LOG_ENTER(&p_osmt->log);
- memset(&context, 0, sizeof(context));
-
- /*
- * Do a blocking query for all PathRecords in the subnet.
- */
- status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_PATH_RECORD,
- sizeof(*p_rec), &context);
-
- if (status != IB_SUCCESS) {
- OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0025: "
- "osmtest_get_all_recs failed (%s)\n",
- ib_get_err_str(status));
- goto Exit;
- }
-
- /*
- * Write the received records out to the file.
- */
- num_recs = context.result.result_cnt;
-
- OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %zu records\n", num_recs);
+ p_tbl = &p_osmt->exp_subn.node_guid_tbl;
+ p_dst_node = (node_t *) cl_qmap_head(p_tbl);
result = fprintf(fh, "#\n" "# Path Records\n" "#\n");
if (result < 0) {
@@ -2192,10 +2249,31 @@ osmtest_write_all_path_recs(IN osmtest_t * const p_osmt, IN FILE * fh)
goto Exit;
}
- for (i = 0; i < num_recs; i++) {
- p_rec =
- osmv_get_query_path_rec(context.result.p_result_madw, i);
- osmtest_write_path_info(p_osmt, fh, p_rec);
+ while (p_dst_node != (node_t *) cl_qmap_end(p_tbl)) {
+
+ OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG,"Source : lid = 0x%d type = %d\n",
+ cl_ntoh16(p_dst_node->rec.lid),
+ p_dst_node->rec.node_info.node_type);
+
+ status = osmtest_get_path_rec_by_half_world_query(p_osmt, p_dst_node->rec.node_info.port_guid, &context);
+ if (status != IB_SUCCESS) {
+ OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0025: "
+ "osmtest_get_all_path_recs failed (%s)\n",
+ ib_get_err_str(status));
+ goto Exit;
+ }
+ /*
+ * Write the received records out to the file.
+ */
+ num_recs = context.result.result_cnt;
+ OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %zu records\n", num_recs);
+
+ for (i = 0; i < num_recs; i++) {
+ p_rec =
+ osmv_get_query_path_rec(context.result.p_result_madw, i);
+ osmtest_write_path_info(p_osmt, fh, p_rec);
+ }
+ p_dst_node = (node_t *) cl_qmap_next(&p_dst_node->map_item);
}
Exit:
When osmtest needs to create path records for inventory file, it will do n half-world queries (instead of full world query) where n is the number of end ports which was previously determined. Signed-off-by: Dan Ben Yosef <danby@mellanox.com> --- osmtest/osmtest.c | 130 ++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 104 insertions(+), 26 deletions(-)