[ofw] [osmtest] Adding support for default guid selection when running osmtest
Alex Naslednikov
xalex at mellanox.co.il
Tue Feb 10 09:59:03 PST 2009
Index: D:/Windows/MLNX_WINOF/ulp/opensm/user/osmtest/main.c
===================================================================
--- D:/Windows/MLNX_WINOF/ulp/opensm/user/osmtest/main.c (revision 3519)
+++ D:/Windows/MLNX_WINOF/ulp/opensm/user/osmtest/main.c (revision 3520)
@@ -75,6 +75,140 @@
/**********************************************************************
**********************************************************************/
+ib_net64_t
+get_port_guid(
+ IN osmtest_t *p_osm, uint64_t port_guid,
+ IN boolean_t is_service)
+{
+ uint32_t i;
+ uint32_t choice = 0;
+ char junk[128];
+ boolean_t done_flag = FALSE;
+ ib_api_status_t status;
+ uint32_t num_ports = GUID_ARRAY_SIZE;
+ ib_port_attr_t attr_array[GUID_ARRAY_SIZE];
+
+ /*
+ Call the transport layer for a list of local port
+ GUID values.
+ */
+ status = osm_vendor_get_all_port_attr( p_osm->p_vendor, attr_array,
&num_ports );
+ if( status != IB_SUCCESS )
+ {
+ printf( "\nError from osm_vendor_get_all_port_attr (%x)\n",
status);
+ return( 0 );
+ }
+
+ /* if num_ports is 0 - return 0 */
+ if( num_ports == 0 )
+ {
+ printf( "\nNo local ports detected!\n" );
+ return( 0 );
+ }
+ /* If num_ports is 1, then there is only one possible port to use.
Use it. */
+ if ( num_ports == 1 )
+ {
+ printf("Using default GUID 0x%" PRIx64 "\n",
cl_hton64(attr_array[0].port_guid));
+ return( attr_array[0].port_guid );
+ }
+
+#if defined ( OSM_VENDOR_INTF_OPENIB )
+ /* If port_guid is 0, and this is gen2 - use the default port whose
info is in attr_array[0] */
+ if ( port_guid == 0 )
+ {
+ printf("Using default GUID 0x%" PRIx64 "\n",
cl_hton64(attr_array[0].port_guid));
+ return( attr_array[0].port_guid );
+ }
+#endif /* OSM_VENDOR_INTF_OPENIB */
+
+ /* If port_guid is 0, and we are in windows - find the first port
with link_state != DOWN and
+ use it as default port. */
+ if ( port_guid == 0 )
+ {
+ for ( i = 0; i < num_ports; i++ )
+ {
+ if (attr_array[i].link_state > IB_LINK_DOWN)
+ {
+ /* Use this port */
+ printf("Using default guid 0x%" PRIx64 "\n",
cl_hton64(attr_array[i].port_guid));
+ return( attr_array[i].port_guid );
+ }
+ }
+ /* If we are running as a service, and all ports are down we return
the
+ first port (we can't open a window, as a service)*/
+ if (is_service) {
+ return( attr_array[0].port_guid );
+ }
+ }
+
+ /* More than one possible port - list all ports and let the user to
choose. */
+ while( done_flag == FALSE )
+ {
+ printf( "\nChoose a local port number with which to bind:\n\n" );
+ /* If this is gen2 code - then port 0 has details of the default
port used.
+ no need to print it.
+ If this is not gen2 code - need to print details of all ports.
*/
+#if defined ( OSM_VENDOR_INTF_OPENIB )
+ for( i = 1; i < num_ports; i++ )
+ {
+ printf("\t%u: GUID = 0x%8" PRIx64 ", lid = 0x%04X, state = %s\n",
+ i, cl_ntoh64( attr_array[i].port_guid ),
+ attr_array[i].lid,
+ ib_get_port_state_str( attr_array[i].link_state ) );
+ }
+ printf( "\nEnter choice (1-%u): ", i-1 );
+# else
+ for( i = 0; i < num_ports; i++ )
+ {
+ /*
+ Print the index + 1 since by convention, port numbers
+ start with 1 on host channel adapters.
+ */
+
+ printf("\t%u: GUID = 0x%8" PRIx64 ", lid = 0x%04X, state = %s\n",
+ i+1, cl_ntoh64( attr_array[i].port_guid ),
+ attr_array[i].lid,
+ ib_get_port_state_str( attr_array[i].link_state ) );
+ }
+ printf( "\nEnter choice (1-%u): ", i );
+#endif /* OSM_VENDOR_INTF_OPENIB */
+
+ fflush( stdout );
+ if (scanf( "%u", &choice ))
+ {
+ /* If gen2 code - choice can be between 1 to num_ports-1
+ if not gen2 code - choice can be between 1 to num_ports */
+#if defined ( OSM_VENDOR_INTF_OPENIB )
+ if( choice >= num_ports )
+# else
+ if( choice > num_ports || choice < 1 )
+#endif /* OSM_VENDOR_INTF_OPENIB */
+ {
+ printf("\nError: Lame choice!\n");
+ fflush( stdin );
+ }
+ else
+ {
+ done_flag = TRUE;
+ }
+ }
+ else
+ {
+ /* get rid of the junk in the selection line */
+ scanf( "%s", junk );
+ printf("\nError: Lame choice!\n");
+ fflush( stdin );
+ }
+ }
+#if defined ( OSM_VENDOR_INTF_OPENIB )
+ printf("Choice guid=0x%8" PRIx64 "\n", cl_ntoh64(
attr_array[choice].port_guid ));
+ return( attr_array[choice].port_guid );
+# else
+ return( attr_array[choice - 1].port_guid );
+#endif /* OSM_VENDOR_INTF_OPENIB */
+}
+/**********************************************************************
+
**********************************************************************/
void show_usage(void);
void
@@ -513,9 +647,19 @@
}
/*
+ If the user didn't specify a GUID on the command line,
+ then get a port GUID value with which to bind.
+ */
+ if (guid == 0 && !(guid = get_port_guid(&osm_test, guid,1))) {
+ printf("\nError: port guid 0x%" PRIx64 " not found\n", guid);
+ goto Exit;
+ }
+
+ /*
* Guid may be zero going into this function if the user
* hasn't specified a binding port on the command line.
*/
+
status = osmtest_bind( &osm_test, (uint16_t)max_lid, guid );
if (status != IB_SUCCESS) exit(status);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20090210/f575e16b/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: osmtest.diff
Type: application/octet-stream
Size: 5388 bytes
Desc: osmtest.diff
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20090210/f575e16b/attachment.obj>
More information about the ofw
mailing list