<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML xmlns="http://www.w3.org/TR/REC-html40" xmlns:v =
"urn:schemas-microsoft-com:vml" xmlns:o =
"urn:schemas-microsoft-com:office:office" xmlns:w =
"urn:schemas-microsoft-com:office:word" xmlns:m =
"http://schemas.microsoft.com/office/2004/12/omml"><HEAD>
<META content="text/html; charset=us-ascii" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.18928">
<STYLE>@font-face {
font-family: Cambria Math;
}
@font-face {
font-family: Calibri;
}
@page WordSection1 {size: 8.5in 11.0in; margin: 1.0in 1.0in 1.0in 1.0in; }
P.MsoNormal {
MARGIN: 0in 0in 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
LI.MsoNormal {
MARGIN: 0in 0in 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
DIV.MsoNormal {
MARGIN: 0in 0in 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
A:link {
COLOR: blue; TEXT-DECORATION: underline; mso-style-priority: 99
}
SPAN.MsoHyperlink {
COLOR: blue; TEXT-DECORATION: underline; mso-style-priority: 99
}
A:visited {
COLOR: purple; TEXT-DECORATION: underline; mso-style-priority: 99
}
SPAN.MsoHyperlinkFollowed {
COLOR: purple; TEXT-DECORATION: underline; mso-style-priority: 99
}
SPAN.EmailStyle17 {
FONT-FAMILY: "Calibri","sans-serif"; COLOR: windowtext; mso-style-type: personal-compose
}
.MsoChpDefault {
mso-style-type: export-only
}
DIV.WordSection1 {
page: WordSection1
}
</STYLE>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></HEAD>
<BODY lang=EN-US link=blue vLink=purple>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial>Hello,</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial> Sean Hefty is the maintainer of the IB Diags code; he
is currently on vacation. </FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial>All the corner cases look to be covered, I would recommend you
SVN commit this.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial>Sean likes to keep the Windows source as 'close' as possible
to the Linux source to ease the burden when updating source
files.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial>Things like '__cdecl' for x86 are Windows only constructs and
Sean likes to handle these with a patch.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial>When Sean returns the two of you can work out the minor
details.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial>stan.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=709192516-04082010><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV><BR>
<DIV dir=ltr lang=en-us class=OutlookMessageHeader align=left>
<HR tabIndex=-1>
<FONT size=2 face=Tahoma><B>From:</B> ofw-bounces@lists.openfabrics.org
[mailto:ofw-bounces@lists.openfabrics.org] <B>On Behalf Of </B>Irena
Kruchkovsky<BR><B>Sent:</B> Wednesday, August 04, 2010 12:04 AM<BR><B>To:</B>
ofw@lists.openfabrics.org<BR><B>Subject:</B> [ofw] [Patch]
[Tools][infiniband-diags] ibclearerrors tool<BR></FONT><BR></DIV>
<DIV></DIV>
<DIV class=WordSection1>
<P class=MsoNormal>A tool imported from Linux.<o:p></o:p></P>
<P class=MsoNormal>The tool runs perfquery on all the nodes that appear in
ibnetdiscover output or in a given topology file. <o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>Usage:<o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>ibclearerrors [-h] [<topology-file> | -C ca_name -P
ca_port -t timeout_ms]<o:p></o:p></P>
<P style="TEXT-INDENT: 0.5in" class=MsoNormal>h - Help (displays this
message)<o:p></o:p></P>
<P class=MsoNormal>
<topology-file> - should be in
the format indicated by ibnetdiscover<o:p></o:p></P>
<P class=MsoNormal>
ca_name - the name indicated by
ibstat<o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>Index:
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors.c<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors.c
(revision 0)<o:p></o:p></P>
<P class=MsoNormal>+++
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors.c (revision
6180)<o:p></o:p></P>
<P class=MsoNormal>@@ -0,0 +1,363 @@<o:p></o:p></P>
<P class=MsoNormal>+/*<o:p></o:p></P>
<P class=MsoNormal>+ * Copyright (c) 2004-2008 Voltaire Inc. All rights
reserved.<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * This software is available to you under a choice of one
of two<o:p></o:p></P>
<P class=MsoNormal>+ * licenses. You may choose to be licensed under the
terms of the GNU<o:p></o:p></P>
<P class=MsoNormal>+ * General Public License (GPL) Version 2, available from
the file<o:p></o:p></P>
<P class=MsoNormal>+ * COPYING in the main directory of this source tree, or
the<o:p></o:p></P>
<P class=MsoNormal>+ * OpenIB.org BSD license below:<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * Redistribution and use in source
and binary forms, with or<o:p></o:p></P>
<P class=MsoNormal>+ * without modification, are
permitted provided that the following<o:p></o:p></P>
<P class=MsoNormal>+ * conditions are
met:<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * - Redistributions of source
code must retain the above<o:p></o:p></P>
<P class=MsoNormal>+ * copyright
notice, this list of conditions and the following<o:p></o:p></P>
<P class=MsoNormal>+ *
disclaimer.<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * - Redistributions in binary
form must reproduce the above<o:p></o:p></P>
<P class=MsoNormal>+ * copyright
notice, this list of conditions and the following<o:p></o:p></P>
<P class=MsoNormal>+ * disclaimer in
the documentation and/or other materials<o:p></o:p></P>
<P class=MsoNormal>+ * provided with
the distribution.<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND,<o:p></o:p></P>
<P class=MsoNormal>+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF<o:p></o:p></P>
<P class=MsoNormal>+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
AND<o:p></o:p></P>
<P class=MsoNormal>+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS<o:p></o:p></P>
<P class=MsoNormal>+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN<o:p></o:p></P>
<P class=MsoNormal>+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN<o:p></o:p></P>
<P class=MsoNormal>+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE<o:p></o:p></P>
<P class=MsoNormal>+ * SOFTWARE.<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+#if HAVE_CONFIG_H<o:p></o:p></P>
<P class=MsoNormal>+# include <config.h><o:p></o:p></P>
<P
class=MsoNormal>+#endif
/* HAVE_CONFIG_H */<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+#include <stdio.h><o:p></o:p></P>
<P class=MsoNormal>+#include <stdlib.h><o:p></o:p></P>
<P class=MsoNormal>+#include <string.h><o:p></o:p></P>
<P class=MsoNormal>+#include <windows.h><o:p></o:p></P>
<P class=MsoNormal>+#include <strsafe.h><o:p></o:p></P>
<P class=MsoNormal>+#include <infiniband/umad.h><o:p></o:p></P>
<P class=MsoNormal>+#include <infiniband/mad.h><o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+#include "ibdiag_common.h"<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+#define X_PARAMLEN 254<o:p></o:p></P>
<P class=MsoNormal>+#define X_LINELEN 4096<o:p></o:p></P>
<P class=MsoNormal>+#define X_TEMPFILE "ibnetdiscoverTMP.txt"<o:p></o:p></P>
<P class=MsoNormal>+#define X_TEMPFILELEN 20<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+static void ShowUsage()<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P class=MsoNormal>+ printf( "ibclearerrors [-h]
[<topology-file>" \<o:p></o:p></P>
<P
class=MsoNormal>+
"| -C ca_name -P ca_port -t timeout_ms]\n"<o:p></o:p></P>
<P class=MsoNormal>+ "\th\t\t - Help
(displays this message)\n"<o:p></o:p></P>
<P class=MsoNormal>+
"\t<topology-file>\t - should be in the format indicated by
ibnetdiscover\n"<o:p></o:p></P>
<P class=MsoNormal>+ "\tca_name\t\t -
the name indicated by ibstat\n");<o:p></o:p></P>
<P
class=MsoNormal>+
exit(1);<o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+static void printCopyError(char* copiedVal, HRESULT
hr)<o:p></o:p></P>
<P
class=MsoNormal>+{
<o:p></o:p></P>
<P
class=MsoNormal>+
if (hr == ERROR_INSUFFICIENT_BUFFER)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
printf("The %s length is too long %08x.\n", copiedVal, hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
printf("Error in getting the %s %08x.\n", copiedVal, hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
exit(-1);<o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+static int clearErrors(char* caInfo, char* lid, char* port,
BOOL all)<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P
class=MsoNormal>+
char usedCommand [ X_LINELEN ];<o:p></o:p></P>
<P
class=MsoNormal>+
HRESULT hr;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
if ((caInfo == NULL) || <o:p></o:p></P>
<P
class=MsoNormal>+
(lid == NULL) || (strlen(lid) <= 0)||<o:p></o:p></P>
<P
class=MsoNormal>+
(port == NULL) || (strlen(port) <= 0))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
return
1;
<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
hr = StringCchPrintfEx(usedCommand,X_LINELEN,NULL,NULL,0,<o:p></o:p></P>
<P
class=MsoNormal>+
"perfquery %s -R %s %s %s 0x0fff",<o:p></o:p></P>
<P
class=MsoNormal>+
caInfo,<o:p></o:p></P>
<P
class=MsoNormal>+
(all ? "-a" : ""),<o:p></o:p></P>
<P
class=MsoNormal>+
lid, <o:p></o:p></P>
<P
class=MsoNormal>+
port);<o:p></o:p></P>
<P
class=MsoNormal>+
if (FAILED(hr)) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(usedCommand,X_LINELEN,NULL,NULL,0,"used
Command");<o:p></o:p></P>
<P
class=MsoNormal>+
printCopyError(usedCommand,hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
if (system(usedCommand))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
return 1;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
return 0;<o:p></o:p></P>
<P
class=MsoNormal>+
}
<o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+static char* getLid(char* line, char* lidPrefix)
<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
//Get lid start position<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
char* lidStart = strstr(line, lidPrefix) + strlen(lidPrefix); <o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
//Get the string from lidStart until the first position of a blank = exactly the
lid<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
char* lid = strtok (lidStart," \t"); <o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
return lid;<o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+int __cdecl main(int argc, char* argv[])<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P
class=MsoNormal>+
char topofile[X_PARAMLEN];<o:p></o:p></P>
<P
class=MsoNormal>+
BOOL topologyGiven = 0;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
char caInfo[X_LINELEN];<o:p></o:p></P>
<P
class=MsoNormal>+
BOOL caInfoGiven = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
int nodes = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
int errors = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
FILE *fp;<o:p></o:p></P>
<P
class=MsoNormal>+
char line[X_LINELEN];<o:p></o:p></P>
<P
class=MsoNormal>+
char templine[X_LINELEN];<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
int i;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
char type[10];<o:p></o:p></P>
<P
class=MsoNormal>+
char usedCommand[X_LINELEN];<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
HRESULT hr;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
topofile[0] = '\0';<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
for( i = 1; i < argc; i++ )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ char*
pArg;<o:p></o:p></P>
<P
class=MsoNormal>+
char* nextArg;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+ pArg =
argv[i];<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
if (( *pArg != '-' ) && ( *pArg != '/' ))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
if (strlen(topofile) == 0) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
hr =
HRESULT_CODE(StringCchCopyNExA(topofile,X_PARAMLEN,pArg,X_PARAMLEN,NULL,NULL,0));<o:p></o:p></P>
<P
class=MsoNormal>+
if (FAILED(hr)) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(topofile,X_PARAMLEN,NULL,NULL,0,"topofile");<o:p></o:p></P>
<P
class=MsoNormal>+
printCopyError(topofile,hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
topologyGiven = 1;<o:p></o:p></P>
<P
class=MsoNormal>+
continue;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
ShowUsage();<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}
<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+ // Skip leading
dashes<o:p></o:p></P>
<P class=MsoNormal>+ while(( *pArg ==
'-' ) || ( *pArg == '/' ))<o:p></o:p></P>
<P
class=MsoNormal>+
pArg++;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+ switch( *pArg
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case
'h':<o:p></o:p></P>
<P
class=MsoNormal>+
case '?':<o:p></o:p></P>
<P
class=MsoNormal>+
ShowUsage();<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
case 'P':<o:p></o:p></P>
<P
class=MsoNormal>+
case 'C':<o:p></o:p></P>
<P
class=MsoNormal>+
case 't':<o:p></o:p></P>
<P
class=MsoNormal>+
if( ++i == argc )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
ShowUsage();<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
nextArg = argv[i];<o:p></o:p></P>
<P
class=MsoNormal>+
if( *nextArg == '-' )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
ShowUsage();<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
if (!caInfoGiven)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(caInfo,X_LINELEN,NULL,NULL,0,"");<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
hr = StringCchPrintfEx( caInfo,X_LINELEN,NULL,NULL,0,<o:p></o:p></P>
<P
class=MsoNormal>+
"%s -%s %s",caInfo,pArg,nextArg);<o:p></o:p></P>
<P
class=MsoNormal>+
if (FAILED(hr)) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(caInfo,X_LINELEN,NULL,NULL,0,"caInfo");<o:p></o:p></P>
<P
class=MsoNormal>+
printCopyError(caInfo,hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
caInfoGiven = 1;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+
default:<o:p></o:p></P>
<P
class=MsoNormal>+
printf( "Unknown parameter %s\n", pArg );<o:p></o:p></P>
<P
class=MsoNormal>+
ShowUsage();<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
// If a topology file was not given we will create one<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
if (!topologyGiven)<o:p></o:p></P>
<P
class=MsoNormal>+
{
<o:p></o:p></P>
<P
class=MsoNormal>+
DWORD nPathLength = X_LINELEN+X_TEMPFILELEN;<o:p></o:p></P>
<P
class=MsoNormal>+
char path[X_LINELEN+X_TEMPFILELEN];<o:p></o:p></P>
<P
class=MsoNormal>+
int reqLen = GetTempPath(nPathLength, path);<o:p></o:p></P>
<P
class=MsoNormal>+
if (reqLen > X_LINELEN)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
printf("Obtaining a path to create temporary files failed\n");<o:p></o:p></P>
<P
class=MsoNormal>+
exit(-1);<o:p></o:p></P>
<P
class=MsoNormal>+
}
<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
hr = StringCchPrintfEx( topofile,X_LINELEN,NULL,NULL,0,<o:p></o:p></P>
<P
class=MsoNormal>+
"%s%s", path, X_TEMPFILE);<o:p></o:p></P>
<P
class=MsoNormal>+
if (FAILED(hr)) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(topofile,X_LINELEN,NULL,NULL,0,"topofile");<o:p></o:p></P>
<P
class=MsoNormal>+
printCopyError(topofile,hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
hr = StringCchPrintfEx( usedCommand,X_LINELEN,NULL,NULL,0,<o:p></o:p></P>
<P
class=MsoNormal>+
"ibnetdiscover %s > %s", <o:p></o:p></P>
<P
class=MsoNormal>+
caInfoGiven ? caInfo : "", <o:p></o:p></P>
<P
class=MsoNormal>+
topofile );<o:p></o:p></P>
<P
class=MsoNormal>+
if (FAILED(hr)) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(usedCommand,X_LINELEN,NULL,NULL,0,"used
Command");<o:p></o:p></P>
<P
class=MsoNormal>+
printCopyError(usedCommand,hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
if (system(usedCommand))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
printf("ibnetdiscover execution failed (%d)\n", GetLastError() );<o:p></o:p></P>
<P
class=MsoNormal>+
exit(1);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
fp=fopen(topofile, "r");<o:p></o:p></P>
<P
class=MsoNormal>+
if(fp == NULL)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
printf("Cannot open file.\n");<o:p></o:p></P>
<P
class=MsoNormal>+
exit(1);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
while (fgets(line, X_LINELEN, fp) != NULL) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
if (strstr( line, "Ca" ) == line || <o:p></o:p></P>
<P
class=MsoNormal>+
strstr( line, "Rt" ) == line ||<o:p></o:p></P>
<P
class=MsoNormal>+
strstr( line, "Switch" ) == line)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
nodes++;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
//First word is the type (one of the above)<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
hr =
HRESULT_CODE(StringCchCopyNExA(templine,X_LINELEN,line,X_LINELEN,NULL,NULL,0));<o:p></o:p></P>
<P
class=MsoNormal>+
if (FAILED(hr)) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(templine,X_LINELEN,NULL,NULL,0,"inner topology
line");<o:p></o:p></P>
<P
class=MsoNormal>+
printCopyError(templine,hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
hr = HRESULT_CODE(StringCchCopyNExA(type,10,strtok (templine,"
\t"),10,NULL,NULL,0));<o:p></o:p></P>
<P
class=MsoNormal>+
if (FAILED(hr)) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(type,10,NULL,NULL,0,"type");<o:p></o:p></P>
<P
class=MsoNormal>+
printCopyError(type,hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
if (strstr( line, "Switch" ) == line)<o:p></o:p></P>
<P
class=MsoNormal>+
{
<o:p></o:p></P>
<P
class=MsoNormal>+
errors += clearErrors( caInfoGiven ? caInfo : "",
<o:p></o:p></P>
<P
class=MsoNormal>+
getLid(line,"port 0 lid "), <o:p></o:p></P>
<P
class=MsoNormal>+
"255", <o:p></o:p></P>
<P
class=MsoNormal>+
1 );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
if (*line == '[')<o:p></o:p></P>
<P
class=MsoNormal>+
{ <o:p></o:p></P>
<P
class=MsoNormal>+
char* port;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
hr =
HRESULT_CODE(StringCchCopyNExA(templine,X_LINELEN,line,X_LINELEN,NULL,NULL,0));<o:p></o:p></P>
<P
class=MsoNormal>+
if (FAILED(hr)) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(templine,X_LINELEN,NULL,NULL,0,"inner topology
line");<o:p></o:p></P>
<P
class=MsoNormal>+
printCopyError(templine,hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
port = strtok (templine,"[]"); //First word is the port in []<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
if (strcmp(type,"Switch") != 0) //Got it from the previous line<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
errors += clearErrors( caInfoGiven ? caInfo :
"",<o:p></o:p></P>
<P
class=MsoNormal>+
getLid(line," lid "),<o:p></o:p></P>
<P
class=MsoNormal>+
port,<o:p></o:p></P>
<P
class=MsoNormal>+
0 );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
if (strstr( line, "ib" ) == line)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
printf("%s\n", line);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
printf ("\n## Summary: %d nodes cleared %d errors\n", nodes,
errors);<o:p></o:p></P>
<P
class=MsoNormal>+
fclose (fp);<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
// If we created our own topology file - we sould delete it<o:p></o:p></P>
<P
class=MsoNormal>+
//<o:p></o:p></P>
<P
class=MsoNormal>+
if (strstr( topofile, X_TEMPFILE ))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
hr = StringCchPrintfEx( usedCommand,X_LINELEN,NULL,NULL,0, "del %s",
topofile );<o:p></o:p></P>
<P
class=MsoNormal>+
if (FAILED(hr)) <o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
StringCchPrintfEx(usedCommand,X_LINELEN,NULL,NULL,0,"used
Command");<o:p></o:p></P>
<P
class=MsoNormal>+
printCopyError(usedCommand,hr);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
if (system(usedCommand))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
printf("Temporary file cleanup failed\n");<o:p></o:p></P>
<P
class=MsoNormal>+
exit(1);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
return 0;<o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>Index:
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/ibclearerrors.rc<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/ibclearerrors.rc
(revision 0)<o:p></o:p></P>
<P class=MsoNormal>+++
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/ibclearerrors.rc
(revision 6180)<o:p></o:p></P>
<P class=MsoNormal>@@ -0,0 +1,47 @@<o:p></o:p></P>
<P class=MsoNormal>+/*<o:p></o:p></P>
<P class=MsoNormal>+ * Copyright (c) 2009 Intel Corporation. All rights
reserved.<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * This software is available to you under the OpenIB.org
BSD license<o:p></o:p></P>
<P class=MsoNormal>+ * below:<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * Redistribution and use in source
and binary forms, with or<o:p></o:p></P>
<P class=MsoNormal>+ * without modification, are
permitted provided that the following<o:p></o:p></P>
<P class=MsoNormal>+ * conditions are
met:<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * - Redistributions of source
code must retain the above<o:p></o:p></P>
<P class=MsoNormal>+ * copyright
notice, this list of conditions and the following<o:p></o:p></P>
<P class=MsoNormal>+ *
disclaimer.<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * - Redistributions in binary
form must reproduce the above<o:p></o:p></P>
<P class=MsoNormal>+ * copyright
notice, this list of conditions and the following<o:p></o:p></P>
<P class=MsoNormal>+ * disclaimer in
the documentation and/or other materials<o:p></o:p></P>
<P class=MsoNormal>+ * provided with
the distribution.<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND,<o:p></o:p></P>
<P class=MsoNormal>+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF<o:p></o:p></P>
<P class=MsoNormal>+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
AND<o:p></o:p></P>
<P class=MsoNormal>+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS<o:p></o:p></P>
<P class=MsoNormal>+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN<o:p></o:p></P>
<P class=MsoNormal>+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN<o:p></o:p></P>
<P class=MsoNormal>+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE<o:p></o:p></P>
<P class=MsoNormal>+ * SOFTWARE.<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * $Id$<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+#include <oib_ver.h><o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+#define
VER_FILETYPE
VFT_APP<o:p></o:p></P>
<P class=MsoNormal>+#define
VER_FILESUBTYPE
VFT2_UNKNOWN<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+#ifdef DBG<o:p></o:p></P>
<P class=MsoNormal>+#define VER_FILEDESCRIPTION_STR
"InfiniBand Fabric Clear Errors(Debug)"<o:p></o:p></P>
<P class=MsoNormal>+#else<o:p></o:p></P>
<P class=MsoNormal>+#define VER_FILEDESCRIPTION_STR
"InfiniBand Fabric Clear Errors"<o:p></o:p></P>
<P class=MsoNormal>+#endif<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+#define
VER_INTERNALNAME_STR
"ibclearerrors.exe"<o:p></o:p></P>
<P class=MsoNormal>+#define
VER_ORIGINALFILENAME_STR
"ibclearerrors.exe"<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+#include <common.ver><o:p></o:p></P>
<P class=MsoNormal>Index:
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/SOURCES<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/SOURCES
(revision 0)<o:p></o:p></P>
<P class=MsoNormal>+++
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/SOURCES
(revision 6180)<o:p></o:p></P>
<P class=MsoNormal>@@ -0,0 +1,31 @@<o:p></o:p></P>
<P class=MsoNormal>+TARGETNAME = ibclearerrors<o:p></o:p></P>
<P class=MsoNormal>+TARGETPATH =
..\..\..\..\bin\user\obj$(BUILD_ALT_DIR)<o:p></o:p></P>
<P class=MsoNormal>+TARGETTYPE = PROGRAM<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+UMTYPE = console<o:p></o:p></P>
<P class=MsoNormal>+UMENTRY = main<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+USE_MSVCRT = 1<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+SOURCES = ..\ibclearerrors.c ibclearerrors.rc<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+INCLUDES =
..\..\include;..\..\include\windows;\<o:p></o:p></P>
<P
class=MsoNormal>+
..\..\..\..\ulp\libibmad\include;\<o:p></o:p></P>
<P
class=MsoNormal>+
..\..\..\..\ulp\libibumad\include;\<o:p></o:p></P>
<P
class=MsoNormal>+
..\..\..\..\inc;..\..\..\..\inc\user;\<o:p></o:p></P>
<P
class=MsoNormal>+
..\..\..\..\inc\user\linux;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+C_DEFINES = $(C_DEFINES) /DHAVE_CONFIG_H<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+TARGETLIBS = \<o:p></o:p></P>
<P
class=MsoNormal>+
$(SDK_LIB_PATH)\kernel32.lib \<o:p></o:p></P>
<P
class=MsoNormal>+
$(SDK_LIB_PATH)\ws2_32.lib
\<o:p></o:p></P>
<P class=MsoNormal>+!if $(FREEBUILD)<o:p></o:p></P>
<P
class=MsoNormal>+
$(TARGETPATH)\*\libibmad.lib \<o:p></o:p></P>
<P
class=MsoNormal>+
$(TARGETPATH)\*\libibumad.lib
<o:p></o:p></P>
<P class=MsoNormal>+!else<o:p></o:p></P>
<P
class=MsoNormal>+
$(TARGETPATH)\*\libibmadd.lib
\<o:p></o:p></P>
<P
class=MsoNormal>+
$(TARGETPATH)\*\libibumadd.lib
<o:p></o:p></P>
<P class=MsoNormal>+!endif<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+MSC_WARNING_LEVEL = /W3 /WX /wd4007<o:p></o:p></P>
<P class=MsoNormal>Index:
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/makefile<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/makefile
(revision 0)<o:p></o:p></P>
<P class=MsoNormal>+++
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/ibclearerrors/makefile
(revision 6180)<o:p></o:p></P>
<P class=MsoNormal>@@ -0,0 +1,7 @@<o:p></o:p></P>
<P class=MsoNormal>+#<o:p></o:p></P>
<P class=MsoNormal>+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want
to add a new source<o:p></o:p></P>
<P class=MsoNormal>+# file to this component. This file merely indirects
to the real make file<o:p></o:p></P>
<P class=MsoNormal>+# that is shared by all the driver components of the OpenIB
Windows project.<o:p></o:p></P>
<P class=MsoNormal>+#<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+!INCLUDE ..\..\..\..\inc\openib.def<o:p></o:p></P>
<P class=MsoNormal>Index:
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/dirs<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/dirs
(revision 6179)<o:p></o:p></P>
<P class=MsoNormal>+++
D:/Windows/MLNX_VPI/tools/infiniband-diags/src/dirs
(revision 6180)<o:p></o:p></P>
<P class=MsoNormal>@@ -16,4 +16,5 @@<o:p></o:p></P>
<P
class=MsoNormal>
sminfo
\<o:p></o:p></P>
<P
class=MsoNormal>
smpdump
\<o:p></o:p></P>
<P
class=MsoNormal>
smpquery
\<o:p></o:p></P>
<P
class=MsoNormal>-
vendstat<o:p></o:p></P>
<P class=MsoNormal>\ No newline at end of file<o:p></o:p></P>
<P
class=MsoNormal>+
vendstat \<o:p></o:p></P>
<P class=MsoNormal>+
ibclearerrors<o:p></o:p></P>
<P class=MsoNormal>\ No newline at end of
file<o:p></o:p></P></DIV></BODY></HTML>