On 3/6/2012 5:16 PM, Jim Foraker wrote:
> 
> Displaying/changing are both supported for the 
> MKey itself, plus lease and protect bits

Don't we want to be careful about displaying mkey info ? I think by
default it shouldn't be displayed and at least require an additional
option to make it visible.

> Signed-off-by: Jim Foraker <[email protected]>
> ---
>  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);

Nit: bit -> bits

-- Hal

>                       }
>                       *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);

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to