/* * openib_backend_get_updown_data * * openib backend module get_updown_data function */ static int openib_backend_get_updown_data(nodeupdown_t nodeupdown_handle, const char *hostname, unsigned int port, unsigned int timeout_len, char *reserved) { osm_bind_handle_t bind_handle; ib_node_record_t *node_record = NULL; ib_net16_t attr_offset = ib_get_attr_offset(sizeof(*node_record)); ib_api_status_t status = IB_SUCCESS; int rc = 0; int i = 0; rc = _get_bind_handle(nodeupdown_handle, &bind_handle); if (rc != 0) { return (rc); } status = _get_all_records(nodeupdown_handle, bind_handle, IB_MAD_ATTR_NODE_RECORD, attr_offset, 0); if (status != IB_SUCCESS) { return (-1); } for (i = 0; i < _openib_result.result_cnt; i++) { ib_node_info_t *p_ni = NULL; node_record = osmv_get_query_node_rec(_openib_result.p_result_madw, i); p_ni = &(node_record->node_info); if (p_ni->node_type == IB_NODE_TYPE_CA) { nodeupdown_add_up_node(nodeupdown_handle, (char *)node_record->node_desc.description); } } _return_mad(); osm_mad_pool_destroy(&_openib_mad_pool); osm_vendor_delete(&_openib_vendor); return (0); }
/* * Query the SA based on the user's request. */ ib_api_status_t osmv_query_sa(IN osm_bind_handle_t h_bind, IN const osmv_query_req_t * const p_query_req) { osmv_sa_bind_info_t *p_bind = (osmv_sa_bind_info_t *) h_bind; osmv_sa_mad_data_t sa_mad_data; osmv_user_query_t *p_user_query; ib_service_record_t svc_rec; ib_node_record_t node_rec; ib_portinfo_record_t port_info; ib_path_rec_t path_rec; ib_class_port_info_t class_port_info; osm_log_t *p_log = p_bind->p_log; ib_api_status_t status; OSM_LOG_ENTER(p_log); /* Set the request information. */ sa_mad_data.method = IB_MAD_METHOD_GETTABLE; sa_mad_data.attr_mod = 0; /* Set the MAD attributes and component mask correctly. */ switch (p_query_req->query_type) { case OSMV_QUERY_USER_DEFINED: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "USER_DEFINED\n"); p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; if (p_user_query->method) sa_mad_data.method = p_user_query->method; sa_mad_data.attr_offset = p_user_query->attr_offset; sa_mad_data.attr_id = p_user_query->attr_id; sa_mad_data.attr_mod = p_user_query->attr_mod; sa_mad_data.comp_mask = p_user_query->comp_mask; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_ALL_SVC_RECS: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "SVC_REC_BY_NAME\n"); sa_mad_data.method = IB_MAD_METHOD_GETTABLE; sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); sa_mad_data.comp_mask = 0; sa_mad_data.p_attr = &svc_rec; break; case OSMV_QUERY_SVC_REC_BY_NAME: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "SVC_REC_BY_NAME\n"); sa_mad_data.method = IB_MAD_METHOD_GET; sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; sa_mad_data.comp_mask = IB_SR_COMPMASK_SNAME; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); sa_mad_data.p_attr = &svc_rec; memcpy(svc_rec.service_name, p_query_req->p_query_input, sizeof(ib_svc_name_t)); break; case OSMV_QUERY_SVC_REC_BY_ID: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "SVC_REC_BY_ID\n"); sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; sa_mad_data.comp_mask = IB_SR_COMPMASK_SID; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); sa_mad_data.p_attr = &svc_rec; svc_rec.service_id = *(ib_net64_t *) (p_query_req->p_query_input); break; case OSMV_QUERY_CLASS_PORT_INFO: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "CLASS_PORT_INFO\n"); sa_mad_data.method = IB_MAD_METHOD_GET; sa_mad_data.attr_id = IB_MAD_ATTR_CLASS_PORT_INFO; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_class_port_info_t)); sa_mad_data.comp_mask = 0; sa_mad_data.p_attr = &class_port_info; break; case OSMV_QUERY_NODE_REC_BY_NODE_GUID: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "NODE_REC_BY_NODE_GUID\n"); sa_mad_data.method = IB_MAD_METHOD_GETTABLE; sa_mad_data.attr_id = IB_MAD_ATTR_NODE_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_node_record_t)); sa_mad_data.comp_mask = IB_NR_COMPMASK_NODEGUID; sa_mad_data.p_attr = &node_rec; node_rec.node_info.node_guid = *(ib_net64_t *) (p_query_req->p_query_input); break; case OSMV_QUERY_PORT_REC_BY_LID: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "PORT_REC_BY_LID\n"); sa_mad_data.attr_id = IB_MAD_ATTR_PORTINFO_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_portinfo_record_t)); sa_mad_data.comp_mask = IB_PIR_COMPMASK_LID; sa_mad_data.p_attr = &port_info; port_info.lid = *(ib_net16_t *) (p_query_req->p_query_input); break; case OSMV_QUERY_PORT_REC_BY_LID_AND_NUM: sa_mad_data.method = IB_MAD_METHOD_GET; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "PORT_REC_BY_LID_AND_NUM\n"); sa_mad_data.attr_id = IB_MAD_ATTR_PORTINFO_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_portinfo_record_t)); sa_mad_data.comp_mask = IB_PIR_COMPMASK_LID | IB_PIR_COMPMASK_PORTNUM; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK: sa_mad_data.method = IB_MAD_METHOD_GET; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK\n"); sa_mad_data.attr_id = IB_MAD_ATTR_VLARB_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_vl_arb_table_record_t)); sa_mad_data.comp_mask = IB_VLA_COMPMASK_LID | IB_VLA_COMPMASK_OUT_PORT | IB_VLA_COMPMASK_BLOCK; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_SLVL_BY_LID_AND_PORTS: sa_mad_data.method = IB_MAD_METHOD_GET; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK\n"); sa_mad_data.attr_id = IB_MAD_ATTR_SLVL_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_slvl_table_record_t)); sa_mad_data.comp_mask = IB_SLVL_COMPMASK_LID | IB_SLVL_COMPMASK_OUT_PORT | IB_SLVL_COMPMASK_IN_PORT; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_PATH_REC_BY_PORT_GUIDS: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "PATH_REC_BY_PORT_GUIDS\n"); memset(&path_rec, 0, sizeof(ib_path_rec_t)); sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_path_rec_t)); sa_mad_data.comp_mask = (IB_PR_COMPMASK_DGID | IB_PR_COMPMASK_SGID); sa_mad_data.p_attr = &path_rec; ib_gid_set_default(&path_rec.dgid, ((osmv_guid_pair_t *) (p_query_req-> p_query_input))-> dest_guid); ib_gid_set_default(&path_rec.sgid, ((osmv_guid_pair_t *) (p_query_req-> p_query_input))-> src_guid); break; case OSMV_QUERY_PATH_REC_BY_GIDS: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "PATH_REC_BY_GIDS\n"); memset(&path_rec, 0, sizeof(ib_path_rec_t)); sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_path_rec_t)); sa_mad_data.comp_mask = (IB_PR_COMPMASK_DGID | IB_PR_COMPMASK_SGID); sa_mad_data.p_attr = &path_rec; memcpy(&path_rec.dgid, &((osmv_gid_pair_t *) (p_query_req->p_query_input))-> dest_gid, sizeof(ib_gid_t)); memcpy(&path_rec.sgid, &((osmv_gid_pair_t *) (p_query_req->p_query_input))-> src_gid, sizeof(ib_gid_t)); break; case OSMV_QUERY_PATH_REC_BY_LIDS: osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "PATH_REC_BY_LIDS\n"); memset(&path_rec, 0, sizeof(ib_path_rec_t)); sa_mad_data.method = IB_MAD_METHOD_GET; sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_path_rec_t)); sa_mad_data.comp_mask = (IB_PR_COMPMASK_DLID | IB_PR_COMPMASK_SLID); sa_mad_data.p_attr = &path_rec; path_rec.dlid = ((osmv_lid_pair_t *) (p_query_req->p_query_input))-> dest_lid; path_rec.slid = ((osmv_lid_pair_t *) (p_query_req->p_query_input))->src_lid; break; case OSMV_QUERY_UD_MULTICAST_SET: sa_mad_data.method = IB_MAD_METHOD_SET; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "OSMV_QUERY_UD_MULTICAST_SET\n"); sa_mad_data.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t)); sa_mad_data.comp_mask = p_user_query->comp_mask; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_UD_MULTICAST_DELETE: sa_mad_data.method = IB_MAD_METHOD_DELETE; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; osm_log(p_log, OSM_LOG_DEBUG, "osmv_query_sa DBG:001 %s", "OSMV_QUERY_UD_MULTICAST_DELETE\n"); sa_mad_data.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t)); sa_mad_data.comp_mask = p_user_query->comp_mask; sa_mad_data.p_attr = p_user_query->p_attr; break; default: osm_log(p_log, OSM_LOG_ERROR, "osmv_query_sa DBG:001 %s", "UNKNOWN\n"); CL_ASSERT(0); return IB_ERROR; } status = __osmv_send_sa_req(h_bind, &sa_mad_data, p_query_req); OSM_LOG_EXIT(p_log); return status; }
/* * Query the SA based on the user's request. */ ib_api_status_t osmv_query_sa(IN osm_bind_handle_t h_bind, IN const osmv_query_req_t * const p_query_req) { osmv_sa_bind_info_t *p_bind = (osmv_sa_bind_info_t *) h_bind; osmv_sa_mad_data_t sa_mad_data; osmv_user_query_t *p_user_query; ib_service_record_t svc_rec; ib_node_record_t node_rec; ib_portinfo_record_t port_info; ib_path_rec_t path_rec; #ifdef DUAL_SIDED_RMPP ib_multipath_rec_t multipath_rec; osmv_multipath_req_t *p_mpr_req; int i, j; #endif ib_class_port_info_t class_port_info; osm_log_t *p_log = p_bind->p_log; ib_api_status_t status; OSM_LOG_ENTER(p_log); /* Set the request information. */ sa_mad_data.method = IB_MAD_METHOD_GETTABLE; sa_mad_data.attr_mod = 0; /* Set the MAD attributes and component mask correctly. */ switch (p_query_req->query_type) { case OSMV_QUERY_USER_DEFINED: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 USER_DEFINED\n"); p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; if (p_user_query->method) sa_mad_data.method = p_user_query->method; sa_mad_data.attr_offset = p_user_query->attr_offset; sa_mad_data.attr_id = p_user_query->attr_id; sa_mad_data.attr_mod = p_user_query->attr_mod; sa_mad_data.comp_mask = p_user_query->comp_mask; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_ALL_SVC_RECS: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 SVC_REC_BY_NAME\n"); sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); sa_mad_data.comp_mask = 0; sa_mad_data.p_attr = &svc_rec; break; case OSMV_QUERY_SVC_REC_BY_NAME: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 SVC_REC_BY_NAME\n"); sa_mad_data.method = IB_MAD_METHOD_GET; sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; sa_mad_data.comp_mask = IB_SR_COMPMASK_SNAME; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); sa_mad_data.p_attr = &svc_rec; memcpy(svc_rec.service_name, p_query_req->p_query_input, sizeof(ib_svc_name_t)); break; case OSMV_QUERY_SVC_REC_BY_ID: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 SVC_REC_BY_ID\n"); sa_mad_data.attr_id = IB_MAD_ATTR_SERVICE_RECORD; sa_mad_data.comp_mask = IB_SR_COMPMASK_SID; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_service_record_t)); sa_mad_data.p_attr = &svc_rec; svc_rec.service_id = *(ib_net64_t *) (p_query_req->p_query_input); break; case OSMV_QUERY_CLASS_PORT_INFO: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 CLASS_PORT_INFO\n"); sa_mad_data.method = IB_MAD_METHOD_GET; sa_mad_data.attr_id = IB_MAD_ATTR_CLASS_PORT_INFO; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_class_port_info_t)); sa_mad_data.comp_mask = 0; sa_mad_data.p_attr = &class_port_info; break; case OSMV_QUERY_NODE_REC_BY_NODE_GUID: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 NODE_REC_BY_NODE_GUID\n"); sa_mad_data.attr_id = IB_MAD_ATTR_NODE_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_node_record_t)); sa_mad_data.comp_mask = IB_NR_COMPMASK_NODEGUID; sa_mad_data.p_attr = &node_rec; node_rec.node_info.node_guid = *(ib_net64_t *) (p_query_req->p_query_input); break; case OSMV_QUERY_PORT_REC_BY_LID: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PORT_REC_BY_LID\n"); sa_mad_data.attr_id = IB_MAD_ATTR_PORTINFO_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_portinfo_record_t)); sa_mad_data.comp_mask = IB_PIR_COMPMASK_LID; sa_mad_data.p_attr = &port_info; port_info.lid = *(ib_net16_t *) (p_query_req->p_query_input); break; case OSMV_QUERY_PORT_REC_BY_LID_AND_NUM: sa_mad_data.method = IB_MAD_METHOD_GET; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PORT_REC_BY_LID_AND_NUM\n"); sa_mad_data.attr_id = IB_MAD_ATTR_PORTINFO_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_portinfo_record_t)); sa_mad_data.comp_mask = IB_PIR_COMPMASK_LID | IB_PIR_COMPMASK_PORTNUM; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK: sa_mad_data.method = IB_MAD_METHOD_GET; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK\n"); sa_mad_data.attr_id = IB_MAD_ATTR_VLARB_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_vl_arb_table_record_t)); sa_mad_data.comp_mask = IB_VLA_COMPMASK_LID | IB_VLA_COMPMASK_OUT_PORT | IB_VLA_COMPMASK_BLOCK; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_SLVL_BY_LID_AND_PORTS: sa_mad_data.method = IB_MAD_METHOD_GET; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK\n"); sa_mad_data.attr_id = IB_MAD_ATTR_SLVL_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_slvl_table_record_t)); sa_mad_data.comp_mask = IB_SLVL_COMPMASK_LID | IB_SLVL_COMPMASK_OUT_PORT | IB_SLVL_COMPMASK_IN_PORT; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_PATH_REC_BY_PORT_GUIDS: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PATH_REC_BY_PORT_GUIDS\n"); memset(&path_rec, 0, sizeof(ib_path_rec_t)); sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_path_rec_t)); sa_mad_data.comp_mask = (IB_PR_COMPMASK_DGID | IB_PR_COMPMASK_SGID); sa_mad_data.p_attr = &path_rec; ib_gid_set_default(&path_rec.dgid, ((osmv_guid_pair_t *) (p_query_req-> p_query_input))-> dest_guid); ib_gid_set_default(&path_rec.sgid, ((osmv_guid_pair_t *) (p_query_req-> p_query_input))-> src_guid); break; case OSMV_QUERY_PATH_REC_BY_GIDS: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PATH_REC_BY_GIDS\n"); memset(&path_rec, 0, sizeof(ib_path_rec_t)); sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_path_rec_t)); sa_mad_data.comp_mask = (IB_PR_COMPMASK_DGID | IB_PR_COMPMASK_SGID); sa_mad_data.p_attr = &path_rec; memcpy(&path_rec.dgid, &((osmv_gid_pair_t *) (p_query_req->p_query_input))-> dest_gid, sizeof(ib_gid_t)); memcpy(&path_rec.sgid, &((osmv_gid_pair_t *) (p_query_req->p_query_input))-> src_gid, sizeof(ib_gid_t)); break; case OSMV_QUERY_PATH_REC_BY_LIDS: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 PATH_REC_BY_LIDS\n"); memset(&path_rec, 0, sizeof(ib_path_rec_t)); sa_mad_data.method = IB_MAD_METHOD_GET; sa_mad_data.attr_id = IB_MAD_ATTR_PATH_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_path_rec_t)); sa_mad_data.comp_mask = (IB_PR_COMPMASK_DLID | IB_PR_COMPMASK_SLID); sa_mad_data.p_attr = &path_rec; path_rec.dlid = ((osmv_lid_pair_t *) (p_query_req->p_query_input))-> dest_lid; path_rec.slid = ((osmv_lid_pair_t *) (p_query_req->p_query_input))->src_lid; break; case OSMV_QUERY_UD_MULTICAST_SET: sa_mad_data.method = IB_MAD_METHOD_SET; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 OSMV_QUERY_UD_MULTICAST_SET\n"); sa_mad_data.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t)); sa_mad_data.comp_mask = p_user_query->comp_mask; sa_mad_data.p_attr = p_user_query->p_attr; break; case OSMV_QUERY_UD_MULTICAST_DELETE: sa_mad_data.method = IB_MAD_METHOD_DELETE; p_user_query = (osmv_user_query_t *) p_query_req->p_query_input; OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 OSMV_QUERY_UD_MULTICAST_DELETE\n"); sa_mad_data.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t)); sa_mad_data.comp_mask = p_user_query->comp_mask; sa_mad_data.p_attr = p_user_query->p_attr; break; #ifdef DUAL_SIDED_RMPP case OSMV_QUERY_MULTIPATH_REC: OSM_LOG(p_log, OSM_LOG_DEBUG, "DBG:001 MULTIPATH_REC\n"); /* Validate sgid/dgid counts against SA client limit */ p_mpr_req = (osmv_multipath_req_t *) p_query_req->p_query_input; if (p_mpr_req->sgid_count + p_mpr_req->dgid_count > IB_MULTIPATH_MAX_GIDS) { OSM_LOG(p_log, OSM_LOG_ERROR, "DBG:001 MULTIPATH_REC " "SGID count %d DGID count %d max count %d\n", p_mpr_req->sgid_count, p_mpr_req->dgid_count, IB_MULTIPATH_MAX_GIDS); CL_ASSERT(0); return IB_ERROR; } memset(&multipath_rec, 0, sizeof(ib_multipath_rec_t)); sa_mad_data.method = IB_MAD_METHOD_GETMULTI; sa_mad_data.attr_id = IB_MAD_ATTR_MULTIPATH_RECORD; sa_mad_data.attr_offset = ib_get_attr_offset(sizeof(ib_multipath_rec_t)); sa_mad_data.p_attr = &multipath_rec; sa_mad_data.comp_mask = p_mpr_req->comp_mask; multipath_rec.num_path = p_mpr_req->num_path; if (p_mpr_req->reversible) multipath_rec.num_path |= 0x80; else multipath_rec.num_path &= ~0x80; multipath_rec.pkey = p_mpr_req->pkey; ib_multipath_rec_set_sl(&multipath_rec, p_mpr_req->sl); ib_multipath_rec_set_qos_class(&multipath_rec, 0); multipath_rec.independence = p_mpr_req->independence; multipath_rec.sgid_count = p_mpr_req->sgid_count; multipath_rec.dgid_count = p_mpr_req->dgid_count; j = 0; for (i = 0; i < p_mpr_req->sgid_count; i++, j++) multipath_rec.gids[j] = p_mpr_req->gids[j]; for (i = 0; i < p_mpr_req->dgid_count; i++, j++) multipath_rec.gids[j] = p_mpr_req->gids[j]; break; #endif default: OSM_LOG(p_log, OSM_LOG_ERROR, "DBG:001 UNKNOWN\n"); CL_ASSERT(0); return IB_ERROR; } status = __osmv_send_sa_req(h_bind, &sa_mad_data, p_query_req); OSM_LOG_EXIT(p_log); return status; }
void osm_sa_respond(osm_sa_t *sa, osm_madw_t *madw, size_t attr_size, cl_qlist_t *list) { struct item_data { cl_list_item_t list; char data[0]; }; cl_list_item_t *item; osm_madw_t *resp_madw; ib_sa_mad_t *sa_mad, *resp_sa_mad; unsigned num_rec, i; #ifndef VENDOR_RMPP_SUPPORT unsigned trim_num_rec; #endif unsigned char *p; sa_mad = osm_madw_get_sa_mad_ptr(madw); num_rec = cl_qlist_count(list); /* * C15-0.1.30: * If we do a SubnAdmGet and got more than one record it is an error! */ if (sa_mad->method == IB_MAD_METHOD_GET && num_rec > 1) { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4C05: " "Got %u records for SubnAdmGet(%s) comp_mask 0x%016" PRIx64 "\n", num_rec, ib_get_sa_attr_str(sa_mad->attr_id), cl_ntoh64(sa_mad->comp_mask)); osm_sa_send_error(sa, madw, IB_SA_MAD_STATUS_TOO_MANY_RECORDS); goto Exit; } #ifndef VENDOR_RMPP_SUPPORT trim_num_rec = (MAD_BLOCK_SIZE - IB_SA_MAD_HDR_SIZE) / attr_size; if (trim_num_rec < num_rec) { OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, "Number of records:%u trimmed to:%u to fit in one MAD\n", num_rec, trim_num_rec); num_rec = trim_num_rec; } #endif OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Returning %u records\n", num_rec); if (sa_mad->method == IB_MAD_METHOD_GET && num_rec == 0) { osm_sa_send_error(sa, madw, IB_SA_MAD_STATUS_NO_RECORDS); goto Exit; } /* * Get a MAD to reply. Address of Mad is in the received mad_wrapper */ resp_madw = osm_mad_pool_get(sa->p_mad_pool, madw->h_bind, num_rec * attr_size + IB_SA_MAD_HDR_SIZE, &madw->mad_addr); if (!resp_madw) { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4C06: " "osm_mad_pool_get failed\n"); osm_sa_send_error(sa, madw, IB_SA_MAD_STATUS_NO_RESOURCES); goto Exit; } resp_sa_mad = osm_madw_get_sa_mad_ptr(resp_madw); /* Copy the MAD header back into the response mad. Set the 'R' bit and the payload length, Then copy all records from the list into the response payload. */ memcpy(resp_sa_mad, sa_mad, IB_SA_MAD_HDR_SIZE); if (resp_sa_mad->method == IB_MAD_METHOD_SET) resp_sa_mad->method = IB_MAD_METHOD_GET; resp_sa_mad->method |= IB_MAD_METHOD_RESP_MASK; /* C15-0.1.5 - always return SM_Key = 0 (table 185 p 884) */ resp_sa_mad->sm_key = 0; /* Fill in the offset (paylen will be done by the rmpp SAR) */ resp_sa_mad->attr_offset = num_rec ? ib_get_attr_offset(attr_size) : 0; p = ib_sa_mad_get_payload_ptr(resp_sa_mad); #ifndef VENDOR_RMPP_SUPPORT /* we support only one packet RMPP - so we will set the first and last flags for gettable */ if (resp_sa_mad->method == IB_MAD_METHOD_GETTABLE_RESP) { resp_sa_mad->rmpp_type = IB_RMPP_TYPE_DATA; resp_sa_mad->rmpp_flags = IB_RMPP_FLAG_FIRST | IB_RMPP_FLAG_LAST | IB_RMPP_FLAG_ACTIVE; } #else /* forcefully define the packet as RMPP one */ if (resp_sa_mad->method == IB_MAD_METHOD_GETTABLE_RESP) resp_sa_mad->rmpp_flags = IB_RMPP_FLAG_ACTIVE; #endif for (i = 0; i < num_rec; i++) { item = cl_qlist_remove_head(list); memcpy(p, ((struct item_data *)item)->data, attr_size); p += attr_size; free(item); } osm_dump_sa_mad(sa->p_log, resp_sa_mad, OSM_LOG_FRAMES); osm_sa_send(sa, resp_madw, FALSE); Exit: /* need to set the mem free ... */ item = cl_qlist_remove_head(list); while (item != cl_qlist_end(list)) { free(item); item = cl_qlist_remove_head(list); } }