libibumad: match behavior of OFED libibumad wrt ca ports
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 6 Mar 2009 22:33:11 +0000 (22:33 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 6 Mar 2009 22:33:11 +0000 (22:33 +0000)
The OFED version of libibumad stores a list of ports associated with a umad_ca_t differently based on whether the CA is on a host or is part of a switch.  On a host, the port information is maintained in the port array starting at index 1, not 0.  In this case, umad_ca_t:port[0] is NULL.  Update the WinOF version of libibumad to behave the same.  This fixes an issue with ibstat reporting 1 too many ports.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2014 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

ulp/libibumad/src/umad.cpp

index 1471cfe..bf70c42 100644 (file)
@@ -99,12 +99,12 @@ int umad_get_ca_portguids(char *ca_name, uint64_t *portguids, int max)
        if (umad_get_ca(ca_name, &ca) < 0)\r
                return -1;\r
 \r
-       if (ca.numports + 1 > max) {\r
+       if (ca.numports > max) {\r
                umad_release_ca(&ca);\r
                return -ENOMEM;\r
        }\r
 \r
-       for (i = 0; i <= ca.numports; i++)\r
+       for (i = 1; i <= ca.numports; i++)\r
                portguids[ports++] = ca.ports[i]->port_guid;\r
 \r
        umad_release_ca(&ca);\r
@@ -208,12 +208,13 @@ int umad_get_ca(char *ca_name, umad_ca_t *ca)
 \r
        strcpy(ca->ca_name, ca_name);\r
        umad_convert_ca_attr(ca, &dev_attr);\r
+       memset(ca->ports, 0, sizeof(ca->ports));\r
 \r
-       for (i = 0; i < dev_attr.phys_port_cnt; i++, ports += port_size) {\r
+       for (i = 1; i <= dev_attr.phys_port_cnt; i++, ports += port_size) {\r
 \r
                ca->ports[i] = (umad_port_t *) ports;\r
                strcpy(ca->ports[i]->ca_name, ca_name);\r
-               ca->ports[i]->portnum = i + 1;\r
+               ca->ports[i]->portnum = i;\r
                ca->ports[i]->pkeys = (uint16_t *) (ports + sizeof(umad_port_t));\r
 \r
                ret = umad_query_port(context, ca->ports[i]);\r
@@ -266,16 +267,16 @@ int umad_get_port(char *ca_name, int portnum, umad_port_t *port)
                return ret;\r
        }\r
 \r
-       memcpy(port, ca.ports[portnum - 1], sizeof(umad_port_t));\r
+       memcpy(port, ca.ports[portnum], sizeof(umad_port_t));\r
 \r
-       port->pkeys = new uint16_t[ca.ports[portnum - 1]->pkeys_size];\r
+       port->pkeys = new uint16_t[ca.ports[portnum]->pkeys_size];\r
        if (port->pkeys == NULL) {\r
                ret = -ENOMEM;\r
                goto out;\r
        }\r
 \r
-       memcpy(port->pkeys, ca.ports[portnum - 1]->pkeys,\r
-                  sizeof(uint16_t) * ca.ports[portnum - 1]->pkeys_size);\r
+       memcpy(port->pkeys, ca.ports[portnum]->pkeys,\r
+                  sizeof(uint16_t) * ca.ports[portnum]->pkeys_size);\r
 out:\r
        umad_release_ca(&ca);\r
        return ret;\r
@@ -304,7 +305,7 @@ static uint8_t umad_find_port(char *ca_name, enum ibv_port_state state)
                return 0;\r
        }\r
 \r
-       for (i = 0; i < ca.numports; i++) {\r
+       for (i = 1; i <= ca.numports; i++) {\r
                if (ca.ports[i]->state == state) {\r
                        i = ca.ports[i]->portnum;\r
                        umad_release_ca(&ca);\r