On Wed, 30 May 2012 10:21:30 -0700 Jim Foraker <[email protected]> wrote:
> Cause security credentials to not be displayed by default. Instead, > the "-K" flag is supported, which must be passed to the command > to display valid results. > > Signed-off-by: Jim Foraker <[email protected]> Thanks, applied, Ira > --- > doc/rst/common/opt_K.rst | 4 +++ > doc/rst/saquery.8.in.rst | 2 ++ > doc/rst/smpquery.8.in.rst | 2 ++ > include/ibdiag_common.h | 9 ++++++ > src/ibaddr.c | 2 +- > src/ibcacheedit.c | 2 +- > src/ibccconfig.c | 2 +- > src/ibccquery.c | 2 +- > src/ibdiag_common.c | 71 > +++++++++++++++++++++++++++++++++++++++++++++ > src/iblinkinfo.c | 2 +- > src/ibnetdiscover.c | 2 +- > src/ibping.c | 2 +- > src/ibqueryerrors.c | 2 +- > src/ibroute.c | 2 +- > src/ibsendtrap.c | 2 +- > src/ibstat.c | 2 +- > src/ibsysstat.c | 2 +- > src/ibtracert.c | 2 +- > src/perfquery.c | 2 +- > src/saquery.c | 66 ++++++++++++++++++++--------------------- > src/sminfo.c | 2 +- > src/smpdump.c | 2 +- > src/smpquery.c | 6 ++-- > src/vendstat.c | 2 +- > 24 files changed, 139 insertions(+), 55 deletions(-) > create mode 100644 doc/rst/common/opt_K.rst > > diff --git a/doc/rst/common/opt_K.rst b/doc/rst/common/opt_K.rst > new file mode 100644 > index 0000000..2b96bf2 > --- /dev/null > +++ b/doc/rst/common/opt_K.rst > @@ -0,0 +1,4 @@ > +.. Define the common option -K > + > +**-K, --show_keys** > + show security keys (mkey, smkey, etc.) associated with the request. > diff --git a/doc/rst/saquery.8.in.rst b/doc/rst/saquery.8.in.rst > index 36696c7..79c8bd3 100644 > --- a/doc/rst/saquery.8.in.rst > +++ b/doc/rst/saquery.8.in.rst > @@ -84,6 +84,8 @@ OPTIONS > queries. If non-numeric value (like 'x') is specified then saquery > will prompt for a value. > > +.. include:: common/opt_K.rst > + > **--slid <lid>** Source LID (PathRecord) > > **--dlid <lid>** Destination LID (PathRecord) > diff --git a/doc/rst/smpquery.8.in.rst b/doc/rst/smpquery.8.in.rst > index 3b249df..b422731 100644 > --- a/doc/rst/smpquery.8.in.rst > +++ b/doc/rst/smpquery.8.in.rst > @@ -46,6 +46,8 @@ Current supported operations and their parameters: > Set SMSupportsExtendedSpeeds bit 31 in AttributeModifier > (only impacts PortInfo queries). > > +.. include:: common/opt_K.rst > + > > Addressing Flags > ---------------- > diff --git a/include/ibdiag_common.h b/include/ibdiag_common.h > index 6645322..e989088 100644 > --- a/include/ibdiag_common.h > +++ b/include/ibdiag_common.h > @@ -39,6 +39,7 @@ > #ifndef _IBDIAG_COMMON_H_ > #define _IBDIAG_COMMON_H_ > > +#include <stdarg.h> > #include <infiniband/mad.h> > #include <infiniband/iba/ib_types.h> > #include <infiniband/ibnetdisc.h> > @@ -50,6 +51,7 @@ extern enum MAD_DEST ibd_dest_type; > extern ib_portid_t *ibd_sm_id; > extern int ibd_timeout; > extern uint32_t ibd_ibnetdisc_flags; > +extern int show_keys; > > /*========================================================*/ > /* External interface */ > @@ -64,6 +66,8 @@ extern uint32_t ibd_ibnetdisc_flags; > } while (0) > #define IBERROR(fmt, ...) iberror(__FUNCTION__, fmt, ## __VA_ARGS__) > > +#define NOT_DISPLAYED_STR "<not displayed>" > + > /* not all versions of ib_types.h will have this define */ > #ifndef IB_PM_PC_XMIT_WAIT_SUP > #define IB_PM_PC_XMIT_WAIT_SUP (CL_HTON16(((uint16_t)1)<<12)) > @@ -150,4 +154,9 @@ int resolve_self(char *ca_name, uint8_t ca_port, > ib_portid_t *portid, > int resolve_portid_str(char *ca_name, uint8_t ca_port, ib_portid_t * portid, > char *addr_str, enum MAD_DEST dest_type, > ib_portid_t *sm_id, const struct ibmad_port *srcport); > +int vsnprint_field(char *buf, size_t n, enum MAD_FIELDS f, int spacing, > + const char *format, va_list va_args); > +int snprint_field(char *buf, size_t n, enum MAD_FIELDS f, int spacing, > + const char *format, ...); > +void dump_portinfo(void *pi, int pisize, int tabs); > #endif /* _IBDIAG_COMMON_H_ */ > diff --git a/src/ibaddr.c b/src/ibaddr.c > index 455d941..0735837 100644 > --- a/src/ibaddr.c > +++ b/src/ibaddr.c > @@ -133,7 +133,7 @@ int main(int argc, char **argv) > NULL > }; > > - ibdiag_process_opts(argc, argv, NULL, "L", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "KL", opts, process_opt, > usage_args, usage_examples); > > argc -= optind; > diff --git a/src/ibcacheedit.c b/src/ibcacheedit.c > index f9e7dc9..2f9a634 100644 > --- a/src/ibcacheedit.c > +++ b/src/ibcacheedit.c > @@ -269,7 +269,7 @@ int main(int argc, char **argv) > }; > char *usage_args = "<orig.cache> <new.cache>"; > > - ibdiag_process_opts(argc, argv, NULL, "CDdeGLPstv", > + ibdiag_process_opts(argc, argv, NULL, "CDdeGKLPstv", > opts, process_opt, usage_args, > NULL); > > diff --git a/src/ibccconfig.c b/src/ibccconfig.c > index f84c63c..d796ed8 100644 > --- a/src/ibccconfig.c > +++ b/src/ibccconfig.c > @@ -615,7 +615,7 @@ int main(int argc, char **argv) > exit(-1); > } > > - ibdiag_process_opts(argc, argv, NULL, "D", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "DK", opts, process_opt, > usage_args, usage_examples); > > argc -= optind; > diff --git a/src/ibccquery.c b/src/ibccquery.c > index acdfe46..34a9afd 100644 > --- a/src/ibccquery.c > +++ b/src/ibccquery.c > @@ -399,7 +399,7 @@ int main(int argc, char **argv) > exit(-1); > } > > - ibdiag_process_opts(argc, argv, NULL, "D", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "DK", opts, process_opt, > usage_args, usage_examples); > > argc -= optind; > diff --git a/src/ibdiag_common.c b/src/ibdiag_common.c > index 2f12c46..2662b9b 100644 > --- a/src/ibdiag_common.c > +++ b/src/ibdiag_common.c > @@ -53,6 +53,7 @@ > #include <getopt.h> > #include <limits.h> > #include <sys/stat.h> > +#include <stdarg.h> > > #include <infiniband/umad.h> > #include <infiniband/mad.h> > @@ -70,6 +71,7 @@ char *ibd_ca = NULL; > int ibd_ca_port = 0; > int ibd_timeout = 0; > uint32_t ibd_ibnetdisc_flags = IBND_CONFIG_MLX_EPI; > +int show_keys = 0; > > static const char *prog_name; > static const char *prog_args; > @@ -260,6 +262,9 @@ static int process_opt(int ch, char *optarg) > optarg); > ibd_sm_id = &sm_portid; > break; > + case 'K': > + show_keys = 1; > + break; > default: > return -1; > } > @@ -276,6 +281,7 @@ static const struct ibdiag_opt common_opts[] = { > {"Guid", 'G', 0, NULL, "use GUID address argument"}, > {"timeout", 't', 1, "<ms>", "timeout in ms"}, > {"sm_port", 's', 1, "<lid>", "SM port lid"}, > + {"show_keys", 'K', 0, NULL, "display security keys in output"}, > {"errors", 'e', 0, NULL, "show send and receive errors"}, > {"verbose", 'v', 0, NULL, "increase verbosity level"}, > {"debug", 'd', 0, NULL, "raise debug level"}, > @@ -913,3 +919,68 @@ check_fdr10_active: > IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F) & FDR10) == 0) > snprintf(speed_msg, msg_size, "Could be FDR10"); > } > + > +int vsnprint_field(char *buf, size_t n, enum MAD_FIELDS f, int spacing, > + const char *format, va_list va_args) > +{ > + int len, i, ret; > + > + len = strlen(mad_field_name(f)); > + if (len + 2 > n || spacing + 1 > n) > + return 0; > + > + strncpy(buf, mad_field_name(f), n); > + buf[len] = ':'; > + for (i = len+1; i < spacing+1; i++) { > + buf[i] = '.'; > + } > + > + ret = vsnprintf(&buf[spacing+1], n - spacing, format, va_args); > + if (ret >= n - spacing) > + buf[n] = '\0'; > + > + return ret + spacing; > +} > + > +int snprint_field(char *buf, size_t n, enum MAD_FIELDS f, int spacing, > + const char *format, ...) > +{ > + va_list val; > + int ret; > + > + va_start(val, format); > + ret = vsnprint_field(buf, n, f, spacing, format, val); > + va_end(val); > + > + return ret; > +} > + > +void dump_portinfo(void *pi, int pisize, int tabs) > +{ > + int field, i; > + char val[64]; > + char buf[1024]; > + > + for (field = IB_PORT_FIRST_F; field < IB_PORT_LAST_F; field++) { > + for (i=0;i<tabs;i++) > + printf("\t"); > + if (field == IB_PORT_MKEY_F && show_keys == 0) { > + snprint_field(buf, 1024, field, 32, NOT_DISPLAYED_STR); > + } else { > + mad_decode_field(pi, field, val); > + if (!mad_dump_field(field, buf, 1024, val)) > + return; > + } > + printf("%s\n", buf); > + } > + > + for (field = IB_PORT_CAPMASK2_F; > + field < IB_PORT_LINK_SPEED_EXT_LAST_F; field++) { > + for (i=0;i<tabs;i++) > + printf("\t"); > + mad_decode_field(pi, field, val); > + if (!mad_dump_field(field, buf, 1024, val)) > + return; > + printf("%s\n", buf); > + } > +} > diff --git a/src/iblinkinfo.c b/src/iblinkinfo.c > index a817920..e4a8d65 100644 > --- a/src/iblinkinfo.c > +++ b/src/iblinkinfo.c > @@ -619,7 +619,7 @@ int main(int argc, char **argv) > }; > char usage_args[] = ""; > > - ibdiag_process_opts(argc, argv, &config, "aDdGgLlnpRS", opts, > + ibdiag_process_opts(argc, argv, &config, "aDdGgKLlnpRS", opts, > process_opt, usage_args, NULL); > > argc -= optind; > diff --git a/src/ibnetdiscover.c b/src/ibnetdiscover.c > index 4748be9..6ed0801 100644 > --- a/src/ibnetdiscover.c > +++ b/src/ibnetdiscover.c > @@ -1074,7 +1074,7 @@ int main(int argc, char **argv) > }; > char usage_args[] = "[topology-file]"; > > - ibdiag_process_opts(argc, argv, &config, "DGLs", opts, process_opt, > + ibdiag_process_opts(argc, argv, &config, "DGKLs", opts, process_opt, > usage_args, NULL); > > f = stdout; > diff --git a/src/ibping.c b/src/ibping.c > index 205aa82..6d3246c 100644 > --- a/src/ibping.c > +++ b/src/ibping.c > @@ -202,7 +202,7 @@ int main(int argc, char **argv) > }; > char usage_args[] = "<dest lid|guid>"; > > - ibdiag_process_opts(argc, argv, NULL, "D", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "DK", opts, process_opt, > usage_args, NULL); > > argc -= optind; > diff --git a/src/ibqueryerrors.c b/src/ibqueryerrors.c > index eb57418..c4ffcf1 100644 > --- a/src/ibqueryerrors.c > +++ b/src/ibqueryerrors.c > @@ -901,7 +901,7 @@ int main(int argc, char **argv) > char usage_args[] = ""; > > memset(suppressed_fields, 0, sizeof suppressed_fields); > - ibdiag_process_opts(argc, argv, &config, "cDGLnRrSs", opts, process_opt, > + ibdiag_process_opts(argc, argv, &config, "cDGKLnRrSs", opts, > process_opt, > usage_args, NULL); > > argc -= optind; > diff --git a/src/ibroute.c b/src/ibroute.c > index faff34d..63baf04 100644 > --- a/src/ibroute.c > +++ b/src/ibroute.c > @@ -414,7 +414,7 @@ int main(int argc, char **argv) > NULL, > }; > > - ibdiag_process_opts(argc, argv, NULL, NULL, opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "K", opts, process_opt, > usage_args, usage_examples); > > argc -= optind; > diff --git a/src/ibsendtrap.c b/src/ibsendtrap.c > index f98d9cf..98bacf1 100644 > --- a/src/ibsendtrap.c > +++ b/src/ibsendtrap.c > @@ -192,7 +192,7 @@ int main(int argc, char **argv) > snprintf(usage_args + n, sizeof(usage_args) - n, > "\n default behavior is to send \"%s\"", traps[0].trap_name); > > - ibdiag_process_opts(argc, argv, NULL, "DGL", NULL, NULL, > + ibdiag_process_opts(argc, argv, NULL, "DGKL", NULL, NULL, > usage_args, NULL); > > argc -= optind; > diff --git a/src/ibstat.c b/src/ibstat.c > index 3d971ed..12d3c20 100644 > --- a/src/ibstat.c > +++ b/src/ibstat.c > @@ -292,7 +292,7 @@ int main(int argc, char *argv[]) > NULL > }; > > - ibdiag_process_opts(argc, argv, NULL, "CDeGLPst", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "CDeGKLPst", opts, process_opt, > usage_args, usage_examples); > > argc -= optind; > diff --git a/src/ibsysstat.c b/src/ibsysstat.c > index 2b11a06..bac4bb1 100644 > --- a/src/ibsysstat.c > +++ b/src/ibsysstat.c > @@ -326,7 +326,7 @@ int main(int argc, char **argv) > }; > char usage_args[] = "<dest lid|guid> [<op>]"; > > - ibdiag_process_opts(argc, argv, NULL, "D", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "DK", opts, process_opt, > usage_args, NULL); > > argc -= optind; > diff --git a/src/ibtracert.c b/src/ibtracert.c > index e8fedf3..575d9d0 100644 > --- a/src/ibtracert.c > +++ b/src/ibtracert.c > @@ -757,7 +757,7 @@ int main(int argc, char **argv) > NULL, > }; > > - ibdiag_process_opts(argc, argv, NULL, "D", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "DK", opts, process_opt, > usage_args, usage_examples); > > f = stdout; > diff --git a/src/perfquery.c b/src/perfquery.c > index b58ad70..9ca2e15 100644 > --- a/src/perfquery.c > +++ b/src/perfquery.c > @@ -710,7 +710,7 @@ int main(int argc, char **argv) > NULL, > }; > > - ibdiag_process_opts(argc, argv, NULL, "D", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "DK", opts, process_opt, > usage_args, usage_examples); > > argc -= optind; > diff --git a/src/saquery.c b/src/saquery.c > index 1e730a4..90feb2d 100644 > --- a/src/saquery.c > +++ b/src/saquery.c > @@ -116,20 +116,6 @@ static unsigned valid_gid(ib_gid_t * gid) > return memcmp(&zero_gid, gid, sizeof(*gid)); > } > > -static void format_buf(char *in, char *out, unsigned size) > -{ > - unsigned i; > - > - for (i = 0; i < size - 3 && *in; i++) { > - *out++ = *in; > - if (*in++ == '\n' && *in) { > - *out++ = '\t'; > - *out++ = '\t'; > - } > - } > - *out = '\0'; > -} > - > static void print_node_desc(ib_node_record_t * node_record) > { > ib_node_info_t *p_ni = &(node_record->node_info); > @@ -300,19 +286,17 @@ static void dump_portinfo_record(void *data) > > static void dump_one_portinfo_record(void *data) > { > - char buf[2300], buf2[4096]; > ib_portinfo_record_t *pir = data; > ib_port_info_t *pi = &pir->port_info; > > - mad_dump_portinfo(buf, sizeof(buf), pi, sizeof(*pi)); > - format_buf(buf, buf2, sizeof(buf2)); > printf("PortInfoRecord dump:\n" > "\tRID:\n" > "\t\tEndPortLid..............%u\n" > "\t\tPortNum.................%u\n" > "\t\tOptions.................0x%x\n" > - "\tPortInfo dump:\n\t\t%s", > - cl_ntoh16(pir->lid), pir->port_num, pir->options, buf2); > + "\tPortInfo dump:\n", > + cl_ntoh16(pir->lid), pir->port_num, pir->options); > + dump_portinfo(pi, sizeof(*pi), 2); > } > > static void dump_one_mcmember_record(void *data) > @@ -471,7 +455,8 @@ static void dump_service_record(void *data) > cl_ntoh64(p_sr->service_id), > inet_ntop(AF_INET6, p_sr->service_gid.raw, gid, sizeof gid), > cl_ntoh16(p_sr->service_pkey), cl_ntoh32(p_sr->service_lease), > - buf_service_key, buf_service_name, > + (show_keys ? buf_service_key : NOT_DISPLAYED_STR), > + buf_service_name, > p_sr->service_data8[0], p_sr->service_data8[1], > p_sr->service_data8[2], p_sr->service_data8[3], > p_sr->service_data8[4], p_sr->service_data8[5], > @@ -507,7 +492,7 @@ static void dump_inform_info_record(void *data) > ib_inform_info_get_qpn_resp_time(p_iir->inform_info.g_or_v. > generic.qpn_resp_time_val, &qpn, > &resp_time_val); > - if (p_iir->inform_info.is_generic) > + if (p_iir->inform_info.is_generic) { > printf("InformInfoRecord dump:\n" > "\t\tRID\n" > "\t\tSubscriberGID...........%s\n" > @@ -519,10 +504,7 @@ static void dump_inform_info_record(void *data) > "\t\tis_generic..............0x%X\n" > "\t\tsubscribe...............0x%X\n" > "\t\ttrap_type...............0x%X\n" > - "\t\ttrap_num................%u\n" > - "\t\tqpn.....................0x%06X\n" > - "\t\tresp_time_val...........0x%X\n" > - "\t\tnode_type...............0x%06X\n", > + "\t\ttrap_num................%u\n", > inet_ntop(AF_INET6, p_iir->subscriber_gid.raw, gid_str, > sizeof gid_str), > cl_ntoh16(p_iir->subscriber_enum), > @@ -533,11 +515,20 @@ static void dump_inform_info_record(void *data) > p_iir->inform_info.is_generic, > p_iir->inform_info.subscribe, > cl_ntoh16(p_iir->inform_info.trap_type), > - cl_ntoh16(p_iir->inform_info.g_or_v.generic.trap_num), > - cl_ntoh32(qpn), resp_time_val, > + cl_ntoh16(p_iir->inform_info.g_or_v.generic.trap_num)); > + if (show_keys) { > + printf("\t\tqpn.....................0x%06X\n", > + cl_ntoh32(qpn)); > + } else { > + printf("\t\tqpn....................." > + NOT_DISPLAYED_STR "\n"); > + } > + printf("\t\tresp_time_val...........0x%X\n" > + "\t\tnode_type...............0x%06X\n", > + resp_time_val, > cl_ntoh32(ib_inform_info_get_prod_type > (&p_iir->inform_info))); > - else > + } else { > printf("InformInfoRecord dump:\n" > "\t\tRID\n" > "\t\tSubscriberGID...........%s\n" > @@ -549,10 +540,7 @@ static void dump_inform_info_record(void *data) > "\t\tis_generic..............0x%X\n" > "\t\tsubscribe...............0x%X\n" > "\t\ttrap_type...............0x%X\n" > - "\t\tdev_id..................0x%X\n" > - "\t\tqpn.....................0x%06X\n" > - "\t\tresp_time_val...........0x%X\n" > - "\t\tvendor_id...............0x%06X\n", > + "\t\tdev_id..................0x%X\n", > inet_ntop(AF_INET6, p_iir->subscriber_gid.raw, gid_str, > sizeof gid_str), > cl_ntoh16(p_iir->subscriber_enum), > @@ -563,10 +551,20 @@ static void dump_inform_info_record(void *data) > p_iir->inform_info.is_generic, > p_iir->inform_info.subscribe, > cl_ntoh16(p_iir->inform_info.trap_type), > - cl_ntoh16(p_iir->inform_info.g_or_v.vend.dev_id), > - cl_ntoh32(qpn), resp_time_val, > + cl_ntoh16(p_iir->inform_info.g_or_v.vend.dev_id)); > + if (show_keys) { > + printf("\t\tqpn.....................0x%06X\n", > + cl_ntoh32(qpn)); > + } else { > + printf("\t\tqpn....................." > + NOT_DISPLAYED_STR "\n"); > + } > + printf("\t\tresp_time_val...........0x%X\n" > + "\t\tvendor_id...............0x%06X\n", > + resp_time_val, > cl_ntoh32(ib_inform_info_get_prod_type > (&p_iir->inform_info))); > + } > } > > static void dump_one_link_record(void *data) > diff --git a/src/sminfo.c b/src/sminfo.c > index f1abc6a..1c12204 100644 > --- a/src/sminfo.c > +++ b/src/sminfo.c > @@ -109,7 +109,7 @@ int main(int argc, char **argv) > }; > char usage_args[] = "<sm_lid|sm_dr_path> [modifier]"; > > - ibdiag_process_opts(argc, argv, NULL, "s", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "sK", opts, process_opt, > usage_args, NULL); > > argc -= optind; > diff --git a/src/smpdump.c b/src/smpdump.c > index 1e79c52..4d67be7 100644 > --- a/src/smpdump.c > +++ b/src/smpdump.c > @@ -231,7 +231,7 @@ int main(int argc, char *argv[]) > > ibd_timeout = 1000; > > - ibdiag_process_opts(argc, argv, NULL, "Gs", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "GKs", opts, process_opt, > usage_args, usage_examples); > > argc -= optind; > diff --git a/src/smpquery.c b/src/smpquery.c > index 533b2c3..2909dc5 100644 > --- a/src/smpquery.c > +++ b/src/smpquery.c > @@ -133,7 +133,6 @@ static char *node_info(ib_portid_t * dest, char **argv, > int argc) > > static char *port_info(ib_portid_t * dest, char **argv, int argc) > { > - char buf[2300]; > char data[IB_SMP_DATA_SIZE] = { 0 }; > int portnum = 0, orig_portnum; > > @@ -146,9 +145,8 @@ static char *port_info(ib_portid_t * dest, char **argv, > int argc) > if (!smp_query_via(data, dest, IB_ATTR_PORT_INFO, portnum, 0, srcport)) > return "port info query failed"; > > - mad_dump_portinfo(buf, sizeof buf, data, sizeof data); > - > - printf("# Port info: %s port %d\n%s", portid2str(dest), orig_portnum, > buf); > + printf("# Port info: %s port %d\n", portid2str(dest), orig_portnum); > + dump_portinfo(data, sizeof data, 0); > return 0; > } > > diff --git a/src/vendstat.c b/src/vendstat.c > index 78f6d7d..dd89da7 100644 > --- a/src/vendstat.c > +++ b/src/vendstat.c > @@ -332,7 +332,7 @@ int main(int argc, char **argv) > NULL > }; > > - ibdiag_process_opts(argc, argv, NULL, "D", opts, process_opt, > + ibdiag_process_opts(argc, argv, NULL, "DK", opts, process_opt, > usage_args, usage_examples); > > argc -= optind; > -- > 1.7.9.2 > -- Ira Weiny Member of Technical Staff Lawrence Livermore National Lab 925-423-8008 [email protected] -- 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
