Displaying/changing are both supported for the MKey itself, plus lease and protect bits
Signed-off-by: Jim Foraker <forak...@llnl.gov> --- src/ibportstate.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/ibportstate.c b/src/ibportstate.c index ec6b823..b5a1a98 100644 --- a/src/ibportstate.c +++ b/src/ibportstate.c @@ -64,6 +64,9 @@ enum port_ops { LID, SMLID, LMC, + MKEY, + MKEYLEASE, + MKEYPROT, }; struct ibmad_port *srcport; @@ -76,6 +79,10 @@ int smlid; int lmc; int mtu; int vls = 0; /* no state change */ +int mkeyfake; /* Just a placeholder */ +uint64_t mkey; +int mkeylease; +int mkeyprot; struct { const char *name; @@ -98,6 +105,9 @@ struct { {"lid", &lid, 0}, /* LID */ {"smlid", &smlid, 0}, /* SMLID */ {"lmc", &lmc, 0}, /* LMC */ + {"mkey", &mkeyfake, 0}, /* MKEY */ + {"mkeylease", &mkeylease, 0}, /* MKEY LEASE */ + {"mkeyprot", &mkeyprot, 0}, /* MKEY PROTECT BITS */ }; #define NPORT_ARGS (sizeof(port_args) / sizeof(port_args[0])) @@ -142,7 +152,7 @@ static int get_port_info(ib_portid_t * dest, uint8_t * data, int portnum, } static void show_port_info(ib_portid_t * dest, uint8_t * data, int portnum, - int espeed_cap) + int espeed_cap, int is_switch) { char buf[2300]; char val[64]; @@ -201,18 +211,32 @@ static void show_port_info(ib_portid_t * dest, uint8_t * data, int portnum, val); sprintf(buf + strlen(buf), "%s", "\n"); } + if (!is_switch || portnum == 0) { + mad_decode_field(data, IB_PORT_MKEY_F, val); + mad_dump_field(IB_PORT_MKEY_F, buf + strlen(buf), + sizeof buf - strlen(buf), val); + sprintf(buf+strlen(buf), "%s", "\n"); + mad_decode_field(data, IB_PORT_MKEY_LEASE_F, val); + mad_dump_field(IB_PORT_MKEY_LEASE_F, buf + strlen(buf), + sizeof buf - strlen(buf), val); + sprintf(buf+strlen(buf), "%s", "\n"); + mad_decode_field(data, IB_PORT_MKEY_PROT_BITS_F, val); + mad_dump_field(IB_PORT_MKEY_PROT_BITS_F, buf + strlen(buf), + sizeof buf - strlen(buf), val); + sprintf(buf+strlen(buf), "%s", "\n"); + } printf("# Port info: %s port %d\n%s", portid2str(dest), portnum, buf); } static void set_port_info(ib_portid_t * dest, uint8_t * data, int portnum, - int espeed_cap) + int espeed_cap, int is_switch) { if (!smp_set_via(data, dest, IB_ATTR_PORT_INFO, portnum, 0, srcport)) IBERROR("smp set portinfo failed"); printf("\nAfter PortInfo set:\n"); - show_port_info(dest, data, portnum, espeed_cap); + show_port_info(dest, data, portnum, espeed_cap, is_switch); } static void get_ext_port_info(ib_portid_t * dest, uint8_t * data, int portnum) @@ -351,7 +375,7 @@ int main(int argc, char **argv) long val; char usage_args[] = "<dest dr_path|lid|guid> <portnum> [<op>]\n" "\nSupported ops: enable, disable, reset, speed, width, query,\n" - "\tdown, arm, active, vls, mtu, lid, smlid, lmc\n"; + "\tdown, arm, active, vls, mtu, lid, smlid, lmc, mkey, mkeylease, mkeyprot\n"; const char *usage_examples[] = { "3 1 disable\t\t\t# by lid", "-G 0x2C9000100D051 1 enable\t# by guid", @@ -441,6 +465,18 @@ int main(int argc, char **argv) case LMC: if (val < 0 || val > 7) IBERROR("invalid lmc value %ld", val); + break; + case MKEY: + /* port_args is using ints, but we need uint64 */ + mkey = strtoll(argv[i], 0, 0); + break; + case MKEYLEASE: + if (val < 0 || val > 0xFFFF) + IBERROR("invalid mkey lease time %ld", val); + break; + case MKEYPROT: + if (val < 0 || val > 3) + IBERROR("invalid mkey protection bit setting %ld", val); } *port_args[j].val = (int)val; changed = 1; @@ -455,12 +491,16 @@ int main(int argc, char **argv) is_switch = get_node_info(&portid, data); devid = (uint16_t) mad_get_field(data, 0, IB_NODE_DEVID_F); + if ((port_args[MKEY].set || port_args[MKEYLEASE].set || + port_args[MKEYPROT].set) && is_switch && portnum != 0) + IBERROR("Can't set M_Key fields on switch port != 0"); + if (port_op != QUERY || changed) printf("Initial %s PortInfo:\n", is_switch ? "Switch" : "CA"); else printf("%s PortInfo:\n", is_switch ? "Switch" : "CA"); espeed_cap = get_port_info(&portid, data, portnum, is_switch); - show_port_info(&portid, data, portnum, espeed_cap); + show_port_info(&portid, data, portnum, espeed_cap, is_switch); if (is_mlnx_ext_port_info_supported(devid)) { get_ext_port_info(&portid, data2, portnum); show_ext_port_info(&portid, data2, portnum); @@ -527,7 +567,17 @@ int main(int argc, char **argv) fdr10); set_ext_port_info(&portid, data2, portnum); } - set_port_info(&portid, data, portnum, is_switch); + + if (port_args[MKEY].set) + mad_set_field64(data, 0, IB_PORT_MKEY_F, mkey); + if (port_args[MKEYLEASE].set) + mad_set_field(data, 0, IB_PORT_MKEY_LEASE_F, + mkeylease); + if (port_args[MKEYPROT].set) + mad_set_field(data, 0, IB_PORT_MKEY_PROT_BITS_F, + mkeyprot); + + set_port_info(&portid, data, portnum, espeed_cap, is_switch); } else if (is_switch && portnum) { /* Now, make sure PortState is Active */ @@ -596,7 +646,7 @@ int main(int argc, char **argv) get_ext_port_info(&peerportid, data2, peerlocalportnum); show_port_info(&peerportid, data, peerlocalportnum, - peer_espeed_cap); + peer_espeed_cap, is_peer_switch); if (is_mlnx_ext_port_info_supported(rem_devid)) show_ext_port_info(&peerportid, data2, peerlocalportnum); -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html