[ofa-general] [PATCH 1/3] libvendor: osm_vendor_get_all_port_attr() rework
Hal Rosenstock
hrosenstock at xsigo.com
Mon Jan 7 07:03:30 PST 2008
Sasha,
On Thu, 2007-11-15 at 11:12 +0200, Sasha Khapyorsky wrote:
> It fixes couple of issues with this function:
>
> - return only valid guids, don't return duplicated entries
What entries were duplicated ?
I think there may be a subtle "API" change in that the ib_port_attr_t
array filled in no longer has (or properly calculates the "best" port).
Not sure if it is this change or some other change which causes this.
-- Hal
> as well as valid number of ports
> - return valid sm_lid (as on ports)
> - potential local buffers overflow
> - minor leaks (not released ca)
>
> Finally it is much simplified now.
>
> Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
> ---
> opensm/libvendor/osm_vendor_ibumad.c | 100 ++++++++--------------------------
> 1 files changed, 24 insertions(+), 76 deletions(-)
>
> diff --git a/opensm/libvendor/osm_vendor_ibumad.c b/opensm/libvendor/osm_vendor_ibumad.c
> index 1d5f359..37007cd 100644
> --- a/opensm/libvendor/osm_vendor_ibumad.c
> +++ b/opensm/libvendor/osm_vendor_ibumad.c
> @@ -543,18 +543,10 @@ osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,
> IN ib_port_attr_t * const p_attr_array,
> IN uint32_t * const p_num_ports)
> {
> - ib_net64_t portguids[*p_num_ports];
> - ib_net64_t *p_guid = portguids, *e = portguids + *p_num_ports;
> umad_ca_t ca;
> - int lids[*p_num_ports];
> - int linkstates[*p_num_ports];
> - int portnums[*p_num_ports];
> - int *p_lid = lids;
> - int *p_linkstates = linkstates;
> - int *p_portnum = portnums;
> - umad_port_t def_port = { "" };
> + ib_port_attr_t *attr = p_attr_array;
> + unsigned done = 0;
> int r, i, j;
> - int sm_lid = 0;
>
> OSM_LOG_ENTER(p_vend->p_log, osm_vendor_get_all_port_attr);
>
> @@ -568,81 +560,37 @@ osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,
> goto Exit;
> }
>
> - for (i = 0; p_guid < e && i < p_vend->ca_count; i++) {
> + if (!p_attr_array) {
> + r = IB_INSUFFICIENT_MEMORY;
> + *p_num_ports = 0;
> + goto Exit;
> + }
> +
> + for (i = 0; i < p_vend->ca_count && !done; i++) {
> /*
> * For each CA, retrieve the port guids
> */
> - if ((r = umad_get_ca_portguids(p_vend->ca_names[i],
> - p_guid, e - p_guid)) < 0) {
> - osm_log(p_vend->p_log, OSM_LOG_ERROR,
> - "osm_vendor_get_all_port_attr: ERR 5419: "
> - "Unable to get CA %s port guids (%s)\n",
> - p_vend->ca_names[i], strerror(r));
> - goto Exit;
> - }
> -
> - p_guid += r;
> -
> - if ((r = umad_get_ca(p_vend->ca_names[i], &ca)) == 0) {
> + if (umad_get_ca(p_vend->ca_names[i], &ca) == 0) {
> for (j = 0; j <= ca.numports; j++) {
> - if (ca.ports[j]) {
> - *p_lid = ca.ports[j]->base_lid;
> - *p_linkstates = ca.ports[j]->state;
> - *p_portnum = ca.ports[j]->portnum;
> - free(ca.ports[j]);
> + if (!ca.ports[j])
> + continue;
> + attr->port_guid = ca.ports[j]->port_guid;
> + attr->lid = ca.ports[j]->base_lid;
> + attr->port_num = ca.ports[j]->portnum;
> + attr->sm_lid = ca.ports[j]->sm_lid;
> + attr->link_state = ca.ports[j]->state;
> + attr++;
> + if (attr - p_attr_array > *p_num_ports) {
> + done = 1;
> + break;
> }
> - p_lid++;
> - p_linkstates++;
> - p_portnum++;
> }
> + umad_release_ca(&ca);
> }
> }
>
> - *p_num_ports = p_guid - portguids;
> -
> - /*
> - * If no port 0 - we are on other than switch.
> - * Get a default 'best' port from the library.
> - */
> - if (*p_num_ports && !portguids[0]) {
> - umad_get_port(0, 0, &def_port);
> -
> - portguids[0] = def_port.port_guid;
> - lids[0] = def_port.base_lid;
> - linkstates[0] = def_port.state;
> - portnums[0] = def_port.portnum;
> - sm_lid = def_port.sm_lid;
> -
> - osm_log(p_vend->p_log, OSM_LOG_DEBUG,
> - "osm_vendor_get_all_port_attr: "
> - "assign CA %s port %d guid (0x%" PRIx64
> - ") as the default port\n", def_port.ca_name,
> - def_port.portnum, cl_hton64(def_port.port_guid));
> -
> - umad_release_port(&def_port);
> - }
> -
> - j = 0;
> - if (p_attr_array) {
> - /* set the port guid, lid, and sm lid in the port attr struct */
> - for (i = 0; i < *p_num_ports; i++) {
> - if (i > 0 && portguids[i] == 0)
> - continue;
> - p_attr_array[j].port_guid = portguids[i];
> - p_attr_array[j].lid = lids[i];
> - p_attr_array[j].port_num = portnums[i];
> - if (j == 0)
> - p_attr_array[j].sm_lid = sm_lid;
> - else
> - p_attr_array[j].sm_lid =
> - p_vend->umad_port.sm_lid;
> - p_attr_array[j].link_state = linkstates[i];
> - j++;
> - }
> - r = 0;
> - *p_num_ports = j;
> - } else
> - r = IB_INSUFFICIENT_MEMORY;
> + *p_num_ports = attr - p_attr_array;
> + r = 0;
>
> Exit:
> OSM_LOG_EXIT(p_vend->p_log);
More information about the general
mailing list