This adds many parameters for PathRecord and MCMemberRecord queries (such as mtu, rate, etc.). And slso extended MCMemberRecord dumper. Backward compatibility with existing options (-m, -g, --src-to-dst, --sgid-to-dgid) is preserved.
Signed-off-by: Sasha Khapyorsky <[email protected]> --- infiniband-diags/src/saquery.c | 192 ++++++++++++++++++++++++++++++++++++++-- 1 files changed, 186 insertions(+), 6 deletions(-) diff --git a/infiniband-diags/src/saquery.c b/infiniband-diags/src/saquery.c index 414f0e8..ecb4480 100644 --- a/infiniband-diags/src/saquery.c +++ b/infiniband-diags/src/saquery.c @@ -57,8 +57,19 @@ #include "ibdiag_common.h" struct query_params { - ib_gid_t sgid, dgid; - uint16_t slid, dlid; + ib_gid_t sgid, dgid, gid, mgid; + uint16_t slid, dlid, mlid; + uint32_t flow_label; + int hop_limit; + uint8_t tclass; + int reversible, numb_path; + uint16_t pkey; + int qos_class, sl; + uint8_t mtu, rate, pkt_life; + uint32_t qkey; + uint8_t scope; + uint8_t join_state; + int proxy_join; }; struct query_cmd { @@ -304,6 +315,37 @@ static void dump_one_portinfo_record(void *data) cl_ntoh16(pir->lid), pir->port_num, pir->resv, buf2); } +static void dump_one_mcmember_record(void *data) +{ + char mgid[INET6_ADDRSTRLEN], gid[INET6_ADDRSTRLEN]; + ib_member_rec_t *mr = data; + uint32_t flow; + uint8_t sl, hop, scope, join; + ib_member_get_sl_flow_hop(mr->sl_flow_hop, &sl, &flow, &hop); + ib_member_get_scope_state(mr->scope_state, &scope, &join); + printf("MCMember Record dump:\n" + "\t\tMGID....................%s\n" + "\t\tPortGid.................%s\n" + "\t\tqkey....................0x%x\n" + "\t\tmlid....................0x%x\n" + "\t\tmtu.....................0x%x\n" + "\t\tTClass..................0x%x\n" + "\t\tpkey....................0x%x\n" + "\t\trate....................0x%x\n" + "\t\tpkt_life................0x%x\n" + "\t\tSL......................0x%x\n" + "\t\tFlowLabel...............0x%x\n" + "\t\tHopLimit................0x%x\n" + "\t\tScope...................0x%x\n" + "\t\tJoinState...............0x%x\n" + "\t\tProxyJoin...............0x%x\n", + inet_ntop(AF_INET6, mr->mgid.raw, mgid, sizeof(mgid)), + inet_ntop(AF_INET6, mr->port_gid.raw, gid, sizeof(gid)), + cl_ntoh32(mr->qkey), cl_ntoh16(mr->mlid), mr->mtu, mr->tclass, + cl_ntoh16(mr->pkey), mr->rate, mr->pkt_life, sl, + cl_ntoh32(flow), hop, scope, join, mr->proxy_join); +} + static void dump_multicast_group_record(void *data) { char gid_str[INET6_ADDRSTRLEN]; @@ -814,6 +856,13 @@ static int parse_lid_and_ports(osm_bind_handle_t h, comp_mask |= IB_##name##_COMPMASK_##mask; \ } +#define CHECK_AND_SET_VAL_AND_SEL(val, target, name, mask, sel) \ + if (val) { \ + target = val; \ + comp_mask |= IB_##name##_COMPMASK_##mask##sel; \ + comp_mask |= IB_##name##_COMPMASK_##mask; \ + } + /* * Get the portinfo records available with IsSM or IsSMdisabled CapabilityMask bit on. */ @@ -990,12 +1039,29 @@ static int query_path_records(const struct query_cmd *q, osm_bind_handle_t h, ib_path_rec_t pr; ib_net64_t comp_mask = 0; ib_api_status_t status; + uint32_t flow = 0; + uint16_t qos_class = 0; + uint8_t reversible = 0; memset(&pr, 0, sizeof(pr)); CHECK_AND_SET_GID(p->sgid, pr.sgid, PR, SGID); CHECK_AND_SET_GID(p->dgid, pr.dgid, PR, DGID); CHECK_AND_SET_VAL(p->slid, 16, 0, pr.slid, PR, SLID); CHECK_AND_SET_VAL(p->dlid, 16, 0, pr.dlid, PR, DLID); + CHECK_AND_SET_VAL(p->hop_limit, 32, -1, pr.hop_flow_raw, PR, HOPLIMIT); + CHECK_AND_SET_VAL(p->flow_label, 8, 0, flow, PR, FLOWLABEL); + pr.hop_flow_raw |= cl_hton32(flow << 8); + CHECK_AND_SET_VAL(p->tclass, 8, 0, pr.tclass, PR, TCLASS); + CHECK_AND_SET_VAL(p->reversible, 8, -1, reversible, PR, REVERSIBLE); + CHECK_AND_SET_VAL(p->numb_path, 8, -1, pr.num_path, PR, NUMBPATH); + pr.num_path |= reversible << 7; + CHECK_AND_SET_VAL(p->pkey, 16, 0, pr.pkey, PR, PKEY); + CHECK_AND_SET_VAL(p->sl, 16, -1, pr.qos_class_sl, PR, SL); + CHECK_AND_SET_VAL(p->qos_class, 16, -1, qos_class, PR, QOS_CLASS); + ib_path_rec_set_qos_class(&pr, qos_class); + CHECK_AND_SET_VAL_AND_SEL(p->mtu, pr.mtu, PR, MTU, SELEC); + CHECK_AND_SET_VAL_AND_SEL(p->rate, pr.rate, PR, RATE, SELEC); + CHECK_AND_SET_VAL_AND_SEL(p->pkt_life, pr.pkt_life, PR, PKTLIFETIME, SELEC); status = get_any_records(h, IB_MAD_ATTR_PATH_RECORD, 0, comp_mask, &pr, ib_get_attr_offset(sizeof(pr)), 0); @@ -1137,10 +1203,43 @@ static int query_portinfo_records(const struct query_cmd *q, return 0; } -static int query_mcmember_records(const struct query_cmd *q, osm_bind_handle_t h, - struct query_params *p, int argc, char *argv[]) +static int query_mcmember_records(const struct query_cmd *q, + osm_bind_handle_t h, struct query_params *p, + int argc, char *argv[]) { - return print_multicast_member_records(h); + ib_member_rec_t mr; + ib_net64_t comp_mask = 0; + ib_api_status_t status; + uint32_t flow = 0; + uint8_t sl = 0, hop = 0, scope = 0; + + memset(&mr, 0, sizeof(mr)); + CHECK_AND_SET_GID(p->mgid, mr.mgid, MCR, MGID); + CHECK_AND_SET_GID(p->gid, mr.port_gid, MCR, PORT_GID); + CHECK_AND_SET_VAL(p->mlid, 16, 0, mr.mlid, MCR, MLID); + CHECK_AND_SET_VAL(p->qkey, 32, 0, mr.qkey, MCR, QKEY); + CHECK_AND_SET_VAL_AND_SEL(p->mtu, mr.mtu, MCR, MTU, _SEL); + CHECK_AND_SET_VAL_AND_SEL(p->rate, mr.rate, MCR, RATE, _SEL); + CHECK_AND_SET_VAL_AND_SEL(p->pkt_life, mr.pkt_life, MCR, LIFE, _SEL); + CHECK_AND_SET_VAL(p->tclass, 8, 0, mr.tclass, MCR, TCLASS); + CHECK_AND_SET_VAL(p->pkey, 16, 0, mr.pkey, MCR, PKEY); + CHECK_AND_SET_VAL(p->sl, 8, -1, sl, MCR, SL); + CHECK_AND_SET_VAL(p->flow_label, 8, 0, flow, MCR, FLOW); + CHECK_AND_SET_VAL(p->hop_limit, 8, -1, hop, MCR, HOP); + mr.sl_flow_hop = ib_member_set_sl_flow_hop(sl, flow, hop); + CHECK_AND_SET_VAL(p->scope, 8, 0, scope, MCR, SCOPE); + CHECK_AND_SET_VAL(p->join_state, 8, 0, mr.scope_state, MCR, JOIN_STATE); + mr.scope_state |= scope << 4; + CHECK_AND_SET_VAL(p->proxy_join, 8, -1, mr.proxy_join, MCR, PROXY); + + status = get_any_records(h, IB_MAD_ATTR_MCMEMBER_RECORD, 0, comp_mask, + &mr, ib_get_attr_offset(sizeof(mr)), smkey); + if (status != IB_SUCCESS) + return status; + + dump_results(&result, dump_one_mcmember_record); + return_mad(); + return status; } static int query_service_records(const struct query_cmd *q, osm_bind_handle_t h, @@ -1581,6 +1680,9 @@ static int process_opt(void *context, int ch, char *optarg) case 6: p->dlid = strtoul(optarg, NULL, 0); break; + case 7: + p->mlid = strtoul(optarg, NULL, 0); + break; case 14: if (inet_pton(AF_INET6, optarg, &p->sgid) <= 0) ibdiag_show_usage(); @@ -1589,6 +1691,59 @@ static int process_opt(void *context, int ch, char *optarg) if (inet_pton(AF_INET6, optarg, &p->dgid) <= 0) ibdiag_show_usage(); break; + case 16: + if (inet_pton(AF_INET6, optarg, &p->gid) <= 0) + ibdiag_show_usage(); + break; + case 17: + if (inet_pton(AF_INET6, optarg, &p->mgid) <= 0) + ibdiag_show_usage(); + break; + case 'r': + p->reversible = strtoul(optarg, NULL, 0); + break; + case 'n': + p->numb_path = strtoul(optarg, NULL, 0); + break; + case 18: + p->pkey = strtoul(optarg, NULL, 0); + break; + case 'Q': + p->qos_class = strtoul(optarg, NULL, 0); + break; + case 19: + p->sl = strtoul(optarg, NULL, 0); + break; + case 'M': + p->mtu = strtoul(optarg, NULL, 0); + break; + case 'R': + p->rate = strtoul(optarg, NULL, 0); + break; + case 20: + p->pkt_life = strtoul(optarg, NULL, 0); + break; + case 'q': + p->qkey = strtoul(optarg, NULL, 0); + break; + case 'T': + p->tclass = strtoul(optarg, NULL, 0); + break; + case 'F': + p->flow_label = strtoul(optarg, NULL, 0); + break; + case 'H': + p->hop_limit = strtoul(optarg, NULL, 0); + break; + case 21: + p->scope = strtoul(optarg, NULL, 0); + break; + case 'J': + p->join_state = strtoul(optarg, NULL, 0); + break; + case 'X': + p->proxy_join = strtoul(optarg, NULL, 0); + break; default: return -1; } @@ -1599,7 +1754,14 @@ int main(int argc, char **argv) { char usage_args[1024]; osm_bind_handle_t h; - struct query_params params = { }; + struct query_params params = { + .hop_limit = -1, + .reversible = -1, + .numb_path = -1, + .qos_class = -1, + .sl = -1, + .proxy_join = -1, + }; const struct query_cmd *q; ib_api_status_t status; int n; @@ -1633,8 +1795,26 @@ int main(int argc, char **argv) " saquery will prompt for a value"}, { "slid", 5, 1, "<lid>", "Source LID (PathRecord)" }, { "dlid", 6, 1, "<lid>", "Destination LID (PathRecord)" }, + { "mlid", 7, 1, "<lid>", "Multicast LID (MCMemberRecord)" }, { "sgid", 14, 1, "<gid>", "Source GID (IPv6 format) (PathRecord)" }, { "dgid", 15, 1, "<gid>", "Destination GID (IPv6 format) (PathRecord)" }, + { "gid", 16, 1, "<gid>", "Port GID (MCMemberRecord)" }, + { "mgid", 17, 1, "<gid>", "Multicast GID (MCMemberRecord)" }, + { "reversible", 'r', 1, NULL, "Reversible path (PathRecord)" }, + { "numb_path", 'n', 1, NULL, "Number of paths (PathRecord)" }, + { "pkey", 18, 1, NULL, "P_Key (PathRecord, MCMemberRecord)" }, + { "qos_calss", 'Q', 1, NULL, "QoS Class (PathRecord)"}, + { "sl", 19, 1, NULL, "Service level (PathRecord, MCMemberRecord)" }, + { "mtu", 'M', 1, NULL, "MTU and selector (PathRecord, MCMemberRecord)" }, + { "rate", 'R', 1, NULL, "Rate and selector (PathRecord, MCMemberRecord)" }, + { "pkt_lifetime", 20, 1, NULL, "Packet lifetime and selector (PathRecord, MCMemberRecord)" }, + { "qkey", 'q', 1, NULL, "Q_Key (MCMemberRecord)" }, + { "tclass", 'T', 1, NULL, "Traffic Class (PathRecord, MCMemberRecord)" }, + { "flow_label", 'F', 1, NULL, "Flow Label (PathRecord, MCMemberRecord)" }, + { "hop_limit", 'H', 1, NULL, "Hop limit (PathRecord, MCMemberRecord)" }, + { "scope", 21, 1, NULL, "Scope (MCMemberRecord)" }, + { "join_state", 'J', 1, NULL, "Join state (MCMemberRecord)" }, + { "proxy_join", 'X', 1, NULL, "Proxy join (MCMemberRecord)" }, {} }; -- 1.6.0.4.766.g6fc4a _______________________________________________ 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
