From 0ba313dec9ae743237cc5c69ef8c5174de042273 Mon Sep 17 00:00:00 2001 From: shefty Date: Fri, 6 Mar 2009 22:33:11 +0000 Subject: [PATCH] libibumad: match behavior of OFED libibumad wrt ca ports 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 git-svn-id: svn://openib.tc.cornell.edu/gen1@2014 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/libibumad/src/umad.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/trunk/ulp/libibumad/src/umad.cpp b/trunk/ulp/libibumad/src/umad.cpp index 1471cfe3..bf70c420 100644 --- a/trunk/ulp/libibumad/src/umad.cpp +++ b/trunk/ulp/libibumad/src/umad.cpp @@ -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) return -1; - if (ca.numports + 1 > max) { + if (ca.numports > max) { umad_release_ca(&ca); return -ENOMEM; } - for (i = 0; i <= ca.numports; i++) + for (i = 1; i <= ca.numports; i++) portguids[ports++] = ca.ports[i]->port_guid; umad_release_ca(&ca); @@ -208,12 +208,13 @@ int umad_get_ca(char *ca_name, umad_ca_t *ca) strcpy(ca->ca_name, ca_name); umad_convert_ca_attr(ca, &dev_attr); + memset(ca->ports, 0, sizeof(ca->ports)); - for (i = 0; i < dev_attr.phys_port_cnt; i++, ports += port_size) { + for (i = 1; i <= dev_attr.phys_port_cnt; i++, ports += port_size) { ca->ports[i] = (umad_port_t *) ports; strcpy(ca->ports[i]->ca_name, ca_name); - ca->ports[i]->portnum = i + 1; + ca->ports[i]->portnum = i; ca->ports[i]->pkeys = (uint16_t *) (ports + sizeof(umad_port_t)); ret = umad_query_port(context, ca->ports[i]); @@ -266,16 +267,16 @@ int umad_get_port(char *ca_name, int portnum, umad_port_t *port) return ret; } - memcpy(port, ca.ports[portnum - 1], sizeof(umad_port_t)); + memcpy(port, ca.ports[portnum], sizeof(umad_port_t)); - port->pkeys = new uint16_t[ca.ports[portnum - 1]->pkeys_size]; + port->pkeys = new uint16_t[ca.ports[portnum]->pkeys_size]; if (port->pkeys == NULL) { ret = -ENOMEM; goto out; } - memcpy(port->pkeys, ca.ports[portnum - 1]->pkeys, - sizeof(uint16_t) * ca.ports[portnum - 1]->pkeys_size); + memcpy(port->pkeys, ca.ports[portnum]->pkeys, + sizeof(uint16_t) * ca.ports[portnum]->pkeys_size); out: umad_release_ca(&ca); return ret; @@ -304,7 +305,7 @@ static uint8_t umad_find_port(char *ca_name, enum ibv_port_state state) return 0; } - for (i = 0; i < ca.numports; i++) { + for (i = 1; i <= ca.numports; i++) { if (ca.ports[i]->state == state) { i = ca.ports[i]->portnum; umad_release_ca(&ca); -- 2.41.0