[ofw] [Patch] [Tools][infiniband-diags] ibclearerrors tool
Irena Kruchkovsky
irena at mellanox.co.il
Wed Aug 4 00:03:40 PDT 2010
A tool imported from Linux.
The tool runs perfquery on all the nodes that appear in ibnetdiscover output or in a given topology file.
Usage:
ibclearerrors [-h] [<topology-file> | -C ca_name -P ca_port -t timeout_ms]
h - Help (displays this message)
<topology-file> - should be in the format indicated by ibnetdiscover
ca_name - the name indicated by ibstat
Index: D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors.c
===================================================================
--- D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors.c (revision 0)
+++ D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors.c (revision 6180)
@@ -0,0 +1,363 @@
+/*
+ * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses. You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif /* HAVE_CONFIG_H */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <windows.h>
+#include <strsafe.h>
+#include <infiniband/umad.h>
+#include <infiniband/mad.h>
+
+#include "ibdiag_common.h"
+
+#define X_PARAMLEN 254
+#define X_LINELEN 4096
+#define X_TEMPFILE "ibnetdiscoverTMP.txt"
+#define X_TEMPFILELEN 20
+
+
+
+static void ShowUsage()
+{
+ printf( "ibclearerrors [-h] [<topology-file>" \
+ "| -C ca_name -P ca_port -t timeout_ms]\n"
+ "\th\t\t - Help (displays this message)\n"
+ "\t<topology-file>\t - should be in the format indicated by ibnetdiscover\n"
+ "\tca_name\t\t - the name indicated by ibstat\n");
+ exit(1);
+}
+
+static void printCopyError(char* copiedVal, HRESULT hr)
+{
+ if (hr == ERROR_INSUFFICIENT_BUFFER)
+ {
+ printf("The %s length is too long %08x.\n", copiedVal, hr);
+ }
+ else
+ {
+ printf("Error in getting the %s %08x.\n", copiedVal, hr);
+ }
+ exit(-1);
+}
+
+static int clearErrors(char* caInfo, char* lid, char* port, BOOL all)
+{
+ char usedCommand [ X_LINELEN ];
+ HRESULT hr;
+
+ if ((caInfo == NULL) ||
+ (lid == NULL) || (strlen(lid) <= 0)||
+ (port == NULL) || (strlen(port) <= 0))
+ {
+ return 1;
+ }
+
+ hr = StringCchPrintfEx(usedCommand,X_LINELEN,NULL,NULL,0,
+ "perfquery %s -R %s %s %s 0x0fff",
+ caInfo,
+ (all ? "-a" : ""),
+ lid,
+ port);
+ if (FAILED(hr))
+ {
+ StringCchPrintfEx(usedCommand,X_LINELEN,NULL,NULL,0,"used Command");
+ printCopyError(usedCommand,hr);
+ }
+
+ if (system(usedCommand))
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+static char* getLid(char* line, char* lidPrefix)
+{
+ //
+ //Get lid start position
+ //
+ char* lidStart = strstr(line, lidPrefix) + strlen(lidPrefix);
+
+ //
+ //Get the string from lidStart until the first position of a blank = exactly the lid
+ //
+ char* lid = strtok (lidStart," \t");
+
+ return lid;
+}
+
+int __cdecl main(int argc, char* argv[])
+{
+ char topofile[X_PARAMLEN];
+ BOOL topologyGiven = 0;
+
+ char caInfo[X_LINELEN];
+ BOOL caInfoGiven = 0;
+
+ int nodes = 0;
+ int errors = 0;
+
+ FILE *fp;
+ char line[X_LINELEN];
+ char templine[X_LINELEN];
+
+ int i;
+
+ char type[10];
+ char usedCommand[X_LINELEN];
+
+ HRESULT hr;
+
+ topofile[0] = '\0';
+
+ for( i = 1; i < argc; i++ )
+ {
+ char* pArg;
+ char* nextArg;
+
+ pArg = argv[i];
+
+ if (( *pArg != '-' ) && ( *pArg != '/' ))
+ {
+ if (strlen(topofile) == 0)
+ {
+ hr = HRESULT_CODE(StringCchCopyNExA(topofile,X_PARAMLEN,pArg,X_PARAMLEN,NULL,NULL,0));
+ if (FAILED(hr))
+ {
+ StringCchPrintfEx(topofile,X_PARAMLEN,NULL,NULL,0,"topofile");
+ printCopyError(topofile,hr);
+ }
+ topologyGiven = 1;
+ continue;
+ }
+ else
+ {
+ ShowUsage();
+ break;
+ }
+ }
+
+
+ // Skip leading dashes
+ while(( *pArg == '-' ) || ( *pArg == '/' ))
+ pArg++;
+
+ switch( *pArg )
+ {
+ case 'h':
+ case '?':
+ ShowUsage();
+ break;
+ case 'P':
+ case 'C':
+ case 't':
+ if( ++i == argc )
+ {
+ ShowUsage();
+ break;
+ }
+
+ nextArg = argv[i];
+ if( *nextArg == '-' )
+ {
+ ShowUsage();
+ break;
+ }
+
+ if (!caInfoGiven)
+ {
+ StringCchPrintfEx(caInfo,X_LINELEN,NULL,NULL,0,"");
+ }
+
+ hr = StringCchPrintfEx( caInfo,X_LINELEN,NULL,NULL,0,
+ "%s -%s %s",caInfo,pArg,nextArg);
+ if (FAILED(hr))
+ {
+ StringCchPrintfEx(caInfo,X_LINELEN,NULL,NULL,0,"caInfo");
+ printCopyError(caInfo,hr);
+ }
+
+ caInfoGiven = 1;
+ break;
+ default:
+ printf( "Unknown parameter %s\n", pArg );
+ ShowUsage();
+ }
+ }
+
+ //
+ // If a topology file was not given we will create one
+ //
+ if (!topologyGiven)
+ {
+ DWORD nPathLength = X_LINELEN+X_TEMPFILELEN;
+ char path[X_LINELEN+X_TEMPFILELEN];
+ int reqLen = GetTempPath(nPathLength, path);
+ if (reqLen > X_LINELEN)
+ {
+ printf("Obtaining a path to create temporary files failed\n");
+ exit(-1);
+ }
+
+ hr = StringCchPrintfEx( topofile,X_LINELEN,NULL,NULL,0,
+ "%s%s", path, X_TEMPFILE);
+ if (FAILED(hr))
+ {
+ StringCchPrintfEx(topofile,X_LINELEN,NULL,NULL,0,"topofile");
+ printCopyError(topofile,hr);
+ }
+
+ hr = StringCchPrintfEx( usedCommand,X_LINELEN,NULL,NULL,0,
+ "ibnetdiscover %s > %s",
+ caInfoGiven ? caInfo : "",
+ topofile );
+ if (FAILED(hr))
+ {
+ StringCchPrintfEx(usedCommand,X_LINELEN,NULL,NULL,0,"used Command");
+ printCopyError(usedCommand,hr);
+ }
+
+ if (system(usedCommand))
+ {
+ printf("ibnetdiscover execution failed (%d)\n", GetLastError() );
+ exit(1);
+ }
+ }
+
+ fp=fopen(topofile, "r");
+ if(fp == NULL)
+ {
+ printf("Cannot open file.\n");
+ exit(1);
+ }
+
+ while (fgets(line, X_LINELEN, fp) != NULL)
+ {
+ if (strstr( line, "Ca" ) == line ||
+ strstr( line, "Rt" ) == line ||
+ strstr( line, "Switch" ) == line)
+ {
+ nodes++;
+
+ //
+ //First word is the type (one of the above)
+ //
+ hr = HRESULT_CODE(StringCchCopyNExA(templine,X_LINELEN,line,X_LINELEN,NULL,NULL,0));
+ if (FAILED(hr))
+ {
+ StringCchPrintfEx(templine,X_LINELEN,NULL,NULL,0,"inner topology line");
+ printCopyError(templine,hr);
+ }
+
+ hr = HRESULT_CODE(StringCchCopyNExA(type,10,strtok (templine," \t"),10,NULL,NULL,0));
+ if (FAILED(hr))
+ {
+ StringCchPrintfEx(type,10,NULL,NULL,0,"type");
+ printCopyError(type,hr);
+ }
+
+ }
+
+
+ if (strstr( line, "Switch" ) == line)
+ {
+ errors += clearErrors( caInfoGiven ? caInfo : "",
+ getLid(line,"port 0 lid "),
+ "255",
+ 1 );
+ }
+
+ if (*line == '[')
+ {
+ char* port;
+
+ hr = HRESULT_CODE(StringCchCopyNExA(templine,X_LINELEN,line,X_LINELEN,NULL,NULL,0));
+ if (FAILED(hr))
+ {
+ StringCchPrintfEx(templine,X_LINELEN,NULL,NULL,0,"inner topology line");
+ printCopyError(templine,hr);
+ }
+
+ port = strtok (templine,"[]"); //First word is the port in []
+
+ if (strcmp(type,"Switch") != 0) //Got it from the previous line
+ {
+ errors += clearErrors( caInfoGiven ? caInfo : "",
+ getLid(line," lid "),
+ port,
+ 0 );
+ }
+ }
+
+ if (strstr( line, "ib" ) == line)
+ {
+ printf("%s\n", line);
+ }
+ }
+
+ printf ("\n## Summary: %d nodes cleared %d errors\n", nodes, errors);
+ fclose (fp);
+
+ //
+ // If we created our own topology file - we sould delete it
+ //
+ if (strstr( topofile, X_TEMPFILE ))
+ {
+ hr = StringCchPrintfEx( usedCommand,X_LINELEN,NULL,NULL,0, "del %s", topofile );
+ if (FAILED(hr))
+ {
+ StringCchPrintfEx(usedCommand,X_LINELEN,NULL,NULL,0,"used Command");
+ printCopyError(usedCommand,hr);
+ }
+
+ if (system(usedCommand))
+ {
+ printf("Temporary file cleanup failed\n");
+ exit(1);
+ }
+ }
+
+ return 0;
+}
+
+
+
+
Index: D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/ibclearerrors.rc
===================================================================
--- D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/ibclearerrors.rc (revision 0)
+++ D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/ibclearerrors.rc (revision 6180)
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2009 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under the OpenIB.org BSD license
+ * below:
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * $Id$
+ */
+
+
+#include <oib_ver.h>
+
+#define VER_FILETYPE VFT_APP
+#define VER_FILESUBTYPE VFT2_UNKNOWN
+
+#ifdef DBG
+#define VER_FILEDESCRIPTION_STR "InfiniBand Fabric Clear Errors(Debug)"
+#else
+#define VER_FILEDESCRIPTION_STR "InfiniBand Fabric Clear Errors"
+#endif
+
+#define VER_INTERNALNAME_STR "ibclearerrors.exe"
+#define VER_ORIGINALFILENAME_STR "ibclearerrors.exe"
+
+#include <common.ver>
Index: D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/SOURCES
===================================================================
--- D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/SOURCES (revision 0)
+++ D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/SOURCES (revision 6180)
@@ -0,0 +1,31 @@
+TARGETNAME = ibclearerrors
+TARGETPATH = ..\..\..\..\bin\user\obj$(BUILD_ALT_DIR)
+TARGETTYPE = PROGRAM
+
+UMTYPE = console
+UMENTRY = main
+
+USE_MSVCRT = 1
+
+SOURCES = ..\ibclearerrors.c ibclearerrors.rc
+
+INCLUDES = ..\..\include;..\..\include\windows;\
+ ..\..\..\..\ulp\libibmad\include;\
+ ..\..\..\..\ulp\libibumad\include;\
+ ..\..\..\..\inc;..\..\..\..\inc\user;\
+ ..\..\..\..\inc\user\linux;
+
+C_DEFINES = $(C_DEFINES) /DHAVE_CONFIG_H
+
+TARGETLIBS = \
+ $(SDK_LIB_PATH)\kernel32.lib \
+ $(SDK_LIB_PATH)\ws2_32.lib \
+!if $(FREEBUILD)
+ $(TARGETPATH)\*\libibmad.lib \
+ $(TARGETPATH)\*\libibumad.lib
+!else
+ $(TARGETPATH)\*\libibmadd.lib \
+ $(TARGETPATH)\*\libibumadd.lib
+!endif
+
+MSC_WARNING_LEVEL = /W3 /WX /wd4007
Index: D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/makefile
===================================================================
--- D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/makefile (revision 0)
+++ D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/makefile (revision 6180)
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the driver components of the OpenIB Windows project.
+#
+
+!INCLUDE ..\..\..\..\inc\openib.def
Index: D:/Windows/MLNX_VPI/tools/infiniband-diags/src/dirs
===================================================================
--- D:/Windows/MLNX_VPI/tools/infiniband-diags/src/dirs (revision 6179)
+++ D:/Windows/MLNX_VPI/tools/infiniband-diags/src/dirs (revision 6180)
@@ -16,4 +16,5 @@
sminfo \
smpdump \
smpquery \
- vendstat
\ No newline at end of file
+ vendstat \
+ ibclearerrors
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20100804/80673b11/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ibclearerrors.patch
Type: application/octet-stream
Size: 13530 bytes
Desc: ibclearerrors.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20100804/80673b11/attachment.obj>
More information about the ofw
mailing list