Hi Hal,

On 07:06 Mon 27 Apr     , Hal Rosenstock wrote:
> 
> Signed-off-by: Hal Rosenstock <[email protected]>

There are different things mixed in this patch (like self NodeInfo
resolution and redirection status printouts)? Is it just typo?

Sasha

> ---
> diff --git a/libibmad/include/infiniband/mad.h 
> b/libibmad/include/infiniband/mad.h
> index 0e47ccf..c74cb1d 100644
> --- a/libibmad/include/infiniband/mad.h
> +++ b/libibmad/include/infiniband/mad.h
> @@ -500,6 +500,7 @@ enum MAD_FIELDS {
>       IB_SA_PR_DLID_F,
>       IB_SA_PR_SLID_F,
>       IB_SA_PR_NPATH_F,
> +     IB_SA_PR_SL_F,
>  
>       /*
>        * MC Member rec
> diff --git a/libibmad/src/fields.c b/libibmad/src/fields.c
> index c24bc12..81693a2 100644
> --- a/libibmad/src/fields.c
> +++ b/libibmad/src/fields.c
> @@ -305,6 +305,7 @@ static const ib_field_t ib_mad_f[] = {
>       {BITSOFFS(320, 16), "PathRecDLid", mad_dump_uint},
>       {BITSOFFS(336, 16), "PathRecSLid", mad_dump_uint},
>       {BITSOFFS(393, 7), "PathRecNumPath", mad_dump_uint},
> +     {BITSOFFS(428, 4), "PathRecSL", mad_dump_uint},
>  
>       /*
>        * MC Member rec
> diff --git a/libibmad/src/resolve.c b/libibmad/src/resolve.c
> index 691bdc3..f17da11 100644
> --- a/libibmad/src/resolve.c
> +++ b/libibmad/src/resolve.c
> @@ -59,6 +59,7 @@ int ib_resolve_smlid_via(ib_portid_t * sm_id, int timeout,
>               return -1;
>  
>       mad_decode_field(portinfo, IB_PORT_SMLID_F, &lid);
> +     mad_decode_field(portinfo, IB_PORT_SMSL_F, &sm_id->sl);
>  
>       return ib_portid_set(sm_id, lid, 0, 0);
>  }
> @@ -74,12 +75,23 @@ int ib_resolve_guid_via(ib_portid_t * portid, uint64_t * 
> guid,
>  {
>       ib_portid_t sm_portid;
>       char buf[IB_SA_DATA_SIZE] = { 0 };
> +     ib_portid_t self = { 0 };
> +     uint64_t selfguid;
> +     ibmad_gid_t selfgid;
> +     uint8_t nodeinfo[64];
>  
>       if (!sm_id) {
>               sm_id = &sm_portid;
>               if (ib_resolve_smlid_via(sm_id, timeout, srcport) < 0)
>                       return -1;
>       }
> +
> +     if (!smp_query_via(nodeinfo, &self, IB_ATTR_NODE_INFO, 0, 0, srcport))
> +             return -1;
> +     mad_decode_field(nodeinfo, IB_NODE_PORT_GUID_F, &selfguid);
> +     mad_set_field64(selfgid, 0, IB_GID_PREFIX_F, IB_DEFAULT_SUBN_PREFIX);
> +     mad_set_field64(selfgid, 0, IB_GID_GUID_F, selfguid);
> +
>       if (*(uint64_t *) & portid->gid == 0)
>               mad_set_field64(portid->gid, 0, IB_GID_PREFIX_F,
>                               IB_DEFAULT_SUBN_PREFIX);
> @@ -87,10 +99,11 @@ int ib_resolve_guid_via(ib_portid_t * portid, uint64_t * 
> guid,
>               mad_set_field64(portid->gid, 0, IB_GID_GUID_F, *guid);
>  
>       if ((portid->lid =
> -          ib_path_query_via(srcport, portid->gid, portid->gid, sm_id,
> +          ib_path_query_via(srcport, selfgid, portid->gid, sm_id,
>                              buf)) < 0)
>               return -1;
>  
> +     mad_decode_field(buf, IB_SA_PR_SL_F, &portid->sl);
>       return 0;
>  }
>  
> @@ -167,6 +180,7 @@ int ib_resolve_self_via(ib_portid_t * portid, int 
> *portnum, ibmad_gid_t * gid,
>               return -1;
>  
>       mad_decode_field(portinfo, IB_PORT_LID_F, &portid->lid);
> +     mad_decode_field(portinfo, IB_PORT_SMSL_F, &portid->sl);
>       mad_decode_field(portinfo, IB_PORT_GID_PREFIX_F, &prefix);
>       mad_decode_field(nodeinfo, IB_NODE_PORT_GUID_F, &guid);
>  
> diff --git a/libibmad/src/rpc.c b/libibmad/src/rpc.c
> index 07b623d..21fcc9a 100644
> --- a/libibmad/src/rpc.c
> +++ b/libibmad/src/rpc.c
> @@ -187,7 +187,7 @@ void *mad_rpc(const struct ibmad_port *port, ib_rpc_t * 
> rpc,
>             ib_portid_t * dport, void *payload, void *rcvdata)
>  {
>       int status, len;
> -     uint8_t sndbuf[1024], rcvbuf[1024], *mad;
> +     uint8_t sndbuf[1024], rcvbuf[1024], *mad, mgmtclass;
>       int timeout, retries;
>  
>       len = 0;
> @@ -209,7 +209,18 @@ void *mad_rpc(const struct ibmad_port *port, ib_rpc_t * 
> rpc,
>  
>       mad = umad_get_mad(rcvbuf);
>  
> -     if ((status = mad_get_field(mad, 0, IB_DRSMP_STATUS_F)) != 0) {
> +     status = mad_get_field(mad, 0, IB_MAD_STATUS_F);
> +     mgmtclass = mad_get_field(mad, 0, IB_MAD_MGMTCLASS_F);
> +     if (mgmtclass == IB_SMI_DIRECT_CLASS)
> +             status &= 0x7fff;
> +     else if (mgmtclass != IB_SMI_CLASS) {
> +             if (status & 2) {
> +                     ERRS("MAD redirection not supported; dport (%s)",
> +                          portid2str(dport));
> +                     return 0;
> +             }
> +     }
> +     if (status) {
>               ERRS("MAD completed with error status 0x%x; dport (%s)",
>                    status, portid2str(dport));
>               return 0;
> @@ -254,8 +265,12 @@ void *mad_rpc_rmpp(const struct ibmad_port *port, 
> ib_rpc_t * rpc,
>       mad = umad_get_mad(rcvbuf);
>  
>       if ((status = mad_get_field(mad, 0, IB_MAD_STATUS_F)) != 0) {
> -             ERRS("MAD completed with error status 0x%x; dport (%s)",
> -                  status, portid2str(dport));
> +             if (status & 2)
> +                     ERRS("MAD redirection not supported; dport (%s)",
> +                          portid2str(dport));
> +             else
> +                     ERRS("MAD completed with error status 0x%x; dport (%s)",
> +                          status, portid2str(dport));
>               return 0;
>       }
>  
> 
_______________________________________________
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

Reply via email to