Add SIM_PORT environment variable to allow for end port selection

Signed-off-by: Hal Rosenstock <[email protected]>
---
 ibsim/ibsim.c         |    6 +-
 include/ibsim.h       |    2 +
 umad2sim/sim_client.c |   49 +++++++++-
 umad2sim/sim_client.h |    4 +-
 umad2sim/umad2sim.c   |  254 ++++++++++++++++++++++++++-----------------------
 5 files changed, 189 insertions(+), 126 deletions(-)

diff --git a/ibsim/ibsim.c b/ibsim/ibsim.c
index f48e1f0..6a35fdc 100644
--- a/ibsim/ibsim.c
+++ b/ibsim/ibsim.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * This file is part of ibsim.
  *
@@ -187,7 +188,8 @@ static int sm_exists(Node * node)
        return 0;
 }
 
-static int sim_ctl_new_client(Client * cl, struct sim_ctl * ctl, union name_t 
*from)
+static int sim_ctl_new_client(Client * cl, struct sim_ctl * ctl,
+                             union name_t *from)
 {
        union name_t name;
        size_t size;
@@ -219,7 +221,7 @@ static int sim_ctl_new_client(Client * cl, struct sim_ctl * 
ctl, union name_t *f
                        ctl->type = SIM_CTL_ERROR;
                        return -1;
                }
-               cl->port = node_get_port(node, 0);
+               cl->port = node_get_port(node, scl->portnum);
                VERB("Attaching client %d at node \"%s\" port 0x%" PRIx64,
                     i, node->nodeid, cl->port->portguid);
        } else {
diff --git a/include/ibsim.h b/include/ibsim.h
index 15fc37c..66ba6f9 100644
--- a/include/ibsim.h
+++ b/include/ibsim.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * This file is part of ibsim.
  *
@@ -100,6 +101,7 @@ struct sim_client_info {
        uint32_t qp;
        uint32_t issm;          /* accept request for qp 0 & 1 */
        char nodeid[32];
+       uint32_t portnum;
 };
 
 union name_t {
diff --git a/umad2sim/sim_client.c b/umad2sim/sim_client.c
index 06bb7a8..1c35109 100644
--- a/umad2sim/sim_client.c
+++ b/umad2sim/sim_client.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * This file is part of ibsim.
  *
@@ -182,6 +183,7 @@ static int sim_connect(struct sim_client *sc, int id, int 
qp, char *nodeid)
        info.id = id;
        info.issm = 0;
        info.qp = qp;
+       info.portnum = sc->portnum;
 
        if (nodeid)
                strncpy(info.nodeid, nodeid, sizeof(info.nodeid) - 1);
@@ -202,7 +204,7 @@ static int sim_disconnect(struct sim_client *sc)
        return sim_ctl(sc, SIM_CTL_DISCONNECT, 0, 0);
 }
 
-static int sim_init(struct sim_client *sc, char *nodeid)
+static int sim_init(struct sim_client *sc, char *nodeid, int portnum)
 {
        union name_t name;
        socklen_t size;
@@ -238,6 +240,7 @@ static int sim_init(struct sim_client *sc, char *nodeid)
        DEBUG("init %d: opened ctl fd %d as \'%s\'",
              pid, ctlfd, get_name(&name));
 
+       sc->portnum = portnum;
        port = connect_port ? atoi(connect_port) : IBSIM_DEFAULT_SERVER_PORT;
        size = make_name(&name, connect_host, port, "%s:ctl", socket_basename);
 
@@ -286,9 +289,17 @@ int sim_client_set_sm(struct sim_client *sc, unsigned issm)
 int sim_client_init(struct sim_client *sc)
 {
        char *nodeid;
+       char *portno;
+       int i, j = 0, portnum = 0, startport = 1, endport;
+       uint8_t numports, nodetype;
+       uint8_t *portinfo;
 
        nodeid = getenv("SIM_HOST");
-       if (sim_init(sc, nodeid) < 0)
+       portno = getenv("SIM_PORT");
+       if (portno)
+               portnum = atoi(portno);
+
+       if (sim_init(sc, nodeid, portnum) < 0)
                return -1;
        if (sim_ctl(sc, SIM_CTL_GET_VENDOR, &sc->vendor,
                    sizeof(sc->vendor)) < 0)
@@ -296,11 +307,37 @@ int sim_client_init(struct sim_client *sc)
        if (sim_ctl(sc, SIM_CTL_GET_NODEINFO, sc->nodeinfo,
                    sizeof(sc->nodeinfo)) < 0)
                goto _exit;
+       numports = mad_get_field(sc->nodeinfo, 0, IB_NODE_NPORTS_F);
+       nodetype = mad_get_field(sc->nodeinfo, 0, IB_NODE_TYPE_F);
+       if (nodetype == 2) { // switch
+               startport = 0;
+               endport = 0;
+       } else {
+               if (portnum == 0) {
+                       IBWARN("portnum 0 is not valid end port on non switch 
node");
+                       goto _exit;
+               }
+               endport = numports;
+       }
+       if (portnum > endport) {
+               IBWARN("portnum %d is not a valid end port number (%d)",
+                      portnum, endport);
+               goto _exit;
+       }
 
-       sc->portinfo[0] = 0;    // portno requested
-       if (sim_ctl(sc, SIM_CTL_GET_PORTINFO, sc->portinfo,
-                   sizeof(sc->portinfo)) < 0)
+       sc->portinfo = malloc(64 * (nodetype != 2 ? numports + 1 : 1)); // 
portinfo size x number of ports starting at 0
+       if (!sc->portinfo)
                goto _exit;
+
+       // loop through end ports
+       for (i = startport; i <= endport ; i++, j++) {
+               portinfo = sc->portinfo + 64 * j;
+               *portinfo = i + 1; // portno requested
+               if (sim_ctl(sc, SIM_CTL_GET_PORTINFO, portinfo, 64) < 0)
+                       goto _exit;
+       }
+
+       // although pkeys also per port, current config same on all end ports
        if (sim_ctl(sc, SIM_CTL_GET_PKEYS, sc->pkeys, sizeof(sc->pkeys)) < 0)
                goto _exit;
        if (getenv("SIM_SET_ISSM"))
@@ -315,5 +352,7 @@ int sim_client_init(struct sim_client *sc)
 void sim_client_exit(struct sim_client *sc)
 {
        sim_disconnect(sc);
+       if (sc->portinfo)
+               free(sc->portinfo);
        sc->fd_ctl = sc->fd_pktin = sc->fd_pktout = -1;
 }
diff --git a/umad2sim/sim_client.h b/umad2sim/sim_client.h
index 80ed442..0faca80 100644
--- a/umad2sim/sim_client.h
+++ b/umad2sim/sim_client.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2006,2007 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * This file is part of ibsim.
  *
@@ -41,8 +42,9 @@ struct sim_client {
        int clientid;
        int fd_pktin, fd_pktout, fd_ctl;
        struct sim_vendor vendor;
+       int portnum;
        uint8_t nodeinfo[64];
-       uint8_t portinfo[64];
+       uint8_t *portinfo;
        uint16_t pkeys[SIM_CTL_MAX_DATA/sizeof(uint16_t)];
 };
 
diff --git a/umad2sim/umad2sim.c b/umad2sim/umad2sim.c
index 8d83a24..6e3c269 100644
--- a/umad2sim/umad2sim.c
+++ b/umad2sim/umad2sim.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * This file is part of ibsim.
  *
@@ -179,7 +180,10 @@ static int dev_sysfs_create(struct umad2sim_dev *dev)
        struct sim_client *sc = &dev->sim_client;
        char *str;
        uint8_t *portinfo;
-       int i;
+       char *ports_path_end;
+       int i, j;
+       int startport = 1, endport;
+       uint8_t numports, nodetype;
 
        /* /sys/class/infiniband_mad/abi_version */
        snprintf(path, sizeof(path), "%s", sysfs_infiniband_mad_dir);
@@ -232,123 +236,138 @@ static int dev_sysfs_create(struct umad2sim_dev *dev)
        strncat(path, "/ports", sizeof(path) - 1);
        make_path(path);
 
-       portinfo = sc->portinfo;
-
-       /* /sys/class/infiniband/mthca0/ports/1/ */
-       val = mad_get_field(portinfo, 0, IB_PORT_LOCAL_PORT_F);
-       snprintf(path + strlen(path), sizeof(path) - strlen(path), "/%u", val);
-       make_path(path);
-
-       /* /sys/class/infiniband/mthca0/ports/1/lid_mask_count */
-       val = mad_get_field(portinfo, 0, IB_PORT_LMC_F);
-       file_printf(path, SYS_PORT_LMC, "%d", val);
-
-       /* /sys/class/infiniband/mthca0/ports/1/sm_lid */
-       val = mad_get_field(portinfo, 0, IB_PORT_SMLID_F);
-       file_printf(path, SYS_PORT_SMLID, "0x%x", val);
-
-       /* /sys/class/infiniband/mthca0/ports/1/sm_sl */
-       val = mad_get_field(portinfo, 0, IB_PORT_SMSL_F);
-       file_printf(path, SYS_PORT_SMSL, "%d", val);
-
-       /* /sys/class/infiniband/mthca0/ports/1/lid */
-       val = mad_get_field(portinfo, 0, IB_PORT_LID_F);
-       file_printf(path, SYS_PORT_LID, "0x%x", val);
-
-       /* /sys/class/infiniband/mthca0/ports/1/state */
-       val = mad_get_field(portinfo, 0, IB_PORT_STATE_F);
-       if (val == 0)
-               str = "NOP";
-       else if (val == 1)
-               str = "DOWN";
-       else if (val == 2)
-               str = "INIT";
-       else if (val == 3)
-               str = "ARMED";
-       else if (val == 4)
-               str = "ACTIVE";
-       else if (val == 5)
-               str = "ACTIVE_DEFER";
-       else
-               str = "<unknown>";
-       file_printf(path, SYS_PORT_STATE, "%d: %s\n", val, str);
-
-       /* /sys/class/infiniband/mthca0/ports/1/phys_state */
-       val = mad_get_field(portinfo, 0, IB_PORT_PHYS_STATE_F);
-       if (val == 1)
-               str = "Sleep";
-       else if (val == 2)
-               str = "Polling";
-       else if (val == 3)
-               str = "Disabled";
-       else if (val == 4)
-               str = "PortConfigurationTraining";
-       else if (val == 5)
-               str = "LinkUp";
-       else if (val == 6)
-               str = "LinkErrorRecovery";
-       else if (val == 7)
-               str = "Phy Test";
-       else
-               str = "<unknown>";
-       file_printf(path, SYS_PORT_PHY_STATE, "%d: %s\n", val, str);
-
-       /* /sys/class/infiniband/mthca0/ports/1/rate */
-       val = mad_get_field(portinfo, 0, IB_PORT_LINK_WIDTH_ACTIVE_F);
-       speed = mad_get_field(portinfo, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
-       if (val == 1)
-               val = 1;
-       else if (val == 2)
-               val = 4;
-       else if (val == 4)
-               val = 8;
-       else if (val == 8)
-               val = 12;
-       else
-               val = 0;
-       if (speed == 2)
-               str = " DDR";
-       else if (speed == 4)
-               str = " QDR";
-       else
-               str = "";
-       file_printf(path, SYS_PORT_RATE, "%d%s Gb/sec (%dX%s)\n",
-                   (val * speed * 25) / 10,
-                   (val * speed * 25) % 10 ? ".5" : "", val, str);
-
-       /* /sys/class/infiniband/mthca0/ports/1/cap_mask */
-       val = mad_get_field(portinfo, 0, IB_PORT_CAPMASK_F);
-       file_printf(path, SYS_PORT_CAPMASK, "0x%08x", val);
-
-       /* /sys/class/infiniband/mthca0/ports/1/gids/0 */
-       str = path + strlen(path);
-       strncat(path, "/gids", sizeof(path) - 1);
-       make_path(path);
-       *str = '\0';
-       gid = mad_get_field64(portinfo, 0, IB_PORT_GID_PREFIX_F);
-       guid = mad_get_field64(sc->nodeinfo, 0, IB_NODE_GUID_F) +
-           mad_get_field(portinfo, 0, IB_PORT_LOCAL_PORT_F);
-       file_printf(path, SYS_PORT_GID,
-                   "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
-                   (uint16_t) ((gid >> 48) & 0xffff),
-                   (uint16_t) ((gid >> 32) & 0xffff),
-                   (uint16_t) ((gid >> 16) & 0xffff),
-                   (uint16_t) ((gid >> 0) & 0xffff),
-                   (uint16_t) ((guid >> 48) & 0xffff),
-                   (uint16_t) ((guid >> 32) & 0xffff),
-                   (uint16_t) ((guid >> 16) & 0xffff),
-                   (uint16_t) ((guid >> 0) & 0xffff));
+       numports = mad_get_field(sc->nodeinfo, 0, IB_NODE_NPORTS_F);
+       nodetype = mad_get_field(sc->nodeinfo, 0, IB_NODE_TYPE_F);
+        if (nodetype == 2) { // switch
+               startport = 0;
+               endport = 0;
+       } else
+               endport = numports;
+
+       ports_path_end = path + strlen(path);
+
+       // loop through end ports
+       for (j = startport; j <= endport; j++) {
+
+               portinfo = sc->portinfo + 64 * j;
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/ */
+               val = mad_get_field(portinfo, 0, IB_PORT_LOCAL_PORT_F);
+               snprintf(path + strlen(path), sizeof(path) - strlen(path), 
"/%u", val);
+               make_path(path);
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/lid_mask_count */
+               val = mad_get_field(portinfo, 0, IB_PORT_LMC_F);
+               file_printf(path, SYS_PORT_LMC, "%d", val);
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/sm_lid */
+               val = mad_get_field(portinfo, 0, IB_PORT_SMLID_F);
+               file_printf(path, SYS_PORT_SMLID, "0x%x", val);
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/sm_sl */
+               val = mad_get_field(portinfo, 0, IB_PORT_SMSL_F);
+               file_printf(path, SYS_PORT_SMSL, "%d", val);
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/lid */
+               val = mad_get_field(portinfo, 0, IB_PORT_LID_F);
+               file_printf(path, SYS_PORT_LID, "0x%x", val);
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/state */
+               val = mad_get_field(portinfo, 0, IB_PORT_STATE_F);
+               if (val == 0)
+                       str = "NOP";
+               else if (val == 1)
+                       str = "DOWN";
+               else if (val == 2)
+                       str = "INIT";
+               else if (val == 3)
+                       str = "ARMED";
+               else if (val == 4)
+                       str = "ACTIVE";
+               else if (val == 5)
+                       str = "ACTIVE_DEFER";
+               else
+                       str = "<unknown>";
+               file_printf(path, SYS_PORT_STATE, "%d: %s\n", val, str);
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/phys_state */
+               val = mad_get_field(portinfo, 0, IB_PORT_PHYS_STATE_F);
+               if (val == 1)
+                       str = "Sleep";
+               else if (val == 2)
+                       str = "Polling";
+               else if (val == 3)
+                       str = "Disabled";
+               else if (val == 4)
+                       str = "PortConfigurationTraining";
+               else if (val == 5)
+                       str = "LinkUp";
+               else if (val == 6)
+                       str = "LinkErrorRecovery";
+               else if (val == 7)
+                       str = "Phy Test";
+               else
+                       str = "<unknown>";
+               file_printf(path, SYS_PORT_PHY_STATE, "%d: %s\n", val, str);
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/rate */
+               val = mad_get_field(portinfo, 0, IB_PORT_LINK_WIDTH_ACTIVE_F);
+               speed = mad_get_field(portinfo, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
+               if (val == 1)
+                       val = 1;
+               else if (val == 2)
+                       val = 4;
+               else if (val == 4)
+                       val = 8;
+               else if (val == 8)
+                       val = 12;
+               else
+                       val = 0;
+               if (speed == 2)
+                       str = " DDR";
+               else if (speed == 4)
+                       str = " QDR";
+               else
+                       str = "";
+               file_printf(path, SYS_PORT_RATE, "%d%s Gb/sec (%dX%s)\n",
+                           (val * speed * 25) / 10,
+                           (val * speed * 25) % 10 ? ".5" : "", val, str);
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/cap_mask */
+               val = mad_get_field(portinfo, 0, IB_PORT_CAPMASK_F);
+               file_printf(path, SYS_PORT_CAPMASK, "0x%08x", val);
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/gids/0 */
+               str = path + strlen(path);
+               strncat(path, "/gids", sizeof(path) - 1);
+               make_path(path);
+               *str = '\0';
+               gid = mad_get_field64(portinfo, 0, IB_PORT_GID_PREFIX_F);
+               guid = mad_get_field64(sc->nodeinfo, 0, IB_NODE_GUID_F) + j;
+               file_printf(path, SYS_PORT_GID,
+                           "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
+                           (uint16_t) ((gid >> 48) & 0xffff),
+                           (uint16_t) ((gid >> 32) & 0xffff),
+                           (uint16_t) ((gid >> 16) & 0xffff),
+                           (uint16_t) ((gid >> 0) & 0xffff),
+                           (uint16_t) ((guid >> 48) & 0xffff),
+                           (uint16_t) ((guid >> 32) & 0xffff),
+                           (uint16_t) ((guid >> 16) & 0xffff),
+                           (uint16_t) ((guid >> 0) & 0xffff));
+
+               /* /sys/class/infiniband/mthca0/ports/<n>/pkeys/0 */
+               str = path + strlen(path);
+               strncat(path, "/pkeys", sizeof(path) - 1);
+               make_path(path);
+               for (i = 0; i < sizeof(sc->pkeys)/sizeof(sc->pkeys[0]); i++) {
+                       char name[8];
+                       snprintf(name, sizeof(name), "%u", i);
+                       file_printf(path, name, "0x%04x\n", 
ntohs(sc->pkeys[i]));
+               }
+               *str = '\0';
 
-       /* /sys/class/infiniband/mthca0/ports/1/pkeys/0 */
-       str = path + strlen(path);
-       strncat(path, "/pkeys", sizeof(path) - 1);
-       make_path(path);
-       for (i = 0; i < sizeof(sc->pkeys)/sizeof(sc->pkeys[0]); i++) {
-               char name[8];
-               snprintf(name, sizeof(name), "%u", i);
-               file_printf(path, name, "0x%04x\n", ntohs(sc->pkeys[i]));
+               *ports_path_end = '\0';
        }
-       *str = '\0';
 
        /* /sys/class/infiniband_mad/umad0/ */
        snprintf(path, sizeof(path), "%s/umad%u", sysfs_infiniband_mad_dir,
@@ -564,8 +583,7 @@ static struct umad2sim_dev *umad2sim_dev_create(unsigned 
num, const char *name)
        if (sim_client_init(&dev->sim_client) < 0)
                goto _error;
 
-       dev->port = mad_get_field(&dev->sim_client.portinfo, 0,
-                                 IB_PORT_LOCAL_PORT_F);
+       dev->port = dev->sim_client.portnum;
        for (i = 0; i < arrsize(dev->agents); i++)
                dev->agents[i].id = (uint32_t)(-1);
        for (i = 0; i < arrsize(dev->agent_idx); i++)
-- 
1.5.6.4

_______________________________________________
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