ibsim: Alias GUID support added.
PATCH 1/1 ibsim: Alias GUID support added.
default guids_tbl size for all ports is 128 guids
--- ibsim/sim.h | 6 ++++++ ibsim/sim_mad.c | 35 ++++++++++++++++++++++++++--------- ibsim/sim_net.c | 18 ++++++++++++++++++ 3 files changed, 50 insertions(+), 9 deletions(-)
ibsim/sim.h +6 -0
@@ -81,6 +81,9 @@#define MAXHOPS 16 +#define GUIDS_PER_BLOCK 8 +#define GUIDS_DEFAULT 128 +enum NODE_TYPES {NO_NODE ,HCA_NODE ,
@@ -221,6 +224,9 @@ struct Port {uint8_t extportinfo[64 ];uint8_t op_vls; +uint8_t guid_cap; +int64_t * guids; +char remotenodeid[NODEIDLEN ];char remotealias[ALIASLEN +1 ];char alias[ALIASLEN +1 ];
ibsim/sim_mad.c +26 -9
@@ -441,17 +441,34 @@ static int do_guidinfo(Port * port, unsigned op, uint32_t mod, uint8_t * data) {Node *node = port->node;int status =0 ; -uint64_t portguid = node->nodeguid + port->portnum; +int offset; +int size; -if (op !=IB_MAD_METHOD_GET )// only get currently supported (non compliant) - status =ERR_METHOD_UNSUPPORTED ; +if (op !=IB_MAD_METHOD_GET && op !=IB_MAD_METHOD_SET ) +return ERR_METHOD_UNSUPPORTED ; -memset (data,0 ,IB_SMP_DATA_SIZE ); -if (mod ==0 ) { -if (node->type ==SWITCH_NODE ) -mad_encode_field (data,IB_GUID_GUID0_F , &node->nodeguid); -else -mad_encode_field (data,IB_GUID_GUID0_F , &portguid); + offset = mod *GUIDS_PER_BLOCK ; + +if (node->type ==SWITCH_NODE )// if switch then take use port 0 + port =node_get_port (node,0 ); + +if (offset >= port->guid_cap)// check that block is valid +return ERR_BAD_PARAM ; + + size = port->guid_cap - offset; +if (size >GUIDS_PER_BLOCK ) + size =GUIDS_PER_BLOCK ; + +if (op ==IB_MAD_METHOD_GET ) { +memset (data,0 ,IB_SMP_DATA_SIZE ); +memcpy (data, &port->guids[offset], size *sizeof (uint64_t )); + } +if (op ==IB_MAD_METHOD_SET ) { +if (offset ==0 ) {// block 0, index o is read only + offset++; + size--; + } +memcpy (&port->guids[offset], data, size *sizeof (uint64_t )); }return status;
ibsim/sim_net.c +18 -0
@@ -621,6 +621,21 @@ static void init_ports(Node * node, int type, int maxports) sizeof(port->vlarb_high));memcpy (port->vlarb_low, default_vlarb_low,sizeof (port->vlarb_low)); + + port->guid_cap =0 ; +if ((port->node->type ==SWITCH_NODE && !i) || + (port->node->type ==HCA_NODE ) || + (port->node->type ==ROUTER_NODE )) { + + port->guid_cap =GUIDS_DEFAULT ; + port->guids =calloc (port->guid_cap,sizeof (uint64_t )); + +if (!port->guids) +IBPANIC ("cannot alloc port's guids table\n" ); + +memset (port->guids,0 ,sizeof (port->guids)); + port->guids[0 ] = port->portguid; + } } }
@@ -1232,6 +1247,7 @@ void update_portinfo(Port * p)mad_set_field (pi,0 ,IB_PORT_LID_F , p->lid);mad_set_field (pi,0 ,IB_PORT_SMLID_F , p->smlid);mad_set_field (pi,0 ,IB_PORT_OPER_VLS_F , p->op_vls); +mad_set_field (pi,0 ,IB_PORT_GUID_CAP_F , p->guid_cap);mad_set_field (pi,0 ,IB_PORT_LINK_WIDTH_ENABLED_F , p->linkwidthena);mad_set_field (pi,0 ,IB_PORT_LINK_WIDTH_SUPPORTED_F , LINKWIDTH_1x_4x_12x);
@@ -1524,6 +1540,8 @@ void free_core(void)free (ports[i].pkey_tbl);if (ports[i].sl2vl)free (ports[i].sl2vl); +if (ports[i].guids) +free (ports[i].guids); }free (ports);for (i =0 ; i < maxnetswitches ; i++) {
Signature · 6 lines
1.7.4.1 -- 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