On Fri, 22 Feb 2013 20:00:59 +0000
"Hefty, Sean" <[email protected]> wrote:

> > > > +char * umad_class_str(uint8_t mgmt_class);
> > > > +char * umad_method_str(uint8_t mgmt_class, uint8_t method);
> > > > +char * umad_attribute_str(uint8_t mgmt_class, be16_t attr_id);
> > > > +char * umad_mad_status_str(be16_t status, char * buf, size_t len);
> > >
> > > Why is umad_mad_status_str() different?
> > 
> > Which difference are you speaking of, the lack of mgmt_class or the required
> > buffer?
> 
> I was referring to the buf/len input fields.  Why are those needed?  I didn't 
> follow this reasoning:
>  
> > The required buffer allows for printing multiple strings for various fields
> > which may be set.  This is done because status is not defined to be a strict
> > enum.
> 
> +char * umad_mad_status_str(be16_t status, char * buf, size_t len)
> +{
> +     size_t n = len;
> +     int rc = 0;
> +
> +     status = ntohs(status);
> +
> +     if (status & UMAD_STATUS_BUSY) {
> +             rc = snprintf(buf, n, "busy");
> +             if (rc < 0 || rc >= n)
> +                     goto done;
> +             n -= rc;
> +             buf += rc;
> +     }
> +
> +     if (status & UMAD_STATUS_REDIRECT) {
> +             rc = snprintf(buf, n, " redirection required");
> +             if (rc < 0 || rc >= n)
> +                     goto done;
> +             n -= rc;
> +             buf += rc;
> +     }
> +
> +     switch((status & 0x001C)) {
> +     case UMAD_STATUS_BAD_VERSION:
> +             rc = snprintf(buf, n, " bad version");
> +             break;
> +     case UMAD_STATUS_METHOD_NOT_SUPPORTED:
> +             rc = snprintf(buf, n, " method not supported");
> +             break;
> +     case UMAD_STATUS_ATTR_NOT_SUPPORTED:
> +             rc = snprintf(buf, n, " method/attribute combo not supported");
> +             break;
> +     case UMAD_STATUS_INVALID_ATTR_VALUE:
> +             rc = snprintf(buf, n, " invalid attribute/modifier value");
> +             break;
> +     }
> +
> +     if (rc < 0 || rc >= n)
> +             goto done;
> +     n -= rc;
> +     buf += rc;
> +
> +     if (n == len)
> +             snprintf(buf, n, "Success");
> +done:
> +     return (buf);
> +}
> 
> These return values seem mutually exclusive.  Surely we're not going to see a 
> MAD with status 'busy - redirection required - bad version - success'?

They are mutually exclusive now but because the spec defines separate fields it 
might not always be that way.  That is what I meant when I said "status is not 
defined to be a strict enum".

Ira

> --
> 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


-- 
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

Reply via email to